MS RFC 78:矢量场渲染(connectiontype uvgraster)

日期

2011/11/04

作者

艾伦布德罗

联系

地图齿轮网的Aboudreault

状态

2011-11-24通过。实施完成。

版本

地图服务器6.2

1。概述

这是添加在MapServer中呈现向量场层的能力的建议。例如,在气象学中,矢量场用于存储/显示风向和大小。

源是两个栅格数据带,一个带表示矢量的U分量,第二个带表示V分量。使用给定位置上的u,v值,我们可以计算旋转和大小,并使用该值绘制与大小成比例并指向现象方向(风、电流等)的箭头。

有关矢量字段的详细信息,请参阅:http://en.wikipedia.org/wiki/vector_field

可视化示例(用MapServer呈现):

../../_images/uv.png

2。建议的解决方案

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

由于数据源是栅格,因此可以使用所有栅格处理选项(例如重新采样)。经过一些测试,我们确定向量场的最佳结果(对于所有不同的缩放级别)是使用resample=average时的结果,除非在层定义中明确指定了另一种类型的重新采样,否则默认情况下,这将为UV层设置。

要渲染向量场层,我们需要使用以下选项在映射文件中定义一个层:

  • 将图层类型设置为“点”。

  • 将connectiontype设置为uvgraster。

  • 将数据设置为包含U/V标注栏的栅格文件。

  • 指定要用作U和V的两个标注栏。

  • 指定一个类以呈现点要素。

可选“处理”设置:

  • uv_spacing:间距只是要在向量场中显示的箭头之间的距离(以像素为单位)。默认值为32。

  • uv-size-scale:uv-size-scale用于将栅格的矢量长度(大小)转换为像素,以获得更好的渲染效果。默认值为1。

uvgraster层有4个属性绑定,可用于层定义和/或类表达式:

  • 【U】:原始U值

  • 【V】:原始V值

  • [紫外线角度]:矢量角度

  • [uv_length]:向量长度(用uv_size_scale选项值缩放)

层定义示例:

LAYER
 NAME "my_uv_layer"
 TYPE POINT
 STATUS DEFAULT
 CONNECTIONTYPE UVRASTER
 DATA /mnt/data/raster/grib/wind.grib2
 PROCESSING "BANDS=1,2"
 PROCESSING "UV_SPACING=40"
 PROCESSING "UV_SIZE_SCALE=0.2"
 CLASS
  STYLE
  ANGLE [uv_angle]
  SYMBOL "arrow"
  SIZE [uv_length]
  COLOR 255 0 0
  POSITION CC
  MINSIZE 5
 END
END

三。实施细节

在内部,UVRaster层将有自己的渲染器/驱动程序代码。它是一个混合层,因为它像普通栅格层一样读取栅格源,但所有其他功能的行为都像矢量层。可以使用whichshape、getshape等将层绘制为普通点层。

uvgraster图层的基本内部绘制过程:

  1. 调用whichshape():使用内部gdal函数读取栅格数据源,应用重采样和所有其他栅格选项,U,V像素结果存储在内部层结构中。

  2. getshape()被调用:遍历栅格像素,并返回用像素位置创建的shapeobj(点)。

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

3.1受影响的文件

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

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

3.2MapScript

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

3.4向后兼容性问题

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

4。臭虫识别码

5。投票历史

+1来自杰夫、奥利弗、阿塞法、佩里、弗兰克、丹尼尔、斯蒂芬、迈克尔、托马斯、汤姆和史蒂夫。