ArcGIS server10.1支持WFS的大部分功能,部分查询有BUG,如within在以Polygon进行过滤时实际使用的是其边界范围。与GEOServer相比,WFS-T的配置也相对繁琐。在本篇记录详细的配置过程,并附上客户端调用方法。
在搭建GIS服务时,目前得到的结论是:
搜索,图层展示使用WMS与arcgis默认的mapserver相结合的方式,由于在有表关联,即图层存在join(1:1)或relate(1:M)关系)的情况下,WFS完全失效。故不建议使用WFS进行查询。而Feature access在图层展示时不支持多字段分类展示,也不建议使用。
数据维护使用WFS-T,建议单独将空间库共享为geoservice。这样可以实现数据的维护与查询分离,功能上互不干扰。但又可以达到数据同步的目的。
设想这样一个场景
空间库 A 中有空间表 video_pt, 此表仅有两个字段,主键ID,空间字段GEOM
关联库 B 中有信息表 video_info, 其中包含基本的属性信息。如名称,地址,服务器名等信息。
两表通过主键1对1关联。
要完成的目标:客户端只更新video_pt的空间字段,查询出图时则需使用关联后的数据。
步骤一:转换普通数据库为空间库,具体配置方法参考另一篇文章ArcGIS 发布Feature Service 。此过程会在当前库中创建SDE的相关表以及存储过程,所以在转换时强烈建议使用新建数据库。在此库中一律存放空间信息。
步骤二:新建db version
arccatalog -> database connections -> 数据库名右键properties -> connections标签下点击show connected users... -> 弹窗中选择versions选项卡 -> 右键DEFAULT new version -> 输入下级version的名称和描述,这里填wfs,访问方式选public。
此过程的步骤说明在desktop help中WFS-T的相关文档中也能找到。
步骤三:切换数据库版本到刚刚建立的version,并注册到arcgis server上
arccatalog -> database connections -> 数据库名右键geodatabase connection properties
在transactional version下,可以看到有两个版本,DEFAULT和我们刚刚建立的WFS,选择WFS,点OK。
这样就成功切换到了新的数据库版本。注册到arcgis server的过程与平常一样,只是如果之前已经注册过建议删除后重新注册。
步骤四:将需要更新的表注册到相应的数据库版本下
右键表选择 manage -> Register as versioned, 弹框中勾上同步到base version.
步骤五:共享空间库
右键库 share as geodata service... 后面的配置过程同发布map service差不多,注意勾上WFS一项,并且勾上启动事务和事务锁。(经过测试,有没有锁的情况下更新效率差不多)。
客户端调用
http post 方式,请求格式为XML,包含在POST BODY里面
更新数据分两步操作
GetFeatureWithLock:
根据过滤条件获取事务锁和要素ID,如果要素已被锁定则不能进行更新。
注意其中两个参数,
expiry:锁超时时间,单位分钟,默认为3分钟
lockAction: 可选参数为 ALL,SOME
<GetFeatureWithLock version="1.1.0" service="WFS" expiry="1" lockAction="ALL" xmlns="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.opengis.net/wfs ../wfs/1.0.0/WFS-transaction.xsd" > <Query typeName="test:video_pt"> <ogc:Filter> <ogc:PropertyIsEqualTo> <ogc:PropertyName>OBJECTID</ogc:PropertyName> <ogc:Literal>5779</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Filter> </Query> </GetFeatureWithLock>
Transaction:更新操作,需要使用上一步获得的锁ID
releaseAction参数与lockAction相对应,可选参数为ALL,SOME,默认为ALL
<wfs:Transaction version="1.1.0" service = "WFS" releaseAction = "ALL" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs = "http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.opengis.net/wfs ../wfs/1.1.0/WFS-transaction.xsd" > <wfs:LockId></wfs:LockId> <wfs:Update typeName="test:video_pt"> <wfs:Property> <wfs:Name>GEOM</wfs:Name> <wfs:Value> <gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326"> <gml:coordinates decimal="." cs="," ts=" ">113,23</gml:coordinates> </gml:Point> </wfs:Value> </wfs:Property> <ogc:Filter> <ogc:FeatureId fid="F406__5779"/> <ogc:FeatureId fid="F406__5780"/> </ogc:Filter> </wfs:Update> </wfs:Transaction>