■唐海濤劉樹彬
(1中國水電顧問集團華東勘測設計研究院有限公司 浙江杭州 310014;2 ESRI(中國)信息技術有限公司上海分公司 上海 200030)
基于ArcGIS的終端圖形動態優化方法研究及應用
■唐海濤1劉樹彬2
(1中國水電顧問集團華東勘測設計研究院有限公司 浙江杭州 310014;2 ESRI(中國)信息技術有限公司上海分公司 上海 200030)
ArcGIS的終端在地圖上展示實時數據是采用動態繪制Graphic元素的方式,需要依靠終端的能力來渲染,但是Graphic元素在數據量過大時對終端的性能影響十分明顯。本文詳細闡述了一種基于ArcGIS的終端Graphic元素動態優化的算法,可以抽稀線或面的節點數量,去掉多余的對圖形顯示無貢獻的節點,從而達到動態優化數據、提高渲染性能的目的。
ArcGIS終端圖形動態優化
ArcGIS軟件是美國ESRI公司生產的大型GIS系統軟件,它作為一個可伸縮的平臺,無論是在服務器,在桌面,在野外還是通過Web或移動終端,為個人用戶也為群體用戶提供GIS的功能。產品包括桌面GIS(ArcGIS Desktop)、嵌入式GIS(ArcGIS Engine)、服務端GIS(ArcGIS Server)、地理數據庫引擎ArcSDE及其開發組件ArcObjects(以下簡稱AO)、地理處理服務Geoprocessing(以下簡稱GP)等[1]。
ArcGIS的所有終端(C/S、B/S及各種移動終端)在展示動態數據、實時渲染和查詢高亮等地圖顯示上都依賴于在終端實時動態繪制Graphic元素的方式。Graphic一般放在GraphicLayer中,屬于終端維護的對象,依靠終端的能力來渲染和展示,給地圖增加了互動和動態效果。但是Graphic對象在數據量大、結構復雜(節點數據多的線或面)的情況下實時渲染,對終端的性能影響十分明顯。ArcGIS終端屏幕上有超過一千個點的Graphic進行渲染,有關地圖的操作就會變得非常卡,甚至造成瀏覽器無響應。例如,在使用GPS監控的應用中,其GPS軌跡監控展示直接采用讀取數據庫坐標,然后以Graphic Line的方式動態展示位置軌跡,但由于GPS監控刷新間隔短、監控對象多,具有大數據量節點的Graphic Line復雜線的渲染大大影響了終端性能。
通常基于大數據量節點的Graphic渲染的應用都進行了點抽稀,在小比例尺的時候,相鄰點聚合為一個點來顯示,隨著比例尺的放大,再根據范圍慢慢增加直至顯示所有的點[2]。此方法較好的解決了大數據量POI(Point Of Interest)點的Graphic顯示問題,但不能解決線和面的顯示問題。事實上大數據量節點的線和面對終端的性能影響更加嚴重,一條外形簡單的線或面,其節點數也可能超過上萬個。如果說一次渲染上千個Graphic點,地圖操作性能急劇下降,那么在這種情況下,即使顯示一條線或一個面,地圖的響應都會非常遲鈍。
實際上,與大數據量POI點的顯示一樣,在小比例尺的時候,沒有必要顯示線或者面中的所有節點,只當放大到一定比例尺后,才需要高精度顯示線和面的邊線。在線和面中,由于數據制作方式的不同,會存在大量對顯示無貢獻的節點(即超過兩個節點在同一直線上)。所以優化Graphic線和面節點的顯示數目,去掉多余的對顯示無貢獻的節點,必將大大提高地圖顯示和操作的效率。
針對上述問題,本文提出一種基于ArcGIS的終端Graphic圖形元素中動態優化抽稀線和面節點的算法。
1.1 技術路線
本算法計算和比較相鄰兩節點直線之間的斜率來取舍節點,斜率大于特定值的為關鍵節點,其余為非關鍵節點。通過保留關鍵節點,來達到抽稀優化的目的。算法結果可以自定義控制抽稀的程度,能較好的保留關鍵節點,從而大大減少不必要的節點數量,提高顯示和操作性能。

