姜成楨 熊志偉 殷金榮
(黃河勘測規劃設計有限公司,河南 鄭州 450008)
基于NodeJS和ArcGIS緊湊切片的OGC-WMTS服務的研究與實現
姜成楨 熊志偉 殷金榮
(黃河勘測規劃設計有限公司,河南 鄭州 450008)
在一般情況下都是用ArcGIS Desktop制作精美的地圖,用ArcGIS Server發布為地圖切片服務,但是,在有些時候僅需發布地圖切片服務,如何將龐大的后臺輕量化,筆者進行了摸索,通過NodeJS來發布符合OGC-WMTS規范的ArcGIS緊湊地圖切片是一個不錯的方案。
NodeJS;ArcGIS;OGC-WMTS;Compact Cache;緊湊切片緩存;bundle
ArcGIS是功能最強大和性能最好的GIS平臺,具備一體化的GIS解決方案,具有強大的地圖制作、空間數據管理、空間分析、空間信息整合、發布與共享的能力。其中ArcGIS for Desktop為GIS專業人士提供強大的高級的地理數據建庫、分析、處理與地圖制圖等功能;ArcGIS for Server通過Web Services在網絡上提供GIS資源和功能服務,廣泛用于企業級 GIS實現以及各種Web GIS應用程序中。ArcGIS功能強大,當然價格也是很昂貴,而在現實中往往有這樣的需求:在實際的產品部署中只是用ArcGIS Server來發布電子地圖切片,這提高了成本并造成了資源的浪費,那有沒有一種廉價的替代方案呢?生產階段依然使用ArcGIS Desktop配置地圖并生成地圖切片,在部署時不使用ArcGIS Server而用其他方式發布符合OGC-WMTS規范的地圖服務,對此,筆者進行了探索。為了實現這個目的,首先需要了解ArcGIS的地圖切片結構;之后需要了解OGC-WMTS服務規范;在此基礎上給出實現,實現的技術多種,在這里筆者選用NodeJS。
從ArcGIS 10開始增加了一種稱之為緊湊型存儲(Compact)的新的切片緩存文件格式,與之前的松散型存儲(Exploded)相比,它有文件個數少、節約存儲空間、容易部署和遷移等諸多優點,已經成為廣泛使用的格式。其核心為bundle和bundlx兩種文件。
2.1 其中bundle文件存儲地圖切片數據,bundlx是切片數據的索引文件。一個bundle文件中最多可以存儲128×128(16384)個地圖切片,以低位到高位的方式4個字節記錄切片數據長度,之后存儲切片的真實數據信息,如此循環。當在一個層級里,地圖切片數多余16384個,會分成多個bundle文件存儲。
2.2 bundlx文件比較簡單,大小81952字節,其中文件起始16字節和文件結束16字節為標識信息,與索引無關,剩余的81920字節為有效索引信息,以每5個字節重復,5個字節同樣以低位到高位的方式記錄了對應的切片在bundle文件中的偏移量,而偏移量的記錄按照列排順序。
2.3 對于每一個地圖切片,首先通過bundlx首先找到bundle中切片內容的偏移,然后從bundle文件中取出4個字節的長度數據,再隨后根據這個長度即可讀取真實的切片數據。
WMTS(OpenGIS Web Map Tile Service,切片地圖網絡服務)提供了一種采用預先定義地圖切片方法來發布數字地圖服務的標準化解決方案。與WMS相比,WMTS服務器不提供可定制地圖服務,而是直接返回實現預先生成的切片,在這個過程不需要任何圖像操作或地理信息處理過程,這種方式盡管犧牲了提供定制地圖的靈活性,但是,卻能夠很好地滿足性能與伸縮性的需要。對于WMTS服務端,需要響應來自客戶端的以面向資源的架構風格(KVP、SOAP)的資源請求或以面向過程的架構風格(REST)的操作請求,請求包括3類資源:
3.1 服務元數據(ServiceMetadata)資源(面向過程架構風格下對GetCapabilities操作的響應),該資源描述指定服務器實現的能力和包含的信息,在面向過程的架構風格中該操作也支持客戶端與服務器間的標準版本協商,此請求服務器端必須響應。直接利用ArcGIS生成的服務元數據進行適當修改并返回。
3.2 切片(Tile)資源(面向過程架構風格下GetTile操作的響應),此請求服務器端必須實現。找到切片所在的bundle并打開加載Tile返回。
3.3 要素信息(FeatureInfo)資源(對面向過程架構風格下GetFeatureInfo操作的響應),服務器端可選擇實現。該資源提供了切片中某一特定像素位置處地物要素的信息,在這里不實現其操作。

表1 模塊功能說明
NodeJS是一個可以快速構建網絡服務及應用的平臺,采用了Javascript V8引擎,性能很好,同時還提供了很多系統級的API,如文件操作、網絡編程等。它以單進程、單線程模式運行,事件驅動機制通過內部單線程高效率地維護事件循環隊列來實現的,不存在多線程的資源占用和上下文切換。
由于NodeJS官方API基本都是以會回調方式傳遞函數返回值,容易出現層層嵌套,形成回調金字塔,代碼可能性變差,調試困難,出現異常后難以排查。借助Promise可以解決這個問題,目前實現Promise標準的模塊有很多,如Q、bluebird和Deferred,筆者在這里使用的是Q,可以通過npm install Q-g來安裝這個插件。
具體到模塊劃分,可分為Loader模塊、Cache模塊、parser模塊和Wmts模塊。其中Wmts是主模塊,其邏輯是通過parser的parse方法解析客戶端請求,若客戶端請求ServiceMetadata信息,則首先檢查SmdCache,若已經加載過該服務的元數據信息則直接返回,若未加載過則調用SmdLoader加載并存入緩存后返回;若客戶端請求Tile,則先檢查TileCache,若已加載過則直接返回,無則檢查BundleCache,若有則直接通過fd加載Tile,若無則通過BundleLoader加載bundle然后再加載Tile,緩存后返回給客戶端。
為了減少不必要的I/O進行緩存是必不可少的,除了Cache數據外,還記錄訪問次數和最后一次訪問的時間,有了這兩個信息對不同的Cache就可以采用不同的緩存調度策略。SmdCache可以一直保存ServiceMetadata信息,因為數據量不會太大,而且為了提高響應效率,可以在服務啟動時就進行加載WMTS服務的ServiceMetadata信息。BundleCache可以采用LRU策略,即最少使用頁面置換算法;TileCache則采用訪問次數計數與LRU相結合的調度策略,替換掉訪問次數少、最久沒有被請求的地圖切片,同樣為了提高訪問速度,在系統啟動開始可以預先加載熱點區域的地圖切片。
開發完成后需要進行嚴格的功能和性能測試,在這里筆者選擇使用Openlayers進行功能測試,結果正常。采用微軟WAST壓力測試工具進行性能測試取得了不錯的成績。
在只有簡單的發布地圖切片的需求時,采用此種方案是可行的,除了能大大的減少成本支出,還具有拷貝即部署的特點。
[1]劉穎.基于ArcGIS Server的移動地圖Mashup應用系統設計與研究[J].北京郵電大學,2012(12).
P208
A
1671-0037(2014)12-102-2
姜成楨,男,工程師,研究方向:測繪與地理信息系統開發。