MS RFC 69:支持点图层中的特征聚类

日期

2011年2月19日

作者

塔玛斯塞克勒斯

联系

gmail.com上的szekerest

状态

通过(2011-03-04实施)

版本

MAPServer 6

描述:这个RFC提出了一个实现,根据其相对位置将多个特性从一个层集群到单个(聚合)特性。

1。概述

为了使地图在给定的视图上清晰可见,我们可能需要限制在相邻位置呈现的特征的数量,这些相邻位置通常会相互重叠。目前在MapServer中没有这样的机制,可以防止符号根据其相对位置重叠。在一个可行的解决方案中,我们应该提供按原样呈现孤立符号的功能,但是要为那些在特定比例上重叠的符号创建新的(集群)功能。根据http://trac.osgeo.org/mapserver/attachment/ticket/3700/cluster.png上的示例,构成集群的功能的数量显示在每个集群功能的标签中。

三。提议的来源

此功能将作为单独的层数据提供程序实现(在mapcluster.c中实现),此提供程序将在内部使用(在mslayeropen中调用)。可以为每种层类型指定群集参数,如下所示:

LAYER
  TYPE POINT
  CONNECTIONTYPE OGR
  NAME cluster
  CLUSTER
     MAXDISTANCE 20  # in pixels
     REGION ellipse  # can be rectangle or ellipse
     GROUP (expression)  # we can define an expression to create separate groups for each value
     FILTER (expression) # we can define a logical expression to specify the grouping condition
  END
  ...
END

我们还可以使用多个类来显示聚集的形状。上面引用的示例使用以下层定义:

LAYER
    CLUSTER
        MAXDISTANCE 50
        REGION "rectangle"
    END
    LABELITEM "Cluster:FeatureCount"
    CLASSITEM "zoomcode"

    CLASS
             TEMPLATE "query.html"
             STYLE
             SYMBOL "image4"
             END
             LABEL
                    ...
             END
             EXPRESSION "Cluster:Empty"
          END

      CLASS
             TEMPLATE "query.html"
             STYLE
             SYMBOL "image1"
             END
             LABEL
                    ...
             END
             EXPRESSION "5"
          END
          CLASS
             TEMPLATE "query.html"
             STYLE
             SYMBOL "image2"
             END
             LABEL
                    ...
             END
             EXPRESSION "4"
          END
          CLASS
             TEMPLATE "query.html"
             STYLE
             COLOR 0 0 255
             SYMBOL "image3"
             END
             LABEL
                    ...
             END
             EXPRESSION "3"
          END
          ...
  END

3.1实施的概念

在建议的解决方案中,根据集群选项的存在,mslayeropen将调用集群层提供程序的vtable方法,而不是原始vtable方法,如下所示:

if (layer->cluster.region)
  return msClusterLayerOpen(layer);

在msclusterlayerropen中,数据提供程序将重写vtable函数,以便后续的shapes/layernextshape/layerclose(以及其他一些)函数将由该提供程序处理,而不是由原始数据源处理。集群过程本身将在shapes调用的层中处理。这是从原始数据源中检索功能,然后缓存到本地群集数据库(存储在layerinfo中)的唯一位置。

集群过程本身将以以下方式实现:

  1. 对于每个特征,我们创建一个带有一些聚合属性(如特征计数、平均位置和方差)的暂定集群,这些特征被添加到一个定制的四叉树数据结构中,在搜索相邻形状时提供快速访问。

  2. 对于每个功能,我们将使用四叉树搜索在指定距离(clusterMaxDistance)和搜索形状(clusterRegion)内检索所有相邻形状(之前已检索到)。我们还将检查每个关系中的过滤器和组条件,在相关集群中,我们使用以下递归公式更新每个相交集群的特征计数(n)平均位置(avg)和方差(var):

n = n + 1
avg(n) = avg(n-1) * (n-1) / n + x(n) / n
var(n) = var(n-1) * (n-1) / n + pow2(x(n) - avg(n)) / (n-1)
  1. 在第二个回合中,我们根据特征计数和与初始位置和方差相关的平均位置偏移量来评估暂定集群。通过最小化位置偏移量和方差来确定最佳排序的集群。在这种方法中,将首先检索单个特性(等级为0)。

  2. 最佳排名的集群将添加到最终确定列表(在layerinfo中),最终确定的集群(以及相关功能)也将从四叉树中删除。

  3. 根据最终确定的特征,我们更新了四叉树中仍然存在的受影响簇的平均位置和方差。

  4. 从4开始重复,直到我们在四叉树中有了特性。

在layerNextShape中,功能是从最终确定列表中提供的,该列表将保留到打开层为止。在layerClose中,层的vtable将还原为原始方法(通过调用msInitializeVirtualTable)

3.2处理特征属性(项)

聚集层本身将提供以下聚合属性:

1)cluster:featureCount-集群形状中的功能计数1)cluster:group-集群的组值(对组表达式进行计算)

这些属性可用于配置功能的标签,也可用于表达式。集群层还支持从原始数据源获取更多属性,如层配置中所引用的那样。项目处理选项可用于根据用户偏好从源层指定其他属性。

如果我们检索原始属性,那么层提供者将只提供那些对于集群中的每个形状都相等的值。其他值设置为“cluster:empty”。将来,我们可能通过实现聚合函数来定义属性来扩展这个特性,比如min([attributename])或max([attributename])

3.3处理类别和样式

我们可以通过指定类和样式,以与任何其他层相同的方式定义集群层的符号和标签。StyleItem Auto在此阶段不受支持。

3.4查询处理

在查询操作中,聚集的功能被检索为具有在“项处理”选项中指定的属性集的单个形状。在层打开之前,集群特性一直保持不变,因此这个驱动程序提供了单次查询方法。

4。实施细节

为了实现此增强,应在MapServer代码库中进行以下更改:

  1. 修改lexer以包含新关键字

  2. 创建一个新的结构(clusterObj)来包含集群参数,并在mapfile.c中实现处理程序(initcluster、loadcluster、freecluster、writecluster)。

  3. 修改maplayer.c以根据集群参数的存在来调用msclusterlayerropen,并使mslayerwhichitems知道组和过滤器表达式

  4. 实现包含群集层数据提供程序代码的mapcluster.c

4.1受影响的文件

此RFC将修改/创建以下文件:

Makefile.vc
Makefile.in
maplayer.c (msLayerOpen and msLayerWhichItems)
mapfile.c, mapfile.h(for handling clusterObj)
mapcluster.c (the code of the new data provider)
cluster.i (SWIG interface file to expose clusterObj)
maplexer.l
mapserver.h

4.2MapScript问题

新对象(clusterObj)将公开给mapscript接口。

4.3向后兼容性问题

此更改提供了新的功能,没有考虑向后兼容性问题。

5.错误ID

这里可以找到RFC-69(包含实现代码)的票据。

臭虫37万

6。投票历史

+来自史蒂文、阿塞菲、托马斯布和塔马斯