MS RFC 72:图层和标签级geomtransforms

日期

2011/06/27

作者

史蒂夫·莱姆

联系

com.net上的石灰

状态

草稿

版本

TBD

1。概述

MapServer6.0在StyleObjGeomTransform中引入了几何表达式的概念。例如,可以写:

STYLE
  GEOMTRANSFORM (buffer([shape], -5)
  ...
END

这将导致在使用给定样式呈现前对形状运行缓冲区操作。

这对某些制图效果很有用,但有两种限制:

  1. 它在像素空间中工作(例如,一旦特征从地图转换为图像坐标)

  2. 生成的形状只能与单个样式一起使用,因此创建缓冲功能的复杂呈现是不有效的。

  3. 无法查询转换的功能

  4. 结果形状不能用于任何标记操作

2。建议的解决方案

此RFC建议将geomtransforms扩展到层和标签上下文。基本上相同的关键字和语法将在其他对象中有效。

对于层,转换将应用于几何图形,因为它们是从数据源读取的,并且在任何绘图或查询操作之前。因此,对转换后的形状执行复杂的渲染会更有效。此外,结果形状也可以以一致的方式进行查询,因为转换将独立于正在绘制的地图(例如,比例、边界框等)。

对于标签,转换将在标签点计算之前应用,在像素坐标中非常类似于当前样式实现。这将允许标记多边形内边缘或在多边形内创建曲线标签等效果。

这些操作是计算密集型的,因此用户需要了解性能影响,但随着平铺成为标准,这就不再是一个问题。

三。实施细节

对于层,我建议对函数mslayerGetShape()和mslayerNextShape()添加一个检查,以便在返回形状之前有条件地应用geomstranForm。生成的形状将包含父级的所有属性。(注意:一个潜在的问题是,某些操作可能会影响用于通过mslayerwhichshapes()选择候选形状的边界框)。

对于标签,检查和转换将在mslayerDrawShape()函数中应用。

需要对逻辑表达式语法(mapparser.y)和表达式标记器进行一些小的更改。

3.1受影响的文件

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

mapfile.c (layer/label read/write)
mapdraw.c (update msDrawShape())
maplayer.c (update msLayerGetShape(), msLayerNextShape(), msLayerWhichItems() and msLayerGetTokens())
maplexer.l (add additional GEOS operators, in trunk only buffer and difference are currently implemented)
mapparser.y (extend the grammar)

3.2MapScript问题

这些只是表示bj的so函数,以获取/设置它们已经存在。

3.3安全问题

必须小心避免与变形形状的生产相关的内存泄漏。允许运行时替换是有意义的,就像使用层过滤器和类表达式一样。同样,需要验证模式。

3.4向后兼容性问题

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

4。臭虫识别码

没有指定。见相关票据3871。

5。投票历史

没有