热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MapServer之发布网络要素服务(WFSWebFeatureService)

上一篇关于MapServer的文章,我们主要配置了MapServer支持WMS,这篇文章中我主要讲怎么配置MapServer支持WFS(网

      上一篇关于 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 实例。

MAPNAME "postgis"DEBUG 5CONFIG "MS_ERRORFILE" "/log/ms_error.txt"EXTENT 12836528.782099359 4852834.05176927 12914800.299063379 4931105.56873329PROJECTION"init=epsg:3857"END #PROJECTION ENDWEBMETADATA"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 METADATAEND # WEBLAYERNAME "postgis-layer"TYPE polygonMETADATA"wms_title" "postgis-layer""wms_srs" "EPSG:3857""wfs_title" "postgis-layer""wfs_srs" "EPSG:3857""gml_featureid" "gid""wfs_enable_request" "*"END # LAYER METADATACONNECTIONTYPE postgisCONNECTION "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"CLASSNAME "polygon_style"STYLECOLOR "#ffd166"OUTLINECOLOR "#2b2bff"WIDTH 1END # STYLE ENDEND # CLASS ENDEND # LAYER
END # 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 配置文件。

得到的响应(部分)如下:

GetCapabilities响应

支持的操作


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表示要素的序号,默认是升序排列:

GML要素


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&#61;1.0.0&SERVICE&#61;WFS&REQUEST&#61;GetFeature&map&#61;ceshi_postgis.map&TYPENAME&#61;postgis-layer&Filter&#61;<Filter><PropertyIsEqualTo><PropertyName>gidPropertyName><Literal>121Literal>PropertyIsEqualTo>Filter>

结果

      讲 Fliter Encoding 超过了这篇文章的范围&#xff0c;这里就不涉及了&#xff0c;想要了解的可以去 OGC 去看一下相关的规范&#xff0c;以后我可能会写文章涉及。


总结

      文章主要讲了 mapserver 配置 mapfile 支持 wfs&#xff0c;并通过 http 进行调用&#xff0c;调用测试使用了 GetCapability 和 GetFeature&#xff0c;在 GetFeature 例子中使用了 Fliter Encoding&#xff0c;讲的比较基础&#xff0c;后面会有一篇比较深入的介绍。

      当然&#xff0c;wfs 的这些操作&#xff0c;我们可以自己实现&#xff0c;并不是很难&#xff0c;但是我们实现可能并没有像 mapserver 这样效率高、稳定&#xff0c;因为 mapserver 是 C 写的&#xff0c;且是 CGI 形式&#xff0c;也已经比较成熟&#xff0c;并且自己实现过程中要考虑很多问题。但是&#xff0c;使用 mapserver 并不意味这你不需要理解其中的原理&#xff0c;理解 wfs 的内容是十分有帮助的。



延伸阅读&#xff1a;


  • MapServer文档&#xff1a; http://mapserver.org/ogc/wfs_server.html
  • OGC Fliter Encoding标准&#xff1a; http://www.opengeospatial.org/standards/filter


好的&#xff0c;就写到这里&#xff0c;有什么问题&#xff0c;可以在文章下面留言或者给我发邮件。


推荐阅读
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
author-avatar
三八依依2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有