MapServer 之 发布网络要素服务(WFS-Web Feature Service)
来源:互联网 发布:mac如何打人民币符号 编辑:程序博客网 时间:2024/05/01 18:49
上一篇关于 MapServer 的文章,我们主要配置了 MapServer 支持 WMS,这篇文章中我主要讲怎么配置 MapServer 支持 WFS(网络要素服务),WFS 是 Web Feature Service 的简写,也就是网络要素服务,提供地图数据要素一级数据 的服务,例如接受客户端请求要素、编辑要素和删除要素等于要素有关的操作的请求。
目前,MapServer 支持 WFS 的所有版本: 1.0.0、1.1.0、2.0.0
mapfile 配置
mapserver 发布服务都是通过 mapfile来配置的,wfs 服务也不例外,和配置wms类似,发布wfs要在mapfile配置文件中的METADATA
部分添加关于wfs的键值对。只有在图层满足如下条件的时候,mapserver 才会包含 wfs 的功能:
- 数据源是矢量数据:shapefile、OGR、Postgis、sde(ArcSDE);
- 图层名称必须设置;
- 图层数据空间类型必须是 point、line、polygon 三者之一;
- ‘wfs_onlineresource` 和 ‘wfs_enable_request’ 必须设置。
配置实例
我们在发布 wms 的 mapfile 配置基础上,添加 wfs 配置,下面是一个配置好 wms 和 wfs 的 mapfile 实例。
MAP NAME "postgis" DEBUG 5 CONFIG "MS_ERRORFILE" "/log/ms_error.txt" EXTENT 12836528.782099359 4852834.05176927 12914800.299063379 4931105.56873329 PROJECTION "init=epsg:3857" END #PROJECTION END WEB METADATA "wms_title" "postgis-wms" "wms_version" "1.3.0" "wms_onlineresource" "http://127.0.0.1/wms" "wms_enable_request" "*" "wms_srs" "EPSG:3857" "wms_feature_info_mime_type" "text/html" "wfs_title" "postgis-wfs" "wfs_onlineresource" "http://127.0.0.1/wfs" "wfs_srs" "EPSG:3857" "wfs_abstract" "This text describes your wfs service" "wfs_enable_request" "*" END # MAP METADATA END # WEB LAYER NAME "postgis-layer" TYPE polygon METADATA "wms_title" "postgis-layer" "wms_srs" "EPSG:3857" "wfs_title" "postgis-layer" "wfs_srs" "EPSG:3857" "gml_featureid" "gid" "wfs_enable_request" "*" END # LAYER METADATA CONNECTIONTYPE postgis CONNECTION "host=127.0.0.1 port=xxx dbname='xxx' user=xxx password=xxx" DATA "geom from table_name using unique gid using srid=3857" TEMPLATE "template.html" CLASS NAME "polygon_style" STYLE COLOR "#ffd166" OUTLINECOLOR "#2b2bff" WIDTH 1 END # STYLE END END # CLASS END END # LAYEREND # MAP
相对于只配置 wms 的mapfile,主要的改变在于 MAP 对象的 METADATA 子对象和 LAYER 对象的 METADATA 子对象,在 MAP 对象的 METADATA 中,增加的键值对包括:
- wfs_title,必需,GetCapabilities 请求中作为服务响应的 XML 文档的 title 元素返回;
- wfs_onlineresource,必需,提供 wfs 的服务器地址;
- wfs_srs,数据的空间参考系(Spatial Reference System);
- wfs_abstract,GetCapabilities 请求中作为服务响应的 XML 文档的 Abstract 元素返回;
- wfs_enable_request,表示配置 mapserver 地图全局支持 wfs 的所有操作。
LAYER 对象的 METADATA 增加的键值对如下(注:配置和 MAP 对象的 METADATA 有很多重复,如果不设置,就会继承 MAP 对象的 METADATA 的配置,如果设置就会使用 LAYER 的配置,这在一个 MAP 对象包含多个 LAYER 时非常有用):
- wfs_title,GetCapabilities 请求中作为服务响应的 XML 文档的 title 元素返回;
- wfs_srs,数据的空间参考系(Spatial Reference System);
- gml_featureid,图层对应的要素 ID 属性名;
- wfs_enable_request,配置图层支持 wfs 的所有操作。
配置好了,怎么测试wfs 已经配置好呢?那么怎么调用呢?请看下面的分解 。
调用 mapserver wfs
我们通过 URL 便可以调用 mapserver wfs,wfs 会返回 GML 格式的结果,在浏览器中可看其调用结果。wfs 包含很多操作,这个我在之前讲解 wfs 的文章中讲了,不清楚的可以在文章末尾的延伸阅读看相关的标准规定。从我们对 GetCapabilities 调用的响应中我们可以看到我们配置的 mapfile 支持的 wfs 操作:
WFS GetCapability
GetCapabilities 操作主要是请求 mapserver wfs 服务支持的操作,请求的 URL 及其携带参数如下:
http://127.0.0.1/wfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetCapabilities&map=ceshi_postgis.map
- REQUEST=GetCapabilities,请求的操作名;
- SERVICE=WFS,请求的服务类型;
- VERSION=1.0.0,wfs 的版本;
- map=ceshi_postgis.map,相应的 mapfile 配置文件。
得到的响应(部分)如下:
WFS GetFeature
GetFeature 操作允许我们向 mapserver 请求要素数据,下面是 GetFeature 调用的 URL:
http://127.0.0.1/wfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=getfeature&TYPENAME=postgis-layer&MAXFEATURES=2&map=ceshi_postgis.map
在以上的调用 URL 通过 GET 参数传递给 mapserver,mapserver 会为你去查询响应的图层,并找到符合条件的要素,以 GML 格式返回。我们来看看 URL 中的参数分别代表什么:
- MAXFEATURES=2,表示返回要素的最大数量限制;
- REQUEST=getfeature,请求的操作;
- SERVICE=WFS,请求的服务;
- TYPENAME=postgis-layer,过滤参数,表示图层名是’postgis-layer’的要素,因为这个图层中有上万个要素,所以我第一个参数限制了返回要素的数量;
- VERSION=1.0.0,wfs的版本;
- map=ceshi_postgis.map,mapfile配置文件的位置。
返回是 GML 格式编码的要素,每个要素格式如下,每个要素的编号是 postgis-layer.N,postgis-layer是mapfile中配置的图层名,N表示要素的序号,默认是升序排列:
WFS Filter Encoding
WFS 请求 URL 中允许使用属性来过滤要素,对返回要素进行排序,就像在 SQL 语句中那样,这里用到的技术是OGC 的另一个标准 : Fliter Encoding,这个标准基于XML 和 KVP 编码,在 URL 中使用 XML 和 KVP 技术,构造出来的 URL 也是相对比较长的,例如,我们要过滤图层名为postgis-layer, gid 为 121 的要素,可以构造下面这个 URL,得到的结果如下图:
http://127.0.0.1/wfs?VERSION=1.0.0&SERVICE=WFS&REQUEST=GetFeature&map=ceshi_postgis.map&TYPENAME=postgis-layer&Filter=<Filter><PropertyIsEqualTo><PropertyName>gid</PropertyName><Literal>121</Literal></PropertyIsEqualTo></Filter>
讲 Fliter Encoding 超过了这篇文章的范围,这里就不涉及了,想要了解的可以去 OGC 去看一下相关的规范,以后我可能会写文章涉及。
总结
文章主要讲了 mapserver 配置 mapfile 支持 wfs,并通过 http 进行调用,调用测试使用了 GetCapability 和 GetFeature,在 GetFeature 例子中使用了 Fliter Encoding,讲的比较基础,后面会有一篇比较深入的介绍。
当然,wfs 的这些操作,我们可以自己实现,并不是很难,但是我们实现可能并没有像 mapserver 这样效率高、稳定,因为 mapserver 是 C 写的,且是 CGI 形式,也已经比较成熟,并且自己实现过程中要考虑很多问题。但是,使用 mapserver 并不意味这你不需要理解其中的原理,理解 wfs 的内容是十分有帮助的。
延伸阅读:
- MapServer文档: http://mapserver.org/ogc/wfs_server.html
- OGC Fliter Encoding标准: http://www.opengeospatial.org/standards/filter
好的,就写到这里,有什么问题,可以在文章下面留言或者给我发邮件。
- MapServer 之 发布网络要素服务(WFS-Web Feature Service)
- MapServer 之 发布网络地图服务(WMS-Web Map Service)
- MapServer 之 发布网络覆盖数据服务(WCS-Web Coverage Service)
- arcgis10.2发布要素服务(feature service)
- WFS 实现说明(Web Feature Service Implementation Specification)
- 发布要素地图服务(Feature Layer)
- MapServer 之 发布 WMS GetFeatureInfo 服务
- ebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析
- WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析
- WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析
- WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析
- WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解
- 在线编辑(一)数据准备—发布要素地图服务(Feature Layer)
- ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法
- (三)ArcGIS Server之发布要素服务
- ArcGIS Server代码动态创建发布服务(MapServer,ImageServer)
- ArcGIS Server代码动态创建发布服务(MapServer,ImageServer)
- ArcGIS Server之发布要素服务
- WebKit之WebSocket
- 内存管理,readwrite,readonly,assign,retain,copy,nonatomic,的作用以及深浅拷贝
- Python(1)
- Swift 类构造器的使用
- 在servlet中用spring @Autowire 注入.
- MapServer 之 发布网络要素服务(WFS-Web Feature Service)
- Study JavaScript《Canvas Image相互转换》
- Java 数组Array 转换为 List
- JMS ActiveMQ 研究
- 2、UITextField的方法和属性
- wifislax最终版reaver穷举PIN教程
- HTML5游戏制作之路_08_egret对于声音的控制
- WebKit之常用类
- 高次同余笔记(二):extended-baby-step-giant-step算法