MS RFC 123:支持mapserver中的mapml输出

作者

丹尼尔·莫里塞特

联系

dmorissette@mapgears.com

状态

通过(2020-03-31)

最后更新

2020-03-31

版本

MapServer 8.0版

1。概述

在2019年部署Web映射站点的一种常见方法是使用Openlayers或传单作为导航界面在网页中嵌入JavaScript代码。如果通过javascript代码提供了正确的配置,那么这些javascript库可以与ogc wms和tile服务(以及其他ogc服务类型)交互。换句话说,映射内容、层列表、SRS、缩放级别、范围等被指定为javascript语句,然后由javascript库以Web浏览器本身无法“理解”的“自定义”方式呈现。

w3cmapsforhtml社区组正在努力定义一个(新的)“map”HTML元素,该元素将用于定义web页面中的地图内容,并由web浏览器以标准化的方式直接支持和呈现。所有这些都是通过建立现有的标准,如WMS、WFS和Tile服务来实现的。除了在web浏览器中对地图元素的编码和访问进行标准化之外,这种编码还旨在使地图内容更容易被web上的搜索机器人发现和索引。

规范草案可通过工作组获得,本RFC的目标是提供一个参考实现,以在实际的用例中测试规范草案,并促进其更广泛的使用。GeoServer也提供了类似的参考实现,我们将尽可能使这个实现与GeoServer实现保持一致。

该项目由加拿大自然资源局资助。

2。建议的解决方案

本RFC建议在MapServer中实现MapML输出,它包括两个部分:

  1. 为映射文件中的给定层生成<mapml>文档。这将作为特定于供应商的REQUEST=GetMapML扩展实现。

  2. 启用text/mapml作为WMS GetFeatureInfo请求的新INFO_格式,以及WFS GetFeature请求的新功能编码格式。

2.1构建/启用MAPML选项

如果启用了WMS支持,则默认情况下将启用MapML支持。可以在编译时使用以下CMake选项禁用它:

cmake。。-DWITH_MAPML=0

基本MapML支持不需要其他依赖项。

如果(可选)OGR MapML驱动程序可用,那么它将用于WMS GetFeatureInfo和WFS GetFeature响应中的增强文本/MapML输出(见下文第4.3节)。

2.2映射文件配置参数

由于MapML主要是一种引用OGC服务(WMS、WFS和tile服务)的机制,MapML实现自动利用现有的WMS和wfsmapfile配置参数来处理所服务的映射和层。

特别是,以下mapfile配置参数将影响MapML输出和行为:

  • ows_enable_requests :使用“*”或将“GetMapML”添加到请求列表中,以启用特定层的<mapml>输出(或在所有层的映射级别)

  • wms_getfeatureinfo_formatlist :将“text/mapml”添加到列表中,以对特定层启用文本/mapml格式的WMS GetFeatureInfo(或在映射级别为所有层启用)

  • wfs_getfeature_formatlist :将“text/mapml”添加到列表中,为特定层启用文本/mapml格式的WFS GetFeature(或在映射级别为所有层启用)

  • ows_srs :在ows_SRS(或wms_SRS/wfs_SRS)元数据中指定的SRS代码列表控制将为<MapML>输出启用的MapML投影代码
    • EPSG:3857启用MapML投影OSMTILE

    • EPSG:3978启用MapML投影图块

    • EPSG:5936启用MapML投影窗

    • EPSG:4326和CRS:84启用MapML投影WGS84

还将支持其他特定于mapml的metada条目:

  • mapml_wms_link_rel :其中一个是“平铺”或“图像”。控制WMS是将URL模板输出为<link rel=“image”…>还是<link rel=“tile”…>。默认为“图像”。

  • mapml_wms_image_format :可用于指定用于给定WMS层的首选图像格式(例如image/png、image/jpeg)

  • TBD:在最终实现过程中,可以根据需要添加其他元数据条目。

2.4特定于供应商的GetMapML请求

已将MapWFS/Server类型的“map/A/service”组合添加到MapWFS/Server的“新请求”中。需要有效的WMS映射文件,并且请求支持以下URL参数:

名字

R/O公司

价值

MAP

R

/path/to/mapfile.map

SERVICE

R