圖1 技術路線圖
算法主要步驟如圖1所示,首選檢查并精簡坐標值相同的相鄰節點,然后計算相鄰節點直線的斜率,自定義抽稀程度系數作為閾值,根據斜率是否小于此閾值來取舍節點,達到抽稀優化線或面節點數量的目的。在動態優化時整個計算過程迭代進行,每次迭代最多抽稀線或面節點數量的一半,最大限度的保證線或面的平滑度。一般認為在抽稀程度系數為0的條件下進行的抽稀對圖形的構造無任何影響。
1.2 算法簡介
在線某相鄰的三個節點中,計算第一節點和第二節點連線的斜率,第二節點和第三節點連線的斜率,得到兩斜率之差的絕對值為result。如果result=0,證明節點二為多余的,去除之。如圖2所示。

圖2 抽稀程度系數為0的情況

圖3 自定義抽稀程度系數的情況
如果設定了抽稀程度系數需要進行自定義抽稀,那么如果result<抽稀程度系數,則認為節點二為非關鍵節點,從線構造中去除之。如圖3所示。
K1、K2分別為P1P2和P2P3的斜率,如果|K1-K2|<抽稀程度系數,則P2為非關鍵節點,關鍵代碼示例如下:
if(Math.abs((P2.y-P1.y)/(P2.x-P1.x)-(P3.y-P2.y)/(P3.x-P2.x)) <=MaxTan)
{
singleline.removePoint(pathsIndex,k+1);
}
備注:代碼中MaxTan為抽稀程度系數。

圖4 動態抽稀優化過程


圖5 抽稀程度系數為0的效果
1.3 動態優化
通常情況下,選擇合適的抽稀程度系數對線或面進行抽稀后再在終端進行渲染和顯示,既可以使抽稀后的圖形與原圖的構造保持一致,又能大大提高終端的渲染速度。為達到此目的,在比例尺固定且終端界面上Graphic圖形元素數量不變的情況下,此抽稀程度系數一般存在一個最優值。但是在比例尺動態變化或者比例尺固定但是終端界面上(由于平移地圖導致)出現的Graphic圖形元素數量過多的情況下,需要動態設置抽稀程度系數,以保持終端界面上所有Graphic圖形的節點數量不能超過設定的閾值。這個閾值是保證終端的渲染效率和操作流暢性的前提,針對終端類型多樣性和性能差異,可通過接口提供給用戶設置。如果Graphic圖形元素的節點數量不超過規定閾值,可以將抽稀程度系數設置為0,精確顯示線、面圖形;如果Graphic圖形元素的節點數量超過了規定閾值,可視情況處理:
(1)終端上Graphic圖形元素數量不變,比例尺動態變化。此情況一般在終端上所有Graphic圖形元素已經全部顯示,并且地圖進行了縮放的操作時發生。在大比例尺下可以將抽稀程度系數設置為較小的值,使抽稀后的節點數量低于閾值,并且保持圖形構造不發生大的變化;在小比例尺下可以將抽稀程度系數設置為較大的值,使抽稀后的節點數量低于閾值,并且不影響終端上圖形的顯示效果。
(2)比例尺固定不變,終端上Graphic圖形元素數量過多。此情況一般在地圖平移后終端界面上顯示出了其他的圖形元素時發生。將原來的抽稀程度系數加大,使抽稀后的節點數量低于閾值,并且保持圖形構造不發生大的變化。
實際操作過程中,可以簡單的將抽稀程度系數設置一個范圍并以某個步長(例如0.1)進行累加,迭代抽稀過程,直至Graphic圖形元素的節點數量低于規定閾值。動態抽稀優化過程如圖4所示。
此算法和實現方式可以在ArcGIS Engine、JavaScriptFlexSilverLight、iOS、Andorid及Windows Phone等幾乎所有ArcGIS終端上運行。算法特點包括:
(1)在不影響線和面構造的情況下,可以簡化線和面的節點數量,去掉多余的對顯示無貢獻的節點,從而達到優化數據、提高渲染性能的目的。
(2)根據地圖顯示比例尺或用戶參數設定,可以動態的抽取掉非關鍵節點。在小比例尺下可以將抽稀程度系數設大,這樣抽稀的“厲害”,雖可能造成線和面的一些失真,但在小比例下不影響顯示效果;在大比例尺下可以將抽稀程度系統設小,抽稀算法可以讓抽稀程度無級縮小,線和面的顯示精度可以逐級恢復。
(3)適合所有ArcGIS模塊中線和面Graphic元素的顯示渲染,包括終端和服務器端;
(4)ArcGIS AO中Generalize方法及ArcToolbox中的Simplify Line模塊[3]提供相似功能,但即使作為后臺簡化FeatureClass來使用,其效率亦高于AO本身的方法,并且AOGP的方法無法直接對客戶端的Graphic元素進行優化。
通過此算法優化,可以去掉多余的對顯示無貢獻的節點,當抽稀程度系數設為0時,可在圖形無任何失真的同時,大大的精簡圖形的節點數量。如圖5為一份河流(線)數據在抽稀程度系數為0的條件下去除多余節點的效果,優化過程對線的構造無任何影響。
根據不同的場景,通過動態設置抽稀程度系數來優化顯示線和面Graphic元素,提高終端渲染效率。如圖6所示,在不同的比例尺下,被抽稀掉的河流線節點數量是不同的。在某一大比例尺下,河流的線圖層中所有線的節點總數為225043,優化去掉的節點數為221432,只剩下3611個節點,左邊圖中紅色線條為優化后的細節效果,藍色的為真實線的構造。通過優化節點數量后,圖形的失真程度較小,但節點總數大大降低,地圖顯示和操作流暢性更加明顯。

