对于一张图片地图,如果想实现点击地图上一点,地图在相应位置弹出小窗口,显示所点区域的信息这样的功能。要首先获取鼠标点击的坐标,然后在数据库中判断该点在哪个要素的范围内,最后返回包含该点的要素信息。然而我们既然懂这个原理,就可以先看看有没有实现,没必要去重新造轮子。
MapServer 就已经实现了该服务,因为这是 WMS 的 GetFeatureInfo 操作,MapServer 支持 WMS、WFS等标准,我们只要配置 MapServer 支持该操作即可,不必自己去实现了,配置与发布方法依然是配置对应地图服务的 mapfile 文件。
刚刚接触 MapServer 的朋友,可能不知道 mapfile 中还有 模板(templating)这个参数,而这个参数就负责配置 WMS GetFeatureInfo 操作的返回结果内容和格式。
注(术语):
WMS - Web Map Service(网络地图服务)
调用实现效果
我们要实现的效果就是当用户点击地图上某一块地物的时候,从服务器返回对应地物的属性信息,并以弹出框的形式显示,如下图所示。弹出框内容及其样式并不是我们讲的重点,所以文章中不会涉及 OpenLayers 弹窗,以及如何做出如图弹出框的样式。需要了解的可以看下我的 OpenLayers 3专栏 和相应的 HTML、CSS 知识。这里我们主要讲其后端的通信与处理过程。
图1 GetFeatureInfo 实现效果图
TEMPLATE 参数
在 上一篇关于 MapServer 的文章中,我们介绍了 mapfile 的知识,并以例子的形式发布了 WMS(网络地图服务) ,WMS包含三个基本服务,GetCapability(获取服务的元数据)、GetMap(获取图片格式的地图) 和 GetFeatureInfo(获取要素的信息),其中 GetCapability 和 GetMap 是一个WMS服务必须具备的能力,GetFeatureInfo 是可选的,上一篇中的 mapfile 配置中的 WEB 对象中有一行配置是 "wms_enable_request" "*"
,这行配置表示已经告诉 MapServer 开启了 WMS 所有服务,包括 GetFeatureInfo,但是这样配置并不能响应 GetFeatureInfo 的请求,必须配置一些额外的参数,就是本篇要讲的 TEMPLATE 参数。
如何配置
下面是配置好 WMS GetFeatureInfo 操作的 mapfile,我们来分析一下各个配置的意义,该 mapfile 基于上一篇文章,添加了几个参数,所以不涉及 GetFeatureInfo 的内容我这里就不涉及了,主要讲 GetFeatureInfo 相关的配置。
MAP
NAME "test"
PROJECTION
"init=epsg:3857"
END #PROJECTION END
WEB
METADATA
"wms_title" "test"
"wms_version" "1.3.0"
"wms_onlineresource" "http://xx.xx.xx.xx/cgi-bin/mapserv.exe?"
"wms_enable_request" "*"
"wms_srs" "EPSG:3857"
"wms_feature_info_mime_type" "text/html"
END # MAP METADATA
END # WEB
LAYER
NAME "test_layer"
TYPE POLYGON
METADATA
"wms_title" "test_layer"
"wms_srs" "EPSG:3857"
END # LAYER METADATA
CONNECTIONTYPE postgis
CONNECTION "host=xx.xx.xx.xx port=xxxx dbname='xxxx' user=xxxx password=xxxx"
DATA "geom from xxx using unique gid using srid=3857"
TEMPLATE "template.html"
CLASS
NAME "polygon_style"
STYLE
COLOR "#5eff4d"
OUTLINECOLOR