MS RFC 94:形状平滑

日期

2013/03/26

作者

艾伦布德罗

联系

地图齿轮网的Aboudreault

作者

丹尼尔·莫里塞特

联系

在mapgears.com的dmorissette

状态

通过并实施

版本

MAPServer 6.4

1。概述

这是在MapServer中添加平滑矢量层形状的功能的建议。

目前,没有任何方法可以平滑形状,并且它们会像在数据集中一样呈现出来。但是,平滑形状有助于获得更好的渲染效果。下面是一个不好的渲染示例(从轮廓层):

../../_images/no_smoothing.png

2。建议的解决方案

此RFC建议在MapServer中添加形状平滑。初始解将实现SIA算法:通过迭代平均平滑。要了解有关SIA技术的更多信息,请参阅http://www.ijcee.org/papers/501-p063.pdf。未来可能会实施更多的算法。平滑只是在图层和样式级别上提供的一个新的geomtransform函数。

要使用默认设置为图层启用平滑,只需设置geomtransform:

  • 风水转换(冰沙([形状])

平滑设置:

  • 平滑大小:算法使用的窗口大小(点数)。默认值为3。

  • 平滑迭代:算法的迭代次数。默认值为1。

  • 预处理:可选的预处理方法,在平滑之前向形状添加更多顶点,如下所述。

可以使用以下geomtransform传递这些可选参数:

  • 风水转换(冰沙( [形状] ,请 [smoothing_size] ,请 [smoothing_iteration] ,请 [预处理] ))

简单层定义示例:

LAYER NAME "my_layer"
  TYPE LINE
  STATUS DEFAULT
  DATA roads.shp
  GEOMTRANSFORM (smoothsia([shape], 3, 1))
  CLASS
    STYLE
      WIDTH 2
      COLOR 255 0 0
    END
  END

三。示例

下面是一些显示不同参数值结果的示例。

../../_images/smoothing1.png ../../_images/smoothing2.png

第四章。平滑结果因子

由于平滑算法是在X顶点的窗口(默认为3)上执行的,因此有一些因素可能会影响结果。

4.1数据集分辨率过高

如果试图平滑具有非常高分辨率的线(当前视图比例下顶点的高密度),则可能无法获得预期的结果,因为顶点对于平滑窗口大小而言过于密集。在这种情况下,您可能希望在平滑之前简化形状。您可以在单个geomtransform中组合平滑和简化。

  • geomtransform(平滑(simplifypt([形状],10)))

RFC 89: Layer Geomtransform 更多信息。以下是问题的可视化:

../../_images/smoothing_highres.png

4.2数据集分辨率过低

如果试图平滑顶点密度较低的长线,在某些情况下可能会在平滑过程中丢失形状的某些重要部分(例如锐角周围),则可能无法获得预期结果。可以通过启用预处理步骤在平滑之前沿直线添加中间顶点来改进结果。

此行为使用smoothsia()geomtransform的预处理参数中的“all”值进行控制:

  • 风水转换(冰沙( [形状] ,请 [smoothing_size] ,请 [smoothing_iteration] ,'全部')

此预处理将在平滑之前执行。它在每个原始顶点的每一侧添加2个中间顶点。如果我们真的需要用低分辨率数据保存形状的一般形状,这是很有用的。注意,这可能会影响渲染,因为输出中有更多的顶点。

以下是问题的可视化:

../../_images/smoothing_lowres.png

4.3曲线

预处理步骤可能不适用于所有情况,因为它会对平滑结果产生很大影响(可能会太大?)但是,如果没有它,你可能会注意到一些大曲线的不好平滑。请参见此示例:

../../_images/smoothing_curve1.png

您可以通过启用另一种类型的预处理来改进这一点:角度。这将在一些特定的地方添加基于角度检测的点来识别曲线。以下是如何启用它:

  • 风水转换(冰沙( [形状] ,请 [smoothing_size] ,请 [smoothing_iteration] ,'角度')

../../_images/smoothing_curve2.png

5。受影响的文件

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

mapserver.h
mapsmoothing.c (implementation of the smoothing code)
maplayer.c
mapparser.y (add additional geomtransform)

6。MapScript

没有任何mapscript绑定问题。平滑在内部作为geomtransform进行处理/渲染。

7。向后兼容性问题

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

8。测验

将修改msautotest以添加与新geomtransform相关的一些测试。

9。性能

我做了一个快速的性能测试:它由一个线条层(shapefile)组成,它绘制了一个具有2400个形状的1200x1200图像。数字是图层绘制时间。

  • 不平滑:0.224s

  • 平滑(大小:3,迭代:1):0.230s

  • 平滑(大小:5,迭代:1):0.225s

  • 平滑(大小:3,迭代:3):0.240s

  • 平滑(大小:3,迭代:1+预处理:全部):0.368s

  • 平滑(大小:3,迭代:1+预处理:角度):0.280s

10。投票历史

+来自汤姆、佩里、斯蒂芬、塔玛斯、斯蒂芬、丹尼尔、杰夫和迈克尔。