圖6 動態抽稀優化的效果
在位置監控的應用中一般包含獨立的存儲GPS點信息的數據庫表[4],如果通過實時讀取數據庫,以Graphic Line的方式動態展示移動物體的軌跡,當監控目標超過一定數量后,地圖操作性能急劇下降。而通過本算法進行線節點抽稀優化,根據比例尺的大小,決定線節點的優化程度,實時去除多余節點,并在終端對優化后的圖形進行動態渲染。實踐證明,此方法比通過坐標創建AO對象,調用Generalize進行優化并生成Graphic的效率高很多。
本算法在需要將線和面Graphic的顯示和渲染通過控制抽稀程度系數來提高性能的,以及在GPS軌跡跟蹤展示、大數據量查詢和分析結果展示、復雜對象高亮顯示、客戶端直接創建線面對象等應用場景中特別有效。本文中筆者主要在Web客戶端進行了算法部署及測試,后續工作中還需要做如下工作:
(1)在ArcGIS API for iOSAndroid中進行部署和測試。
(2)進一步提高算法穩定性,優化宏觀上節點的動態抽稀過程;
(3)用后臺代碼將算法封裝成一個檢查多余節點的GP常用工具,用于減少線和面數據源的多余節點,以供數據檢查、處理、優化使用。
[1]ESRI中國 (北京)有限公司.ESRI公司ARCGIS系列產品介紹.2004.
[2]陳永劍.基于ArcGIS10的點抽稀應用 [J].城市建設理論研究,2011,(31).
[3]熊萍.3S綜合調繪法在農村土地利用現狀調查中的試驗研究 [D].西安:長安大學. 2010.
[4]吳建華.基于ArcGIS Engine的車輛監控GIS系統開發 [J].地球信息科學學報,2011,13(1):88-93.
P208[文獻碼]B
1000-405X(2015)-11-143-3