ArcGIS發佈WFS-T數據更新服務

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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章