MS RFC 93:UTF网格支持

日期

2013/3/26

作者

史蒂夫·莱姆

联系

sdlime@comcast.net

作者

托马斯堡

联系

thomas.bonfort@gmail.com

作者

丹尼尔·莫里塞特

联系

dmorissette@mapgears.com

作者

迈克史密斯

联系

作者

弗朗索瓦·德贾莱亚斯

联系

fdesjarlais1@gmail.com

状态

采用

版本

MAPServer 7

1。概述

utfgrid是用于指定栅格交互数据的开放式解决方案。其目标是提供具有高度可扩展性的用户与栅格图的交互。这个RFC的目标是使mapserver能够生成utfgrid输出。

utfgrid编码方案以节省空间的方式对栅格图块的交互数据进行编码。它设计用于浏览器,例如,当鼠标悬停在地图图块的某些功能上时,显示工具提示。

由于速度较慢的浏览器和机器无法处理渲染用于在地图图块上绘制矢量的实际多边形,因此我们使用基于网格的方法存储每个像素的相关信息。utfgrid使用JSON作为容器格式。

完整的规范和交互式演示可从https://github.com/mapbox/utfgrid-spec获得。

2。建议的解决方案

这项工作将增加将utfgrids(json)作为普通映射绘制操作(即,通过cgi模式=map或wms getmap请求)输出的能力。

2.1呈现utfgrid

新的utfgrid呈现器,将使用agg库,使用无符号的int32画布将功能ID编码为它们的文本utf-8重新呈现。功能ID(从1开始)将在呈现功能时按顺序分配,对功能键的引用将作为呈现过程的一部分进行维护。将首先搜索功能键列表,以避免重复。定义一个代表一个主题属性的特征的键当然是合理的,例如人口年龄类,这将导致比每个特征特有的键小得多的输出。图层关键项由新的utfitem属性定义。

UTF渲染器将根据底层样式定义松散地绘制点、线和多边形。

Polygons: solid fill.
Lines: solid line with width. Patterns are not applied.
Points: rectangle based on the bounding box of the symbol will be used.

可以使用标签边界框绘制到地图的父要素ID(通过要素utfitem派生)来呈现标签。也可以选择网格的分辨率。分辨率越高,网格越小,因此会降低其重量,但也会降低其精度。这些是可通过输出格式启用的选项功能:

OUTPUTFORMAT
  NAME "myUTFGrid"
  DRIVER UTFGRID
  FORMATOPTION "LABELS=true"
  FORMATOPTION "UTFRESOLUTION=4"
  FORMATOPTION "DUPLICATES=false"
END

可能不希望删除重复的功能ID/密钥对,因为根据地图中的功能数量,该过程可能会很昂贵。格式选项duplicates=false可用于跳过此步骤。生成的JSON文件会大一点。

注意:由于即将对文本呈现进行更改,TrueType符号和标签呈现尚未实现,应在将来添加。

2.2暴露特性

添加了一个新的层元素(utfdata),允许使用与classobj->text类文本语法相同的mapserver表达式语法创建简单的JSON模板。utfdata是expressionobj类型。如果设置了utfitems,则utfdata将公开这些项,以便可以连接密钥和数据。

如果未设置utfitem,则使用顺序ID(基于呈现顺序)。

实例:

UTFITEM "fid"
UTFDATA "{\"id\":\"[fid]\", \"name\":\"[name]\", \"country\":\"[country_code]\", \"area\":\"[area]\"}"
# no UTFITEM
UTFDATA "{\"name\":\"[name]\", \"country\":\"[country_code]\", \"area\":\"[area]\"}"

如果没有提供utfdata,那么除了utfitem值之外的任何数据都不会被公开,有时这就是所需的全部。

可以在多个层上设置utfgrid,但一次只能呈现一个utfgrid。如果要添加多个utfgrid,例如openlayers,则需要在地图中为每个图层添加新的图层。

2.3例

这就是输出格式的外观。

OUTPUTFORMAT
  NAME "utfgrid"
  DRIVER UTFGRID
  MIMETYPE "application/json"
  EXTENSION "json"
  FORMATOPTION "UTFRESOLUTION=4"
  FORMATOPTION "DUPLICATES=false"
END

这就是新的utfitem和utfdata字应该如何添加到层中。

LAYER
  NAME         basic
  DATA         ne_50m_admin_0_countries
  TYPE         POLYGON
  PROJECTION
    "init=epsg:4326"
  END
  UTFITEM   "postal"
  UTFDATA   "{\"admin\":\"[admin]\"}"
END

下面是使用utfgrid呈现器呈现为JSON的图像:

