MS RFC 68:支持组合多层功能

日期

2011/02/10

作者

塔玛斯塞克勒斯

联系

gmail.com上的szekerest

状态

通过(2011-03-04实施)

版本

MAPServer 6

描述:这个RFC提出了一个创建新数据提供程序(connectionType=union)的实现,它提供了一个选项来表示一个层中多个层的特性。

1。概述

今天,您可以使用tileindex组合多个文件,但前提是它们具有相同的属性和描述。从理论上讲,能够有多个具有相似属性的源层,并且能够使用源列属性的一些兼容子集将它们组合成一个层(称为联合层),这样组合的层就可以被视为一个层。然后,在设置类样式和标签时,我们可以用与任何其他层相同的方式使用这个单层。此层还可以提供在根据配置群集支持时使用多个层的功能的选项。 MS RFC 69 .

2。建议的解决方案

此功能将作为单独的层数据提供程序(connectionType=union)实现。联合层将使用连接参数定义映射文件中的源层,如下所示:

LAYER
  CONNECTIONTYPE UNION
  CONNECTION "layer1,layer2,layer3" # reference to the source layers
  NAME "union-layer"
  PROCESSING "ITEMS=itemname1,itemname2,itemname3"
  ...
END
LAYER
  CONNECTIONTYPE OGR
  NAME layer1
  ...
END
LAYER
  CONNECTIONTYPE SHAPE
  NAME layer2
  ...
END
LAYER
  CONNECTIONTYPE SHAPE
  NAME layer3
  ...
END

新的层数据提供程序将按以下方式工作:

  1. 在layeropen中,它将打开连接参数指定的所有源层。

  2. 形状调用的层将委托给基础层,并为感兴趣的区域提供矩形。

  3. layerNextShape将遍历层,并为后续形状调用layerNextShape。层索引分配给返回形状的tileindex。如果我们完成从一个层中检索形状,我们就开始从下一个源层检索功能。

  4. layerGetShape将根据平铺索引标识层,然后调用此层的layerGetShape

联合层和源层必须具有相同的几何体类型,否则在layeropen调用中会生成错误。

2.1处理层属性(项)

通常,源层必须提供呈现联合层时所需的属性,但是基础数据可能包含其他属性,从原始源提取数据时不使用这些属性。当请求所有属性(在查询操作中)时,联合层将只提供一些聚合属性(如该功能所属的源层的层名或组名)。可以使用现有的项目处理选项手动覆盖项目集(并且可以公开更多属性)。在开发的这个阶段,驱动程序将公开以下附加属性:

  1. combine:source layer name-功能所属的源层的名称

  2. 组合:SourceLayerGroup-功能所属的源层组

2.2投影

建议使用联合层和源层的相同投影。然而,层提供者将支持在源层和联合层之间转换特征位置。

2.3处理类别和样式

我们可以通过指定类和样式,以与任何其他层相同的方式定义联合层的符号和标签。此外,我们还将支持联合层的样式项自动选项,如果我们希望以与源层相同的方式显示功能,这一点非常重要。如果基础数据源提供了样式项自动设置,那么源层也可以使用样式项自动设置。

2.4查询处理

驱动程序将创建(并操作)源层的副本,该副本允许在联合层打开之前保持底层打开。如果源层支持的话,这将提供单次传递查询。联合层上的查询的行为无论如何都与其他层相同。

三。实施细节

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

  1. 修改lexer以解释新的连接类型(union)。

  2. 实现包含联合层数据源代码的mapunion.c。

3.1受影响的文件

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

maplexer.l (maplexer.c)
mapserver.h
Makefile.vc
Makefile.in
mapunion.c (new)

3.2MapScript问题

这个新层的连接类型将在mapscript接口中公开。目前不考虑进一步的影响。

3.3向后兼容性问题

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

4。臭虫识别码

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

错误3674

5。投票历史

+来自史蒂文、丹尼尔、阿塞菲、佩里克列森、托马斯布、史蒂文、塔马斯