MS RFC 2:使用WKT创建线条特征和/或形状

日期

2005/07/13

作者

史蒂夫·莱姆

联系

明尼苏达州第纳尔的史蒂夫·莱姆

状态

完整的

版本

MAPServer 4.8

描述:在mapscript中开发内联特性或形状可能有点麻烦。另一种选择是允许用户使用众所周知的文本格式定义功能。建议的解决方案将允许用户使用此格式:

  1. 在映射文件中

  2. 通过URL

  3. 通过mapscript

  4. 通过MapServer查询模板

我们不编写新的wkt解析器,而是提供对底层geos或ogr功能的访问来实现这一点。关于实际实施的说明如下。

受影响的文件

  • mapfile.h=>新常量,wkt

  • maplexer.l=>识别新常量

  • mapfile.c=>使用功能块(wkt)处理新的mapfile参数,并以类似的方式更新url解析

  • mapgeos.cpp=>包装geos wkt读/写代码

  • mapogr.cpp=>wrap ogr wkt读/写代码

  • mapprimitive.c=>包装geos和ogr wkt编写器/读取代码,这将是“公共”接口

  • c=>使用“-wkt”选项更新shpxy标记,以便输出形状的wkt版本。在这里放置可以让我们利用已经存在的投影支持,以及任何未来的选项(精简、缓冲区等)。

  • mapscript/swiginc/shape.i=>更新构造函数以传递wkt字符串并定义将输出wkt字符串的“toString”方法。类似的修改必须在php/mapscript中进行,在基于swig的接口之后进行模式化。

向后兼容性问题

不适用,新功能

实施细节

  • C API将采用以下形式:

shapeObj *msShapeFromWKT( const char * );
char *msShapeToWKT( shapeObj * );

这些代码与一些旧代码(例如mslayerNextShape())相反。但是,wktapi将在两个地方使用:1)mapscript和2)通过url或mapfiles创建内联功能。在这两种情况下,最好使用上述功能。

  • 在mapscript中,创建形状将采用重载构造函数的形式,例如:

    $shape=new shapeobj($mapscript::ms_shape_line);或$shape=new shapeobj(‘linestring(0 0,1 1,1 2)’);

  • 在mapscript中,towkt()方法将添加到shapeobj对象中。

  • WKT只是几何图形。属性、索引、tileindex、classindex和文本字段在wkt中不存在,必须设置为“其他地方”。

  • 在WKT中没有广泛支持或标准化的“测量”值方法,尽管折射确实支持“EWKT”。目前,假设WKT不会保留测量值。

  • 有一种定义良好的包含z坐标的方法,如果MapServer是在启用z和m支持的情况下构建的,则应该执行这些方法。

  • 开发将伴随一组测试。肖恩·吉利斯已经创建了一两个测试用例。

将shapeobj转换为wkt

  • ms_shape_point:如果numlines和numpoints是一个,那么这将转换为wkt中的点对象。如果有更多的点,将转换为多点对象。

  • ms_shape_line:如果numlines为1,则将其转换为linestring,否则将转换为多行。

  • Ms_Shape_Polygon:MapServer不跟踪形状中的内外环,因为GD的扫描线栅格化机制不需要这些信息。但是,当转换为WKT时,我们需要知道是有一个带孔的多边形,还是有多个多边形(多个外环)。如果numlines为1,则可以直接转换为polygon(),否则需要对环进行分析以识别外环,并将内环与其外环关联。如果存在多个外环,则会产生多多边形,否则会产生多边形。

  • ms_shape_null:这会导致wkt字符串为空。

将wkt转换为shapeobj

  • 点:转换为具有一个点和一条线的ms-shape-u点对象。

  • LineString:转换为一个带有一行的ms_-shape_-line对象。

  • 多边形:转换为一个ms_形状的多边形对象,外环有一条线,内环有一条线。

  • 多点:转换为一个具有一条线的ms-shape-u点对象,每条线一个点。

  • 多行字符串:转换为一个ms-shape-line对象,容器中的每个linestring对应一行。

  • 多重多边形:转换为一个ms_形状的多边形,每个多边形的每个环在生成的多边形对象中都是一条线。

  • geometrycollection:如果内容都兼容,则将其视为多点、多字符串或多多边形,否则引发异常。

臭虫识别码

https://github.com/MapServer/MapServer/issues/1466 (primary bug, addition entries for MapScript and OGR will follow)

投票历史

Steve Lime于2005年9月4日提出投票,结果为+4(3名无投票权成员)。

投票+1:Lime、Warmerdam、Morissette、Gillies

提案通过并将继续推进。