MS RFC 85:矢量轮廓绘制(连接类型轮廓)

日期

2012-09-18

作者

艾伦布德罗

联系

地图齿轮网的Aboudreault

状态

采用

版本

MAPServer 6.4

1。概述

这是一个建议,添加从栅格源在MapServer中动态计算和渲染轮廓层的能力。该数据源是一组栅格数据,表示数字高程模型(DEM)。有关DEMS的更多信息,请访问:http://en.wikipedia.org/wiki/digital_elevation_model

现在已经可以使用标准矢量层渲染轮廓,但这需要使用gdal_轮廓进行额外的处理步骤,以便从栅格源预生成轮廓。另外,这也意味着gdal_轮廓文件管理等的一些开销。

2。建议的解决方案

这个RFC建议在MapServer中添加一个新的层类型:ConnectionType Contour。新的类型是混合层,它有一个栅格数据源作为输入,矢量特征作为输出。最初,只支持这些向量特征的线表示。

由于内部层的类型为Vector,因此将支持查询并对向量(而不是原始栅格源)进行操作。将来,我们可能会看到需要添加查询栅格源的查询模式,但这不包括在这个工作阶段中。

要渲染轮廓层,需要使用以下选项在 Mapfile 中定义一个层:

  • 将图层类型设置为线条。

  • 将ConnectionType设置为Contour。

  • 将数据设置为包含高程带的栅格文件。

  • 使用处理“带区”指定要用作高程的带区,与常规栅格相同。

  • 指定一个或多个类和样式以呈现线条特征。

处理设置:

这些选项应在层级别指定:

  • 等值线间隔:等值线之间的高程间隔

  • 轮廓级别:要提取的一个或多个“固定级别”的逗号分隔列表

  • 轮廓项目:为要放置高程的项目(属性)提供名称。(可选)

如果要使用与比例相关的轮廓间距,还可以在轮廓间距或轮廓级别值中提供显式的最小/最大比例度。这是通过在值或值列表中添加可选的“miscaledenom,maxscaledenom:”前缀来完成的。请参见下面的示例。

简单层定义示例:

LAYER NAME "my_contour_layer"
  TYPE LINE
  STATUS DEFAULT
  CONNECTIONTYPE CONTOUR
  DATA /mnt/data/raster/grib/dem.grib
  PROCESSING "BANDS=1"
  PROCESSING "CONTOUR_ITEM=elevation"
  PROCESSING "CONTOUR_INTERVAL=10"
  CLASS
    STYLE
      WIDTH 2
      COLOR 255 0 0
    END
  END
END #layer

具有比例相关轮廓范围的图层定义示例:

LAYER NAME "my_contour_layer"
  TYPE LINE
  STATUS DEFAULT
  CONNECTIONTYPE CONTOUR
  DATA /mnt/data/raster/grib/dem.grib
  PROCESSING "BANDS=1"
  PROCESSING "CONTOUR_ITEM=elevation"
  PROCESSING "CONTOUR_INTERVAL=0,25000:5" # interval of 5 for scales of 25000 or less
  PROCESSING "CONTOUR_INTERVAL=25000,500000:10" # interval of 10 for scales in the 25000 to 500000 range
  PROCESSING "CONTOUR_LEVELS=500000,0:10,25,50,100" # explicit list of levels for scales of 500000 and up
  LABELITEM "elevation"
  CLASS
    STYLE
      WIDTH 2
      COLOR 255 0 0
    END
    LABEL
      ...
    END
  END
END #layer

三。实施细节

在内部,轮廓层将有自己的渲染器/驱动程序代码。它是一个混合层,因为它读取栅格源并从中创建一个矢量数据集。它使用内部gdal函数gdalcontorGenerate()。所有其他函数的行为都像一个向量层。可以使用whichshape、getshape等绘制普通线条层。

轮廓层的基本内部绘制过程:

  1. 调用WhichShape():使用内部GDAL函数读取栅格数据源,将OGR数据集存储在内部层结构中。

  2. 调用getShape():遍历OGR数据集并返回shapeObj(Line)。

  3. mapserver像任何其他向量层一样绘制其线条特征。

有关GDAL轮廓生成算法的更多信息,请访问:https://gdal.org/api/gdal_alg.html#_CPPv419GDALContourGenerate15GDALRasterBandHddiPdidPvii16GDALProgressFuncPv

3.1 OGR输入驱动器

一旦使用gdal栅格/轮廓函数处理栅格源,将使用“内存”驱动程序在内部存储一个ogr数据源。由于mapserver已经有了一个ogr输入驱动程序,因此将使用它来避免不必要的代码复制和维护。内部将使用connectiontype=ms_ogr的layerobj呈现/查询向量功能。

使用“内存”驱动程序的OGR数据源不能重新打开,只能创建。msoglayeropen()函数将尝试打开数据集。在这种情况下,我们的数据源已经打开。为了解决这个小问题,将使用连接池API。

3.2再采样和再投影

将支持栅格重采样和图层重投影。这将通过以下两种方式之一完成:

  • 在栅格处理期间的gdal函数中。(重新取样+再注射)

  • 在MapServer中,就像其他向量层一样。(再投影)

3.3标记

由于层内部是线向量层,因此标签不受影响,将呈现为正常状态。

3.4瓷砖边界

在对gdalcontourgenerate算法进行了一些回顾之后,确定了线条的瓷砖边界应该适当匹配。所以这不应该是个问题,但必须进行测试。

3.5受影响的文件

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

mapserver.h/mapfile.c (Connection type CONTOUR support in the mapfile)
mapcontour.c (new file for the CONTOUR renderer)
maplayer.c (new layer type handling, virtual tables init etc.)
maplexer.l (add additional CONTOUR keyword)

3.6MapScript

没有任何mapscript绑定问题。与任何其他层一样,轮廓层在内部进行处理/渲染。

3.7向后兼容性问题

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

4。测验

将修改msautotest以添加与新层类型呈现和查询相关的一些测试。

5.错误ID

6。投票历史

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