ArcGIS server10.1支持WFS的大部分功能,部分查询有BUG,如within在以Polygon进行过滤时实际使用的是其边界范围。与GEOServer相比,WFS-T的配置也相对繁琐。在本篇记录详细的配置过程,并附上客户端调用方法。


在搭建GIS服务时,目前得到的结论是:

  1. 搜索,图层展示使用WMS与arcgis默认的mapserver相结合的方式,由于在有表关联,即图层存在join(1:1)或relate(1:M)关系)的情况下,WFS完全失效。故不建议使用WFS进行查询。而Feature access在图层展示时不支持多字段分类展示,也不建议使用。

  2. 数据维护使用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>