<mapml>响应应链接到的服务类型。
  • WMS:指向WMS GetMap、GetFeatureInfo等的链接

  • WFS:指向WFS GetFeature的链接

注意:对其他服务类型(如MapCache xyz/tms/wmts引用)的支持可以在以后添加

REQUEST

R

获取映射ML

LAYER

R

图层名

STYLE

O

WMS样式名称(默认情况下将使用空值)

PROJECTION

O

OSMTILE、CBMTILE、APSTILE或WGS84之一,如果未指定,则默认为OSMTILE(根据规范)

R/O:R=必需或O=可选

例子:

返回的MapML文档将包含请求的服务类型和层的URL模板以及所有必需的MapML<input>参数定义,以允许客户端查看器实现缩放/平移映射所需的逻辑,并在客户端自动生成新的GetMap(对于WMS)或GetFeature(对于WFS)。

备注

MapML规范没有定义GetMapML请求,因此这是一个特定于供应商的扩展,值得注意的是,在这个RFC中为GetMapML请求建议的行为与OGC Testbed 13中讨论的方法略有不同(https://docs.ogc.org/per/17-019.html)它需要客户端查看器为每个缩放/平移操作返回服务器以计算新的扩展数据块,并为每个操作返回一组静态图像或平铺URL。对于服务器来说,URL模板方法更容易实现,并将在查看器中产生更好的用户体验。

2.5 GetCapabilities更新

如果在映射文件中启用了MapML,则:
  • WMS GetCapabilities将包含对特定于供应商的GetMapML请求的引用,如果启用,text/mapml将作为GetFeatureInfo格式列出。

  • wfsgetcapabilities将包含对特定于供应商的GetMapML请求的引用,text/mapml将作为GetFeature格式列出。

2.6 MapML使用示例

在一个典型的用例中,web开发人员在一个web页面中包括一个<mm map>HTML元素,如下所示(本例使用了sleal polyfill查看器):

<html>
  <head>
    <title>MapServer MapML Demo</title>
    <meta charset='utf-8'>
    <script src="/mapml/viewer/bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
    <link rel="import" href="/mapml/viewer/bower_components/web-map/web-map.html">
    <style>
     * {margin: 0;padding: 0;}
     map { display: flexbox; height: 100vh;}
    </style>
  </head>
  <body>
    <mm-map is="web-map" projection="OSMTILE" zoom="5" lat="45" lon="-80" controls>
      <layer- label="MapServer Demo WMS" src="http://localhost/cgi-bin/mapserv?map=/path/to/test.map&service=WMS&request=GetMapML&layer=layer1&style=&projection=OSMTILE" checked></layer->
    </mm-map>
  </body>
</html>

上面<mm map>元素中<layer->的src属性链接到一个<mapml>文档,该文档定义了映射内容(层、投影、查询url等)以及浏览器应该如何与它们交互。

在WMS的情况下,MapServer响应SERVICE=WMS&REQUEST=GetMapML返回的<mapml>文档如下所示:

http://localhost/cgi-bin/mapserv?map=/path/to/test.map&service=WMS&request=GetMapML&layer=layer1&style=&projection=OSMTILE

<mapml>
<head>
<title>Demo WMS</title>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/mapml;projection=OSMTILE" />
</head>
<body>
  <extent units="OSMTILE">
    <input name="w" type="width" />
    <input name="h" type="height" />
    <input name="xmin" type="location" units="pcrs" position="top-left" axis="easting" min="-9.50126e+06" max="-7.57178e+06" />
    <input name="ymin" type="location" units="pcrs" position="bottom-left" axis="northing" min="5.00048e+06" max="6.17829e+06" />
    <input name="xmax" type="location" units="pcrs" position="top-right" axis="easting" min="-9.50126e+06" max="-7.57178e+06" />
    <input name="ymax" type="location" units="pcrs" position="top-left" axis="northing" min="5.00048e+06" max="6.17829e+06" />
    <link rel="image" tref="http://localhost/cgi-bin/mapserv?map=/path/to/test.map&amp;SERVICE=WMS&amp;REQUEST=GetMap&amp;FORMAT=image/png&amp;TRANSPARENT=TRUE&amp;VERSION=1.3.0&amp;LAYERS=layer1&amp;STYLES=&amp;WIDTH={w}&amp;HEIGHT={h}&amp;CRS=EPSG:3857&amp;BBOX={xmin},{ymin},{xmax},{ymax}&amp;m4h=t"/>
    <input name="i" type="location" axis="i" units="map" min="0.0" max="0.0" />
    <input name="j" type="location" axis="j" units="map" min="0.0" max="0.0" />
    <link rel="query" tref="http://localhost/cgi-bin/mapserv?map=/path/to/test.map&amp;SERVICE=WMS&amp;REQUEST=GetFeatureInfo&amp;INFO_FORMAT=text/mapml&amp;FEATURE_COUNT=1&amp;TRANSPARENT=TRUE&amp;VERSION=1.3.0&amp;LAYERS=layer1&amp;STYLES=&amp;QUERY_LAYERS=layer1&amp;WIDTH={w}&amp;HEIGHT={h}&amp;CRS=EPSG:3857&amp;BBOX={xmin},{ymin},{xmax},{ymax}&amp;x={i}&amp;y={j}&amp;m4h=t"/>
  </extent>
</body>
</mapml>

不要担心<mapml>文档的复杂性。它由MapServer自动生成并由查看器使用。它不是有意由人类产生的。

最后,当用户查询地图时,生成的WMS GetFeatureInfo或WFS GetFeature请求可以返回一个“text/mapml”功能集合响应,如下所示:

<mapml>
<head>
<title>GetFeatureInfo Results</title>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/mapml" />
</head>
<body>
  <extent />
    <feature id="pop_place.1696" class="pop_place">
      <properties>
        <table>
          <thead>
            <tr>
              <th role="columnheader" scope="col">Property Name</th>
              <th role="columnheader" scope="col">Property Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <th scope="row">pname_en</th>
              <td itemprop="pname_en">Ottawa</td>
            </tr>
          </tbody>
        </table>
      </properties>
    </feature>
</body>
</mapml>

三。实施细节

大多数MapML支持代码都在MapML.c中,钩子从mapwms.c和mapwfs.c调用它。

将添加一组msautotests来测试新特性。

4限制/注意事项

4.1 MapML查看器Polyfill

由于目前web浏览器中没有对MapML的直接支持,所以在web页面中使用MapML polyfill(基于说明书)是必需的。更多详细信息将在文档中提供。

4.2实验规范

这个参考实现应该被认为是实验性的,因为MapML规范本身仍然是w3cmapsforhtml社区组正在进行的工作。规范很可能会随着时间的推移而改变,直到正式版本被采用,在部署服务时应该记住这一点。

我们也鼓励您参与进来,并通过加入位于的Maps for HTML社区组来提供反馈社区www.tms4hl//

大多数实现都在一个mapml.c源文件中,因此如果这个扩展名不再使用或不受支持,那么在将来的版本中可以相对容易地将其从源代码库中删除。

4.3 WMS GetFeatureInfo和WFS GetFeature输出

在最初的实现中,WMS GetFeatureInfo查询将只生成一个基本的属性表响应,而不包含几何体,例如适合在地图上的弹出窗口中使用。

在第二个工作阶段,将实现OGR<mapml>驱动程序,一旦可用,MapServer将升级为使用此OGR驱动程序,以响应WMS GetFeatureinfo和WFS GetFeature请求,以将此OGR驱动程序用于文本/mapml要素集输出格式。这将引入对这个OGR驱动程序的依赖,以获得完整的特性集合支持,但是如果没有驱动程序,MapML代码的其余部分仍然可以工作。

5.向后兼容性问题

因为这是一个新特性,所以没有人预料到。

6。安全隐患

目前没有人预料到。

7。性能影响

预计不会对核心性能产生影响。

8。文档需求

将添加一个新的文档页面,概述各种MapML输出配置场景和参数(例如ogcwms服务器页面的样式)。

本课程还将提供一个循序渐进的例子,包括如何在服务器上部署传单查看器polyfill以及如何在网页中使用它。

9。票据ID和参考

10。投票历史

PSC成员EvenR、SethG、JeromeB、Michaels、JukkaR、TomK、JeffM、SteveL、DanielM以+1通过。