[
  "                            &&&&",
  "                       && &&&&&&",
  "                     &&&&&&&&&&&",
  "                   &&&&&&&&)))))",
  "                  &&& &&&)))))))",
  "                    &&&&))))))))",
  "                   &&&&)))))))))",
  "                 &&&&)))))))))))",
  "                &&&&&)))))))))))",
  "               &&&&&))))))))))))",
  "              &&&&&&))))))))))))",
  "            &&&&&&))))))))))))))",
  "         &&&&&&&&)))))))))))))))",
  "       &&&&&&&&&&)))))))))))))) ",
  "    &&&&&&&&&&&&&))))))))))))   ",
  "   &&&&&&&&&&&&&&)))))))))))    ",
  "   &&&&&&&&&&&&&&)))))))))))    ",
  "   &&&&&&&&&&&&&&)))))))))))    ",
  "   &&&&&&&&&&&&&&))))))))))))) !",
  "   &&&&&&&&&&&&&)))))))))))))))!",
  "    &&&&&&&&&&&&))))))))))))))  ",
  "    &&&&&&&&&& )))))))))))))))  ",
  "    &&&&&&&&   ))))))))))))     ",
  "       &&    $$ ))))))))))  ))) ",
  "          $$$$$$))))))))))) ))) ",
  "         $$$$$$  )))))))))) )   ",
  "         $$$$$$ $)))))))))      ",
  "         $$$$$$$$$))))          ",
  "         #$$$$$$$$))))$         ",
  "         ##$$$$$$$###    ''''''(",
  "          ###########'''''''''''",
  "    %%%%#############'''''''''''"
 ]

现在,如果我们使用邮政编码作为密钥的utfitem,我们将得到以下密钥和数据:

"keys":["","AI","D","DK","NL","N","PL","RUS","S"],"data":{"AI":{"admin":"Aland"},"D":{"admin":"Germany"},
"DK":{"admin":"Denmark"},"NL":{"admin":"Netherlands"},"N":{"admin":"Norway"},"PL":{"admin":"Poland"},
"RUS":{"admin":"Russia"},"S":{"admin":"Sweden"}}

如果关闭utfitem,我们将获得以下密钥和数据:

"keys":["","1","2","3","4","5","6","7","8","9"],"data":{"1":{"admin":"Aland"},"2":{"admin":"Germany"},
"3":{"admin":"Denmark"},"4":{"admin":"Netherlands"},"5":{"admin":"Norway"},"6":{"admin":"Poland"},
"7":{"admin":"Russia"},"8":{"admin":"Sweden"}}

也可以只保留返回以下值的utfitem:

"keys":["","AI","D","DK","NL","N","PL","RUS","S"],"data":{}

三。实施细节

添加物:

  • 层级别上存在两个新关键字(utfdata和utfitem)

  • 将提供一个新的呈现器(utfgrid)

GSOC期间产生的初始实施的已知限制:

  • 属性值不是JSON转义的,因此如果属性值包含无效字符,则JSON输出可能会中断。应该为utfgrid添加一个JSON转义函数,对于JSON输出的一般模板支持也很有用。

  • 由于即将对TrueType呈现进行更改,renderTrueTypeSymbols方法尚未实现。实现了所有其他类型的符号和标签。

4。受影响的文件

此RFC将修改/添加以下文件:

mapserver.h: Add new output format defines, extend layerObj, etc...
mapfile.c/mapfile.h: Add new keywords: UTFITEM and UTFDATA.
mapoutput.c: Add appropriate entries for new UTFGRID driver.
maputfgrid.cpp/maputfgrid.h: Implementation of the new UTFGrid renderer.
mapaggcommon.h: Common resources for AGG and UTFGrid drivers.

5。开放层

有一个补丁提交给Openlayers开发团队,允许在WMS服务上使用utfgrid。需要使用带Openlayers的utfgrid的mapserver实现

您可以在utfgridwms分支的https://github.com/fdesj/openlayers上找到它。另请参见拉请求:https://github.com/openlayers/openlayers/pull/1076

Openlayers库中有一个工作示例(examples/utfgridwms.html)。

6。MapScript

php mapscript需要将get/set方法添加到layer类中。基于swig的mapscript不需要更改。

7。向后兼容性问题

没有预料到。

8。安全隐患

没有预料到。

9。性能影响

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

10。文档需求

需要更新层对象文档以反映新参数。输出部分需要一个新的utfgrid howto页面来讨论与新输出格式相关联的配置选项。

11.错误ID和引用

  • 跟踪问题:https://github.com/MapServer/MapServer/pull/4765(包含代码差异)

  • 您可以在utfgridgsoc分支(过时)的https://github.com/fdesj/mapserver/tree/utfgridgsoc中找到GSOC 2013期间开发的原始代码。

  • GSOC期间创建的文档更新可在https://github.com/fdesj/docs/tree/rfc-93中找到。

  • Https://github.com/MapServer/msautotest/pull/24上的MS自动测试拉取请求(已过时)

  • 在https://github.com/openlayers/openlayers/pull/1076上请求Openlayers utfgridwms支持

  • 另请参阅https://github.com/MapServer/MapServer/wiki/GSoC-UTF-Grid-implementation上的GSOC项目报告

12。投票历史

+1人来自丹尼尔姆、托马斯布、佩林、史蒂文、米克斯、史蒂文、叶旺德沃塞纳、塔马斯和斯蒂芬。