轉帖|其它|編輯:郝浩|2010-12-23 13:53:53.000|閱讀 1038 次
概述:ArcGIS 10 中可以通過Interoperablility模塊來加載由外部數據源或ArcGIS Server發布的標準的WFS服務。使用過ArcGIS該功能的朋友應該會注意到,在初次加載WFS數據時數據加載的速度會比較慢,而當以后再次加載時速度就非常快了。而造成這種現象的原因主要在于ArcGIS在初次加載WFS數據的同時將其全部數據在本地機器上做了緩存,當下次再次訪問該WFS服務時,則可直接訪問本地緩存無需訪問網絡資源。本文將介紹在ArcGIS 10中WFS更新緩存的方法與原理。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
1、概述
ArcGIS 10 中可以通過Interoperablility模塊來加載由外部數據源或ArcGIS Server發布的標準的WFS服務(10默認支持WFS1.1.0),如圖1所示。使用過ArcGIS該功能的朋友應該會注意到,在初次加載WFS數據時數據加載的速度會比較慢,而當以后再次加載時速度就非常快了。而造成這種現象的原因主要在于ArcGIS在初次加載WFS數據的同時將其全部數據在本地機器上做了緩存,當下次再次訪問該WFS服務時,則可直接訪問本地緩存無需訪問網絡資源,如圖2所示。
圖1
圖2 ArcGIS與WFS交互的體系結構圖
ArcGIS如此的WFS數據訪問模式在很大程度上確實能夠大幅提高WFS的訪問效率,但這種 ArcGIS與WFS交互的體系結構圖模式也同時帶來了一個較大的缺點,即無法及時反映WFS數據源中數據的變化,如圖3和圖4。
圖3 更新前ArcGIS中訪問WFS數據的截圖
圖4 更新后ArcGIS中訪問WFS數據的截圖(同圖3)
同時,ArcGIS本身也并沒有提供相應的機制或參數以使得用戶能夠控制本地緩存的更新。所以,這就觸發了筆者希望通過研究其緩存和運行原理,以從中探求控制本地緩存更新的方法。而這也便是本文的緣起。
2、運行原理
ArcGIS中對WFS訪問客戶端的支持是基于FME來實現的,所以新建WFS連接的界面的風格與FME基本一致,如下圖所示:
圖5 新建對話框
圖6 參數對話框
當使用Interoperability模塊新建了一個WFS連接后,ArcGIS會在目錄"%userprofile%\AppData\Roaming\Safe Software\Interoperability"中自動生成一個后綴為".fdl"的WFS連接文件。將該文件使用文本編輯器打開,可以發現該文件其實就是存儲了所有用于定義該WFS連接的相關參數:
圖7 WFS連接文件
同時,在ArcGIS中對該WFS連接的所有操作,包括連接的創建、修改、訪問等操作均以日志的形式存儲在同級目錄的log目錄下,如圖:
圖8 互操作log文件
通過查看對應的log文件筆者發現,原來ArcGIS在建立WFS連接的同時會自動將WFS中所有的要素全部加載并緩存在本地文件中,同時為了加快對本地緩存要素的查看,還為這些要素做了空間索引,證據如下:
2010-12-21 11:15:37| 50.0| 0.0|STATS |Stored 6 feature(s) to FME feature store file `C:\Users\ADMINI~1\AppData\Local\Temp\INTEROP\FFSPC_1292901310941_3684'
2010-12-21 11:15:37| 50.0| 0.1|STATS |Storing feature(s) to FME feature store file `C:\Users\ADMINI~1\AppData\Local\Temp\INTEROP\FFSPCS_1292901310944_3684'
2010-12-21 11:15:37| 50.0| 0.0|STATS |Stored 0 feature(s) to FME feature store file `C:\Users\ADMINI~1\AppData\Local\Temp\INTEROP\FFSPCS_1292901310944_3684'
2010-12-21 11:15:37| 50.1| 0.0|INFORM|Saving spatial index into file 'C:\Users\ADMINI~1\AppData\Local\Temp\INTEROP\FFSPCS_1292901310944_3684.fsi'
2010-12-21 11:15:37| 50.1| 0.0|INFORM|Finished saving spatial index into file 'C:\Users\ADMINI~1\AppData\Local\Temp\INTEROP\FFSPCS_1292901310944_3684.fsi'
2010-12-21 11:15:37| 50.1| 0.0|INFORM|Saving spatial index into file 'C:\Users\ADMINI~1\AppData\Local\Temp\INTEROP\FFSPC_1292901310941_3684.fsi'
然后,筆者有進一步地查看了以上四個文件,發現其中:
1、文件FFSPC_1292901310941_3684用于存儲要素實體;
2、文件FFSPC_1292901310941_3684.fsi存儲了要素的空間索引;
3、文件FFSPCS_1292901310944_3684存儲了要素的數據結構;
4、文件FFSPCS_1292901310944_3684.fsi似乎沒有使用(先存個疑)。
同時,以上這些文件通過同級目錄中的MasterTable.xml文件來管理,并且該文件管理了所有與互操作相關的數據緩存,ArcGIS內嵌的FME互操作模塊正是結合上述的.fdl連接文件以及該xml文件來訪問緩存的WFS數據的。
MasterTable.xml文件結構
<?xml version="1.0" encoding="UTF-8"?>
<fmeobjects-cache-table fme-build-number="6213">
<id-cache>
<id>
<single-properties>
<property name="reader-type" value="WFS"/>
</single-properties>
<multi-value-properties>
<property name="datasets"><item value="//esri-wangxin-male:8399/arcgis/services/WfsPoly/MapServer/WFSServer"/></property>
</multi-value-properties>
<string-array-properties>
<pairs name="keywords">
<property name="COORDINATE_SYSTEM" value=""/>
<property name="FEATURE_TYPE_ATTRIBUTE" value="fme_feature_type"/>
<property name="FILTER_EXPRESSION" value=""/>
<property name="FME_FEATURE_IDENTIFIER" value=""/>
<property name="HTTP_AUTH_METHOD" value="Basic"/>
<property name="HTTP_AUTH_USER" value=""/>
<property name="HTTP_PROXY" value="null"/>
<property name="HTTP_PROXY_AUTH_METHOD" value="Basic"/>
<property name="HTTP_PROXY_PORT" value="null"/>
<property name="HTTP_PROXY_USER" value=""/>
<property name="IDs" value="WfsPoly:school {school}"/>
<property name="MAXX" value=""/><property name="MAXY" value=""/>
<property name="MAX_RESULT_FEATURES" value="30000"/>
<property name="MERGE_SCHEMAS" value="YES"/>
<property name="METAFILE" value="WFS"/>
<property name="MINX" value=""/>
<property name="MINY" value=""/>
<property name="ORIENTATION_RULE" value="RIGHT_HAND_RULE"/>
<property name="SPATIAL_INDEX_ATTRIBUTE" value="fme_feature_type"/>
<property name="SPATIAL_INDEX_ATTRIBUTE" value="fme_type"/>
<property name="TABLELIST" value=""WfsPoly:school {school}""/>
<property name="UNIQUE_ID_ATTRIBUTE" value="FME_FEATURE_ID"/>
<property name="USE_HTTP_AUTH" value="NO"/>
<property name="USE_PROXY_SERVER" value="NO"/>
<property name="USE_SEARCH_ENVELOPE" value="NO"/>
<property name="XSD_DOC" value=""/>
</pairs>
</string-array-properties>
</id>
<cache>
<single-properties>
<property name="time-stamp" value="2010-12-22 22:28:29"/>
<property name="schema-spatial-index-path" value="C:\Users\ADMINI~1\AppData\Local\Temp\INTEROP\FFSPCS_1293028109579_2672"/>
<property name="time-based-expiry" value="yes"/>
<property name="spatial-index-path" value="C:\Users\ADMINI~1\AppData\Local\Temp\INTEROP\FFSPC_1293030594489_5328"/>
</single-properties>
</cache>
</id-cache>
</fmeobjects-cache-table>
3、更新緩存的方法
筆者在文件MasterTable.xml中筆者還發現了<property name="time-based-expiry" value="yes"/>,該參數似乎是用于指定對應的緩存是否基于時間過期,但筆者查了很多資料都沒能查到FME中默認的過期時間到底是多少,如果有朋友知道請能告訴我。不過在實際應用場景中,單純地由客戶端基于過期時間的自動更新顯然有些不合理——過期時間太短,則刷新過于頻繁而影響效率;過期時間太長,則無法反映最新數據。所以,WFS的緩存過期應該是由數據源更新來驅動的,即數據源更新的同時進行緩存的刷新。在ArcGIS的產品體系統對于WFS的使用無非是兩種技術路線,一是直接將ArcDesktop作為WFS客戶端來使用WFS服務,另一種是將WFS服務發布到ArcGIS Server中,并有Server將其再發布成Server支持的其它服務。所以,針對這兩種路線,其對應的緩存更新的方法如下:
A、在ArcDesktop中的更新的緩存的方法
1)刪除MasterTable.xml文件中目標緩存對應的實體;
2)刪除該實體中引用的同目錄下的要素緩存文件、要素索引文件、要素架構文件、以及要素架構索引文件;
3)在ArcCatalog中刷新對應的WFS連接。
當再次訪問該WFS連接時,ArcDesktop會重新從數據源加載并緩存要素到新建的本地緩存文件中。
B、在ArcGIS Server中更新緩存的方法
1)刪除MasterTable.xml文件中目標緩存對應的實體;
2)刪除該實體中引用的同目錄下的要素緩存文件、要素索引文件、要素架構文件、以及要素架構索引文件;
3)在ArcCatalog或Web版的ArcGIS Server Manager中重新啟動對應的服務。
當再次訪問該服務時,ArcGIS Server會重新從數據源加載并緩存要素到新建的本地緩存文件中。
4、我們在哪
由于FME中WFS本地緩存更新機制導致ArcGIS的無法有效地滿足WFS數據源更新頻繁的場景下的最新數據訪問需求,所以筆者從ArcGIS中WFS互操作模塊運行原理的角度想讀者介紹了關于ArcGIS在WFS互操作時所涉及的操作和數據文件的相關原理性的知識,并在此基礎上進一步分別介紹了在ArcDesktop和ArcGIS Sever環境下WFS緩存更新的方法。但是,需要注意的是,本文介紹的方法也只是治標不治本的。真正治本的還是應該由OGC進一步完善WFS標準,從而使得WFS能夠支持輕量級的更新提醒機制,然后再由ArcGIS定期的去掃描該WFS是否更新。若已更新,則自動加載更新后的WFS數據并將其緩存在本地,如此既可以提高數據的訪問效率,又能夠不因為掃描數據源更新的頻度過高而影響帶寬和服務器計算資源。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園