MS RFC 37:MapServer空间参考改进和添加

作者

霍华德巴特勒

联系

位于gmail.com的Hobu.inc

作者

弗兰克·沃默丹

联系

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格式并将其粘贴到映射文件中。

此外,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以前的空间引用定义行为。首先,大幅更改投影定义意味着大量不必要的映射文件转换。其次,继续以proj.4格式定义空间引用是最有效的方法。

此RFC的实施将包括两个项目:

  1. 向层虚拟表中添加方法。

  2. 将添加其他方法,以便驱动程序能够从其原始投影描述类型(esri wkt、ogc wkt、proj.4等)转换为project.4,以便在projectionobj上进行设置。

  3. 投影将支持显式自动关键字

虚拟表方法

为了支持自动投影定义,驱动程序需要能够返回空间参考信息。MapServer的层插件架构提供了与MapServer层提供程序交互的机制,但目前还没有从提供程序返回空间引用信息的正规化方法。建议使用以下虚拟表成员:

int (*LayerGetAutoProjection)(layerObj *layer, projectionObj *projection)

其他方法

msogcwkt2projectionobj方法已经存在,但还需要添加更多的方法,以允许实现layerGetAutoProjection的驱动程序生成projectionobj。

  • msesriwkt2项目bj

  • msogcwkt2项目

驱动程序特定的实现

以下驱动程序将提供支持类型自动空间引用定义的实现:

  • 整形器

  • OGR

  • GDAL栅格

  • 空间数据

  • 邮政地理信息系统

受影响的文件

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将作为该功能的主要文档。