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>