馬衛(wèi)春,楊友長
(1.安徽省基礎(chǔ)測繪信息中心,安徽 合肥 230031)
隨著互聯(lián)網(wǎng)地圖產(chǎn)業(yè)的蓬勃發(fā)展,如何在帶寬有限的情況下,快速、流暢地在客戶端中顯示電子地圖,已成為任何GIS產(chǎn)品都需要解決的核心技術(shù)問題。 目前,國內(nèi)外主要通過地圖緩存技術(shù)解決該問題,即按照一定的數(shù)學(xué)規(guī)則,把地圖切成一定規(guī)格的小圖片集保存到服務(wù)器上,當(dāng)用戶通過客戶端訪問地圖服務(wù)時,不是由服務(wù)器實時創(chuàng)建一個個地圖瓦片反饋給客戶端,而是在服務(wù)器端直接反饋預(yù)存于服務(wù)器上的地圖瓦片數(shù)據(jù),在客戶端拼接成地圖。這樣,既避免了實時創(chuàng)建地圖瓦片對服務(wù)器帶來的運算負(fù)擔(dān),也減少了客戶端的等待時間,大大改善了用戶體驗。
Python是一門解釋型語言,因為不需要編譯和鏈接的時間,所以可以節(jié)省開發(fā)時間。解釋器能夠交互式使用,可以很方便地測試語言中的各種功能,便于編寫發(fā)布用的程序。Python屬于腳本編程,能夠使枯燥的數(shù)據(jù)處理工作自動化。地圖瓦片的更新涉及眾多操作步驟,使用Python編寫一個腳本,實現(xiàn)定時自動化執(zhí)行,非常適合。ArcGIS Server是ESRI公司出品的一個基于Web的企業(yè)級GIS解決方案。不僅具備發(fā)布地圖服務(wù)的功能,而且還能提供靈活的編輯和強(qiáng)大的空間分析能力。目前,它已經(jīng)成為地圖服務(wù)發(fā)布與WebGIS開發(fā)的重要平臺之一。本文以ArcGIS Server發(fā)布的地圖服務(wù)為基礎(chǔ),進(jìn)行地圖瓦片的定時自動更新方法的研究。
ArcGIS從9.0版本開始提供Python API函數(shù),經(jīng)過多年的不斷完善和擴(kuò)充,截止到10.0版本,Python已成為了ArcGIS地理處理框架的重要組成部分。用戶可以運用ArcGIS提供的Python API開發(fā)包編寫腳本,實現(xiàn)空間數(shù)據(jù)的自動化批量處理,從而簡化工作流程,提高工作的自動化程度。
ArcGIS Server通過一個服務(wù)器對象管理器和若干個服務(wù)器對象容器,實現(xiàn)對地圖服務(wù)資源的管理。服務(wù)器對象管理器,用來管理分布在一組服務(wù)器容器中的服務(wù)器對象。每個服務(wù)器對象容器中,存放著地圖資源的配置服務(wù),服務(wù)一旦被服務(wù)器對象管理器啟用,隨即按照服務(wù)中的配置規(guī)則,自動調(diào)用數(shù)據(jù)層中的數(shù)據(jù)資源,通過服務(wù)器對象管理器向外提供空間數(shù)據(jù)服務(wù),即由服務(wù)器對象管理器通過服務(wù)器對象容器,實現(xiàn)對地圖服務(wù)運行狀態(tài)的控制。
地圖瓦片定時自動更新是通過在服務(wù)端制定一個定時執(zhí)行任務(wù)的方式實現(xiàn)的,即每天定時調(diào)用基于Python語言編寫的腳本程序,實現(xiàn)地圖瓦片的自動更新。地圖瓦片實現(xiàn)自動化更新的基礎(chǔ)如圖1所示,具體流程如圖2所示。
圖1 地圖瓦片自動化更新的基礎(chǔ)
圖2 地圖瓦片自動化更新的流程圖
新建一個ESRI文件庫,存放更新區(qū)域和更新數(shù)據(jù)2類信息。
更新區(qū)域以面狀FeatureClass的形式存放,同時,輸入與該區(qū)域配套的更新參數(shù)。具體包括:更新數(shù)據(jù)所在的位置、用于更新的圖層名稱、待更新數(shù)據(jù)所在位置、待更新圖層的名稱、是否已更新完成、待更新的服務(wù)名稱、更新的比例尺級別以及更新時需要關(guān)閉的相關(guān)服務(wù)名稱。更新數(shù)據(jù)的表結(jié)構(gòu)需與待更新數(shù)據(jù)的表結(jié)構(gòu)一致。
ArcGIS提供的Python API中未提供控制ArcGIS Server服務(wù)狀態(tài)的類或函數(shù), 而在地圖瓦片更新過程中,需要進(jìn)行服務(wù)的終止、啟動操作。為了解決這個問題,我們采用ArcGIS Server提供的AO開發(fā)包,編寫了一個利用ArcGIS Server SOM(服務(wù)對象管理器)控制地圖服務(wù)狀態(tài)的命令行程序。
1)讀取更新區(qū)域的狀態(tài)信息。讀取“更新區(qū)域”是否已處理的狀態(tài)標(biāo)記信息,若已處理過,不再進(jìn)行更新操作;否則,繼續(xù)進(jìn)行更新操作。
2)讀取更新區(qū)域的相關(guān)參數(shù)。讀取地圖瓦片更新所需要的更新區(qū)域、更新服務(wù)名稱、更新比例尺、更新數(shù)據(jù)所在位置、更新數(shù)據(jù)所在圖層、待更新數(shù)據(jù)所在位置、待更新數(shù)據(jù)所在圖層、需要關(guān)閉的相關(guān)服務(wù)名稱。
service_name = getUpdateInfo(cacheFeatures,"MapSer viceName")
…
scales = getUpdateInfo(cacheFeatures,"UpdateScales")
3)更新數(shù)據(jù)。首先,調(diào)用控制ArcGIS Server服務(wù)狀態(tài)的命令行程序,停止待更新及相關(guān)地圖服務(wù);然后,刪除待更新數(shù)據(jù),用更新數(shù)據(jù)替代待更新數(shù)據(jù);最后,啟動待更新及相關(guān)地圖服務(wù)。
//停止服務(wù)
tempservicename ="AGSSOM.exe -x " +pname //pname地圖服務(wù)名稱
os.system(tempservicename)
//刪除待更新數(shù)據(jù)
arcpy.Delete_management(OrigncacheFeatures,"")
//更新數(shù)據(jù)替代待更新數(shù)據(jù)
arcpy.CopyFeatures_management(UpdatecacheFeatue s,OrigncacheFeatures)
//啟動服務(wù)
tempservicename ="AGSSOM.exe -s " +pname //pname地圖服務(wù)名稱
os.system(tempservicename)
4)更新地圖瓦片。基于更新參數(shù),利用ArcGIS Server Python API中提供的UpdateMapServerCache()函數(shù),實現(xiàn)地圖瓦片的更新操作。
gp.UpdateMapServerCache(server_name, service_name, data_frame, layers, constraining_extent, scales,update_mode, thread_count, antialiasing)
5)設(shè)定已更新標(biāo)記。地圖瓦片更新完成后,將更新區(qū)域中的“是否已處理”字段標(biāo)記為“已處理”,避免在此后執(zhí)行自動更新操作時進(jìn)行重復(fù)更新。
以Window 2008 Server操作系統(tǒng)為例,創(chuàng)建一個任務(wù),在地圖服務(wù)訪問空閑期間,如以夜間1點為條件,觸發(fā)腳本程序,自動執(zhí)行地圖瓦片的更新任務(wù)。
地圖瓦片更新腳本程序,每天會在設(shè)定的時間點自動執(zhí)行。程序通過訪問參數(shù)文件庫,讀取其中的更新區(qū)域多邊形數(shù)據(jù)文件,遍歷所有更新區(qū)域多邊形的更新標(biāo)識符字段,進(jìn)而判斷是否需要繼續(xù)執(zhí)行瓦片更新程序。更新過的區(qū)域,程序會將該字段的值賦為“Y”,未更新的區(qū)域該字段則為空。對更新標(biāo)識符字段為“Y”的區(qū)域,不作瓦片更新操作;對更新標(biāo)識符字段為空的區(qū)域,執(zhí)行更新操作,并于操作完成后,將對應(yīng)的更新標(biāo)識符字段的值賦為“Y”?;谏鲜鲈瓌t,地圖瓦片更新程序每次自動啟動后,只對新增的更新區(qū)域執(zhí)行更新操作,對更新過的歷史區(qū)域不作任何瓦片更新操作。若未發(fā)現(xiàn)需要更新的區(qū)域,程序不作任何操作,自動予以關(guān)閉。
地圖瓦片技術(shù)的出現(xiàn),解決了在帶寬和服務(wù)器性能有限的情況下,客戶端地圖瀏覽效率不高、服務(wù)器負(fù)擔(dān)過重的問題。但是,在進(jìn)行地圖瓦片更新的過程中,一直存在著步驟繁瑣、運算時間長等問題。文中所述的地圖瓦片定時自動更新方法,已在“天地圖·安徽”的數(shù)據(jù)更新過程中應(yīng)用,并顯著簡化了工作步驟,提高了工作效率。但是,對于大區(qū)域的地圖瓦片更新,由于更新周期長,無法在夜間完成,會影響到地圖服務(wù)在白天訪問繁忙期的正常使用,不建議使用文中所述的方法進(jìn)行更新。
[1]王強(qiáng).分布式WebGIS地圖緩存策略的應(yīng)用研究[J].軟件導(dǎo)刊,2008,7(5):16-18
[2]李海亭,費立凡,彭清山,等.預(yù)生成思想在地理信息服務(wù)中的應(yīng)用研究[J].測繪信息與工程,2009,34(1):31-32
[3]葉海波,崇潔.ArcGIS 地圖緩存制作簡介[M].北京:Esri中國(北京)有限公司共享服務(wù)事業(yè)部,2011
[4]潘雪婷.基于Python的控件分析模型的實現(xiàn)[D].北京:中國地質(zhì)大學(xué)(北京),2010
[5]王冉陽.基于Web Service的數(shù)據(jù)產(chǎn)品加工服務(wù)系統(tǒng)的設(shè)計與實現(xiàn)[D].北京:中國地質(zhì)大學(xué)(北京),2009
[6]董元,李娜,張廣平.應(yīng)用G_tilelayer的谷歌混合地圖顯示[J].地理空間信息, 2011,9(4):72-74
[7]王磊,林鴻,丘廣新.城市空間數(shù)據(jù)庫動態(tài)更新機(jī)制研究與實現(xiàn)[J].地理空間信息, 2009,7(1):30-33