8.4. WFS与网络矢量数据编辑

在第7课中,您看到了可以通过web浏览器或客户端绘制矢量数据的一些方法。本课程的重点是独立的KML和GeoJSON文件,但是web服务也可以根据请求将数据发送到客户端。只要服务器和客户端遵循相同的规范,数据就可以是任何格式的。为了规范通过web服务发送矢量数据的过程,开放地理空间联盟(OGC)制定了web特征服务(WFS)规范。

您已经在以前的课程中看到了相关的服务WMS。WMS与WFS有何不同?WMS涉及服务器发送单个地图图像,而WFS涉及服务器将矢量数据作为要由客户端绘制的文本发送。简单地说,WMS 地图由服务器绘制,WFS 地图由客户端绘制。

8.4.1. WFS请求和响应格式

像WMS一样,WFS支持一组操作,这些操作通常直接接受URL中的参数。这些操作包括GetCapabilities、DescribeFeatureType和GetFeature。GetFeature操作实际上是检索功能的操作。

以下是针对美国科罗拉多州的GetFeatures WFS请求示例(我选择了具有简单几何形状的对象)。我从Woundless WFS教程 改编而成,很遗憾,该指南似乎不再在线可用。关于WFS的更多信息的另一个推荐来源是 OGC电子学习教程 。您将无法使用自己下方的链接,但请查看是否可以猜测每个参数的含义,然后继续阅读响应:

http://suite.opengeo.org/geoserver/wfs?service=wfs&version=1.1.0&request...

通过检查上述URL参数,可以看到使用WFS规范的1.1.0版从WFS请求了一个特性。该服务托管在GeoServer上,位于美国工作区中名为states的图层中。返回索引为23的功能。

WFS使用地理标记语言(GML)返回数据,GML是一种使用XML表示地理信息系统数据的规范。GML可以包含几何和属性信息。因为它是基于XML的,并且被设计成足够灵活以处理许多地理特征类型,所以GML比GeoJSON更冗长(需要更多的文本)。在科罗拉多州的GML深处,你可以找到几何学:

<gml:posList>37.48468400000007 -109.04348799999995 38.164690000000064 -109.04176199999989 38.27548899999999 -109.06006199999996 41.0006590000001 -109.05007599999999 41.00235900000007 -102.051717 36.993015999999955 -102.04208899999992 36.99908400000004 -109.0452229999999 37.48468400000007 -109.04348799999995</gml:posList>

您还可以找到如下属性:

<usa:NAME10>Colorado</usa:NAME10>

可以对在GeoServer上运行的您自己的某个服务发出相同类型的请求。下面是我如何使用我们在本课程前面发布的层之一请求费城社区:

http://localhost:8080/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typename=geog585:Neighborhoods&featureid=Neighborhoods.12

响应如下所示,包含Olney邻域的几何体和属性:

<wfs:FeatureCollection numberOfFeatures="1" timeStamp="2014-03-03T15:07:31.822Z" xsi:schemaLocation="http://localhost:8080/geoserver/geog585 http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=geog585%3ANeighborhoods http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"><gml:featureMembers><geog585:Neighborhoods gml:id="Neighborhoods.12"><geog585:the_geom><gml:MultiSurface srsDimension="2" srsName="urn:x-ogc:def:crs:EPSG:3857"><gml:surfaceMember><gml:Polygon srsDimension="2"><gml:exterior><gml:LinearRing srsDimension="2"><gml:posList>-8363968.786751106 4869301.13520122 -8363706.077778376 4871057.31164155 -8363880.846283749 4871132.918517317 -8363697.377540309 4872031.511981935 -8363780.660729433 4872179.806916264 -8363847.448310932 4872208.890548547 -8363802.926044645 4872557.878939522 -8363802.44449278 4872626.491915396 -8363025.915000884 4872530.247301338 -8361543.138729884 4872310.6731403675 -8361453.88028348 4872223.294811407 -8361493.045963939 4872015.489274301 -8361627.94355705 4871826.7318475135 -8361690.687270048 4871673.398417745 -8361627.94355705 4871403.748827802 -8361286.901117077 4870791.777211798 -8361326.368936536 4870458.7113405885 -8361498.408149585 4869986.8871721085 -8361555.111808623 4869831.380121785 -8362695.297708079 4869623.850560427 -8363168.406381819 4869548.2551895585 -8363968.786751106 4869301.13520122</gml:posList></gml:LinearRing></gml:exterior></gml:Polygon></gml:surfaceMember></gml:MultiSurface></geog585:the_geom><geog585:STATE>PA</geog585:STATE><geog585:COUNTY>Philadelphia</geog585:COUNTY><geog585:CITY>Philadelphia</geog585:CITY><geog585:NAME>Olney</geog585:NAME><geog585:REGIONID>214146.0</geog585:REGIONID></geog585:Neighborhoods></gml:featureMembers></wfs:FeatureCollection>

