童凌飛
(1.常州市新北自然資源和規劃技術保障中心,江蘇 常州 213022)
富互聯網應用(RIA)技術作為Web2.0時代的主流技術,在很大程度上超越了瀏覽器的限制,解決了頁面無刷新的異步調用問題,具有豐富美觀的界面和交互能力,可進行快速修改和部署。ArcGIS Server REST API中的Flex和Silverlight代表了WebGIS RIA實現的高峰[1-4]。然而,隨著Adobe和Microsoft相繼停止對新版本的Flex和Silverlight的升級,各大瀏覽器也逐漸停止對插件的支持,ESRI公司也正式從2014年起停止對Flex API和Silverlight API的版本更新和產品維護,RIA開發WebGIS將變得愈發困難[5]。近年來,HTML5技術成為Web瀏覽器既定支持的標準,為HTML原生支持的腳本語言JavaScript API帶來了轉機,JavaScript API將成為ArcGIS Server發布服務的唯一更新和維護的客戶端產品,是未來Web API發展的重點和方向。
ArcGIS API for JavaScript(以下簡稱ArcGIS JS API)是ESRI根據JavaScript技術實現的快速簡潔地創建交互式WebGIS應用的輕量級解決方案。通過Arc?GIS JS API可以調用ArcGIS Server提供的地圖資源或在線資源,繪制和展示空間數據,根據自己的業務需求聚合不同服務器、不同類型的服務,借助封裝的功能類對地圖和數據進行空間查詢、分析等,實現地圖應用和地理處理功能[6-9]。通過符號化實現專題圖的生成和展示專業的分析結果,并提供導出多種格式的地圖和服務器端打印地圖的功能。
ArcGIS JS API開發的應用系統一旦部署到Web應用服務器上向公眾開放,用戶便可在瀏覽器端或移動端進行訪問和操作請求,此時ArcGIS JS API一直偵聽用戶的操作行為。當用戶發起查詢或分析請求時,ArcGIS JS API捕捉到請求消息后將其轉化為RESTful形式的HTTP請求提交給ArcGIS Server,同時附帶請求的地址和參數。ArcGIS Server在接收到REST請求后進行處理,生成JSON格式的結果,再以REST請求的響應返回給ArcGIS JS API。ArcGIS JS API對響應數據進行解析轉化成API中的對象,客戶端應用程序最后將結果可視化地展示在用戶面前,完成WebGIS應用與服務器的數據交互和通信。ArcGIS JS API在整個通信過程中所起的作用如圖1所示。

圖1 Arc GIS API for JavaScript的運行原理
ArcGIS JS API可以根據實際的應用需求構建復雜的空間分析,例如,在城市資源管理應用中,城市資源的管理單位需要以預制的或者自定義的范圍線分析儲備地塊相應的城鄉規劃、土地利用規劃、土地利用現狀、公建配套、周邊住宅等各類專題的屬性信息,并要求按照相應標準的用地性質以唯一值符號在地圖上進行渲染顯示,同時標注用地性質和圖上裁切部分的面積。此類需求可轉化為以簡單幾何多邊形范圍裁切附帶屬性的幾何多邊形組合,獲取裁切后的幾何多邊形組合的屬性和裁切后所得的面積,同時在地圖上匹配顯示。幾何多邊形組合的裁切可使用ArcGIS JS API中相應的裁切方法調用幾何服務進行裁切處理,但是,ArcGIS Server的幾何裁切服務僅僅返回裁切后的多邊形組合的幾何形狀,且裁切所得的各個多邊形面積并不能直接獲得,應當間接計算獲取。另外,多邊形組合中各個單體的屬性信息并未予以返回,如果要將原有屬性、原始的渲染符號與面積正確的配對,那么應專門對其進行處理。
地理處理服務(GP服務)表現為一系列空間操作和分析信息的工具集,每一個已發布的工具可執行一項或多項操作,如進行坐標轉換、緩沖區分析等。每一個工具接收輸入參數,如要素集、表、屬性值,對輸入的數據進行操作處理,輸出符合要求的結果,客戶端可對結果進一步處理得出最終需要的成果。本文的多邊形裁切、面積計算和屬性配對等操作均可使用GP服務。要使用GP服務,需先建立GP模型。在ModelBuilder窗口中可創建、編輯和管理模型[10],按照先裁切,再計算裁切面積,最后進行屬性配對的順序,在可視化的窗口中創建GP模型,如圖2所示。

圖2 空間裁切分析配對的GP模型
輸入參數中指定了用于裁切的多邊形、被裁切的多邊形組合、輸出類型以及輸出要素的關聯屬性,輸出參數為空間求交裁切分析所得的多邊形組合要素,最后的結果為屬性、面積等與多邊形幾何、渲染符號配對所得的結果。
圖2中構建的GP模型在ArcMap中運行成功后即可發布成GP服務。發布過程中,需要指定GP服務的名稱,設置必填的輸入參數。GP模型圖中,將裁切多邊形定義為inputPolygon,類型為Feature Set,被裁切的多邊形組合定義為inputFeatures,類型為Feature Class。通常GP服務有同步任務執行調用和異步任務執行調用2種方式,分別對應execute方法和submitJob方法。為了減少用戶等待的時間,提高用戶體驗,本文選擇以異步調用的方式將GP模型發布成服務。當GP服務異步執行并成功處理完成后,在回調函數中可對返回的輸出結果作進一步的處理,最終在瀏覽器端渲染到地圖上進行展示,如圖3所示。在實際應用中,為便于清晰地展示圖面,圖3中僅顯示當前比例尺下圖面面積大于50的地塊標注。

