MS RFC 37:MapServer空间参考改进和添加¶
- 作者
Howard Butler
- 联系方式
可在gmail.com上可查询相关信息
- 作者
Frank Warmerdam
- 联系方式
Pobox.com上可了解有关Warmerdam的更多信息
- 状态
草稿
目的¶
为MapServer提供直接从数据源本身设置投影信息的能力,以减轻处理用户坐标系信息的负担。这些改进将是可选的,不会干扰以前的投影定义方法。
MapServer中空间引用的历史¶
在许多标准中,MapServer的空间引用支持非常缺乏。尽管大多数数据源mapserver与描述所包含层的空间引用的支持交互,但mapserver历史上已将信息放到地板上或完全忽略了它。
MapServer的重投影机制关键在于图层的投影不同于地图的投影。在这种情况下,在绘制地图时,MapServer将图层的数据重投影到地图的空间参考。
定义¶
MapServer历史上使用了两种不同的方法来定义其数据的空间引用——epsg/esri代码的形式:
PROJECTION
"init=epsg:4326"
END
以及项目4格式定义:
PROJECTION
"proj=cea"
"lon_0=0"
"lat_ts=45"
"x_0=0"
"y_0=0"
"ellps=WGS84"
"units=m"
"no_defs"
END
OGR数据源还支持自动投影类型的形式,但它并没有被广泛宣传或规范化:
LAYER
CONNECTIONTYPE OGR
PROJECTION
"AUTO"
END
END
性能观察¶
MapServer当前的空间参考故事集中在两个方面——简单的描述和确保不必要的数据重投影不会发生。MapServer目前直接使用proj.4进行数据重投影,这是以proj.4格式定义坐标系的动力。对于那些希望获得最佳性能但仍需要数据重投影的人来说,必须以proj.4格式定义空间引用。
或者,mapserver空间引用的epsg/esri代码定义允许mapserver使用一个简单的基于文件的查找表将proj.4描述的查找卸载到proj.4本身。然而,这种机制目前是一个瓶颈,因为每次查找都需要遍历一个文件来匹配给定的标识符并返回proj.4定义。
注解
2009年初,由于在proj.4中添加了一个缓存机制,允许随后快速查找,这一惩罚得以减轻。
可用性¶
这两种机制的可用性对于用户来说可能是一场噩梦。首先,人们使用的大多数空间参考描述都是WKT类型——而不是项目4。虽然为具有已知epsg值的数据设置投影信息很简单,但是自定义投影或epsg数据库中通常不可用的投影要求用户以某种方式将其wkt转换为proj.4格式并将其粘贴到 Mapfile 中。
此外,https://spatialreference.org(和https://epsg.io/)的存在有助于缓解这种痛苦,但它最终是一种权宜之计,而不是解决问题的永久办法。从网站上绘制的地图上下载 Mapfile 中每个图层的空间参考并不实际。spatialreference.org(和https://epsg.io/)确实提供了一些转换实用程序,允许用户粘贴到WKT中并让它返回MapServer投影块,但这种方法仍然会给用户带来痛苦和痛苦。
规格特性¶
MapServer将继续像以前一样工作,用户可以通过在投影对象中使用auto关键字来选择自动投影支持,如下所示:
# Use the what the layer defines as the projection definition.
# This may not be available for all data sources or layer types
# (shapefile, SDE, OGR, etc.).
PROJECTION
AUTO
END
实施细节¶
重要的是要保留MapServer以前的空间引用定义行为。首先,大幅更改投影定义意味着大量不必要的 Mapfile 转换。其次,继续以proj.4格式定义空间引用是最有效的方法。
此RFC的实施将包括两个项目:
向层虚拟表中添加方法。
将添加其他方法,以便驱动程序能够从其原始投影描述类型(esri wkt、ogc wkt、proj.4等)转换为project.4,以便在projectionobj上进行设置。
投影将支持显式自动关键字
虚拟表方法¶
为了支持自动投影定义,驱动程序需要能够返回空间参考信息。MapServer的层插件架构提供了与MapServer层提供程序交互的机制,但目前还没有从提供程序返回空间引用信息的正规化方法。建议使用以下虚拟表成员:
int (*LayerGetAutoProjection)(layerObj *layer, projectionObj *projection)
其他方法¶
msogcwkt2projectionobj方法已经存在,但还需要添加更多的方法,以允许实现layerGetAutoProjection的驱动程序生成projectionobj。
msesriwkt2项目bj
msogcwkt2项目
受影响的文件¶
mapserver.h
mapfile.c
mapscript/swiginc/projection.i
maplayer.c
mapproject.h
mapproject.c
mapsde.c
mapogr.cpp
mapraster.c
mappostgis.c
.
.
.
向后兼容性问题¶
此RFC中描述的所有工作都将向MapServer提供可选功能,并且不期望出现向后兼容性问题。
文档¶
在将本文档中描述的方法和实践集成到常规MapServer文档框架之前,此RFC将作为该功能的主要文档。