8.4.2. WFS服务器和客户端

尽管WFS请求和响应的语法看起来有点吓人,但您很少需要担心自己编写它。各种自由/开源软件和专有软件包包括对查看和服务WFS的支持。

8.4.2.1. WFS服务器

如以上示例所示,GeoServer可以通过WFS公开您的图层。这在默认情况下是启用的,不需要对您的部件进行配置。其他FOSS地理信息系统服务器,如Map Server和Deegree,支持创建WFS web服务。

在专有领域中,Esri ArcGIS Server为用户提供了通过WFS公开其Web服务的选项。但是,Esri开发了自己的“功能服务”,该功能通过REST起作用,并且完成了许多与WFS相同的任务。请注意,Esri Web 制图API和编辑小部件设计用于功能部件服务而不是WFS。地理服务REST规范中公开记录了要素服务的通信模式。

8.4.2.2. WFS客户

Web 制图 API对WFS的支持各不相同。WFS可以在OpenLayers中被视为“开箱即用”的矢量层,但不能在Leaflet中看到。如上所述,Esri web mapping API设计用于REST特性服务,而不是WFS。

尽管Leaflet不会绘制WFS发送的GML响应,但它会绘制GeoJSON。因此,通过Leaflet使用WFS的一种模式是将服务器配置为发回GeoJSON而不是GML。然后,您可以通过AJAX(异步Web请求)将WFS请求发送到服务器,并使用Leaflet类绘制返回的geoJSON。这种模式通过众多 论坛帖子 和第三方插件来公开。

在桌面端,QGIS支持查看和编辑WFS。(注意:尝试在QGIS中编辑WFS时出现错误,但是在该层后面没有数据库或代理主机。)其他FOSS客户端(例如uDig)也可以识别WFS格式。在Esri ArcMap中,您可以使用数据互操作性扩展将WFS图层添加到地图(请参见“ 连接到WFS服务“)。ArcGIS Pro允许用户添加WFS,并且似乎不需要扩展名(此处的文档 )。

8.4.3. 事务WFS(WFS-T)与基于web的编辑

WFS规范还定义了功能编辑的规则,为可以通过web编辑地理数据的构建客户机打开了大门。启用编辑的WFS称为事务WFS或WFS-T。除了标准WFS操作(如GetFeature)外,WFS-T还支持名为Transaction的附加操作,还可以支持锁定功能以防止并发编辑的操作。

创建web编辑应用程序既需要一个可以处理传入事务的服务器,也需要一个为编辑草图、顶点操作、文本框的属性输入等提供可视化支持的客户端。客户端绘制操作必须连接到WFS-T请求。除非您已经准备好编写大量的JavaScript,最好从现有的样本、控件或Web控件开始。 Leaflet 提供Draw control 可以处理草图部分。看到一个examplewhat "Draw" 可以。那个respec/leaflet.wfs-t 是一个插件的示例,该插件设计用于将绘图控件连接到WFS-T请求。(完全公开:我没有测试过这个特定的插件,但是还有其他基于相同概念的插件)。

../../_images/leaflet_draw.png

图8.11

OpenLayers还提供一些基本的按钮,用于绘制、修改、删除和保存功能。你可以看到他们在行动this developer example

在公开任何数据集以进行Web编辑之前,您应该仔细考虑质量控制和数据存储体系结构。例如,也许您想公开数据库的副本以进行Web编辑,然后让分析师检查所有更改,然后再将其推送到主GIS数据库。如果内部编辑人员正在对master数据库进行更改,则还需要一种将它们定期推送到Web副本的方法。在其他情况下,您可以使用脚本检查传入的编辑,以确保它们符合某些拓扑规则或属性架构要求。