圖3 調用GP服務對結果渲染顯示
ArcGIS JS API調用幾何服務進行異步求解面積的速度較快,無需等待當次的計算結果即可進行下一個多邊形要素的面積計算。但求解得到面積之后,無法在計算結束的同時獲知是哪一個要素的面積,計算所得結果無法和多邊形要素及其屬性進行配對。可取的做法是將異步請求幾何服務計算面積改為同步請求,依次計算裁切后的多邊形要素面積,在多邊形組合要素的面積全部求解完成之后,再與地塊要素屬性和渲染符號進行匹配關聯,最后將結果在瀏覽器端渲染顯示。
上一種方法將求解面積的任務轉給了ArcGIS Server,客戶端再利用ArcGIS API進行調用,此種情況并未充分利用客戶端的資源。為充分挖掘客戶端的計算能力,發揮客戶端本機計算耗時較少的優勢,將求解裁切后的多邊形面積的任務交由客戶端進行處理。由于GeometryEngine是ArcGIS JS API提供的客戶端幾何引擎,可使開發者在缺少ArcGIS Server支持的環境下進行相關的幾何操作,另外,在效率優先的需求下,該幾何引擎是均衡負載的最佳選擇方案。在裁切完成后,即可調用GeometryEngine的面積計算方法對裁切后的多邊形組合要素進行面積計算。當然,也可以使用自定義的方法在客戶端本地計算幾何面積。面積計算完成之后,存儲多邊形與面積之間的對應關系,再次發起異步請求查詢地塊屬性與之匹配,最后按照查詢所得的屬性獲取渲染符號進行圖面顯示。對于被裁切的多邊形組合要素而言,例如劃定的多邊形范圍足夠大,此時調用GeometryEngine進行處理,必然會將過多的數據資源壓入到內存堆棧中,瀏覽器的內存不斷增大,這樣勢必造成瀏覽器的崩潰,影響幾何處理效率。因此,這種情形宜采用ArcGIS Server來進行幾何裁切,將大量的計算直接交由服務器承擔。對于小數據量的空間裁切則可以直接由客戶端進行計算,此時GeometryEngine的計算效率要比GeomertySer?vice Task高很多。
為比較上述3種裁切分析方法的性能優劣,針對不同的分析裁切范圍設計了三組實驗,每一組實驗所裁切的空間范圍大致呈倍數遞增。每一組實驗在相同的條件下分別測試3種方法的性能,每一種方法測試3次。用作測試的客戶機配置以及網絡配置情況如表1所示。

表1 客戶機和網絡環境配置情況
在以上測試環境下,取得的實驗結果如圖4~6所示。為便于表述和顯示,下文將以上3種方法分別標為方法1、方法2和方法3。
方法1:利用ArcGIS JS API調用GP服務實現復雜空間裁切分析的方式,將空間裁切、幾何運算、面積計算、符號配對與屬性配對等操作全權交由服務器進行處理,充分利用了服務器的資源和高效的運算能力。從實驗的結果來看,由于網絡延遲和數據傳輸的容量限制等客觀因素,運行效率不高。尤其當裁切分析中等范圍和小范圍時,并不能體現服務器端處理請求的性能優勢。當裁切分析的范圍足夠大時,其運行效率的優勢才有所體現。方法2:先空間裁切分析后,再同步調用幾何服務的方式,從圖4~6可以看出,隨著裁切分析范圍的增大,分析響應的時間甚至比調用GP服務的響應時間還要長,此種方法的弊端顯而易見。方法3:先空間裁切分析,再在客戶端同步請求計算面積最終異步實現配對渲染顯示的方式,不僅利用了服務器端的處理能力,也充分考慮了客戶端的計算優勢,找到了兩者之間的負載均衡,使得數據交互和通信不全依賴于網絡傳輸的速率,是對前兩種方法的改進。這種方法在中、小型裁切范圍的空間分析時性能優勢尤其顯著。

圖4 裁切小范圍分析測試結果

圖5 裁切中等范圍分析測試結果

圖6 裁切大范圍分析測試結果
本文在分析ArcGIS JS API的運行原理的基礎上,對比剖析了基于ArcGIS JS API的復雜空間裁切分析的幾種實現方法,筆者通過研究以及應用發現,先空間裁切分析再利用客戶端本地資源進行同步計算裁切的幾何面積,最終異步執行配對渲染和顯示的方式,是比較可取的實現方法。對于用戶體驗的改善,挖掘客戶端的計算潛力,均衡服務器端的負載具有顯著的體現。可見,利用此種方法進行復雜空間裁切分析的同時,結合其他數據展示、分析的第三方API開發包,可以實現功能更加強大,分析數據展示更加直觀的WebGIS應用。在ArcGIS平臺下融入HTML5技術,ArcGIS JS API將在國土空間規劃大數據的應用實踐中發揮更大的作用。