王朝輝,楊 潔
(江蘇省測(cè)繪工程院,江蘇 南京 210013)
隨著國(guó)家智慧城市建設(shè)的快速發(fā)展,電子地圖建設(shè)已成為各行各業(yè)信息化建設(shè)不可缺少的重要基礎(chǔ)支撐。城市規(guī)模日益擴(kuò)大,經(jīng)濟(jì)技術(shù)的快速發(fā)展,決定著電子地圖中各要素信息的數(shù)據(jù)量不斷增加,更新頻率也在不斷加速。這對(duì)智慧城市建設(shè)的信息化和數(shù)字化提出了更高要求,所以如何進(jìn)行空間數(shù)據(jù)收集和整理工作也變得越來(lái)越重要。
POI點(diǎn)(地名地址點(diǎn))作為電子地圖的重要要素,其重要性日益明顯。其數(shù)據(jù)量大、地理位置分布密級(jí)稀疏不規(guī)則性,決定著其無(wú)法全局顯示,需要根據(jù)其空間和屬性特征進(jìn)行相應(yīng)提取處理,即為點(diǎn)的抽稀處理。如何更高效更合理的分析和挖掘POI數(shù)據(jù),合理地將其在電子地圖中,按各顯示比例和抽稀距離正確均勻標(biāo)注,并且顧及其相應(yīng)的要素屬性,是POI點(diǎn)數(shù)據(jù)整理過(guò)程的重要工作環(huán)節(jié),也是POI點(diǎn)抽稀工作的最終目標(biāo)。
結(jié)合目前常規(guī)點(diǎn)抽稀方法的局限性,設(shè)法研究高效的抽稀方法也是當(dāng)前數(shù)據(jù)處理技術(shù)的發(fā)展趨勢(shì)。本文主要介紹在傳統(tǒng)方法進(jìn)行點(diǎn)抽稀的基礎(chǔ)上,基于Python的Arcpy編程語(yǔ)言,編制的POI數(shù)據(jù)的一鍵式自動(dòng)抽稀工具,從而做到運(yùn)用編程手段實(shí)現(xiàn)數(shù)據(jù)處理過(guò)程的作業(yè)流程優(yōu)化,為海量數(shù)據(jù)點(diǎn)的多比例尺抽稀工作帶來(lái)了便利。
POI點(diǎn)數(shù)據(jù)通常數(shù)據(jù)量大、分布不均勻、地理位置疊加復(fù)雜,在制作電子地圖過(guò)程中,為了注記標(biāo)注均勻、取舍有度、直觀有效,達(dá)到制圖美觀的效果,經(jīng)常需要對(duì)POI點(diǎn)進(jìn)行抽稀處理。目前ArcGIS的3種最常用點(diǎn)抽稀的方法[1],分別為:Maplex自動(dòng)點(diǎn)抽稀,Subset點(diǎn)抽稀和SubPoint點(diǎn)抽稀[2]。3種方法進(jìn)行的優(yōu)缺點(diǎn)對(duì)比和適用范圍如表1所示。
表1 3種點(diǎn)抽稀方法優(yōu)缺點(diǎn)對(duì)比表
(1)Maplex牽引線抽稀法:牽引線抽稀是利用ArcGIS的高級(jí)智能標(biāo)注引擎Maplex的牽引線進(jìn)行標(biāo)注,將符號(hào)作為注記顯示,把符號(hào)和注記綁定在一起,通過(guò)閾值自動(dòng)進(jìn)行標(biāo)注間避讓,計(jì)算出地圖上所有標(biāo)注的最佳放置位置,達(dá)到抽稀的目的。
(2)Subset隨機(jī)抽稀法:其核心工具是ArcGIS地統(tǒng)計(jì)分析模塊的“子集要素”工具,該工具對(duì)所有POI數(shù)據(jù)按百分比進(jìn)行隨機(jī)抽稀,抽稀后的興趣點(diǎn)密集度與抽稀前的數(shù)據(jù)密集程度一致,稀疏的地方更稀疏,密集的地方依舊密集,未考慮均勻。
(3)SubPoints插件抽稀法:是Esri中國(guó)自主開(kāi)發(fā)的一個(gè)插件,該工具優(yōu)先考慮點(diǎn)在空間分布上的均勻合理性,并結(jié)合點(diǎn)數(shù)據(jù)中包含的“優(yōu)先級(jí)”屬性進(jìn)行篩選。
參照以上3種點(diǎn)抽稀優(yōu)缺點(diǎn)分析,在天地圖項(xiàng)目中,由于其數(shù)據(jù)量大、精度要求高、有權(quán)重要求,所以在進(jìn)行POI點(diǎn)抽稀工作時(shí),通常采用SubPoints點(diǎn)抽稀方法。
SubPoints點(diǎn)抽稀方法是Esri中國(guó)自主開(kāi)發(fā)的一個(gè)插件,該工具優(yōu)先考慮點(diǎn)在空間分布上的均勻合理性[3],并結(jié)合點(diǎn)數(shù)據(jù)中包含“優(yōu)先級(jí)”屬性進(jìn)行篩選。通過(guò)獲取每個(gè)點(diǎn)在一定范圍內(nèi)具有的相鄰點(diǎn)的數(shù)目信息,得到地圖中點(diǎn)密度的分布狀況,具體操作流程如圖1所示。
圖1 SubPoints點(diǎn)抽稀方法流程圖
電子地圖在不同比例尺下,POI點(diǎn)群數(shù)量有很大差別,根據(jù)每個(gè)級(jí)別的點(diǎn)距離設(shè)置大小不同,各級(jí)別抽稀參數(shù)需要特別定制[4],同時(shí)每一級(jí)別都需要根據(jù)上一級(jí)別的抽稀成果進(jìn)行抽稀處理,從而保證上一級(jí)別顯示的注記在當(dāng)前級(jí)別都能出現(xiàn)。即從L20-L19-L18……,數(shù)據(jù)提取順序如圖2所示。
圖2 L10-L20級(jí)數(shù)據(jù)抽稀提取順序圖
所以,在進(jìn)行海量地名地址點(diǎn)從第10級(jí)至第20級(jí)多比例尺級(jí)別抽稀過(guò)程中,需要人工進(jìn)行多次交互,多次處理才能完成。
隨著社會(huì)經(jīng)濟(jì)的快速發(fā)展,測(cè)繪成果的需求也在不斷的提高,隨之而來(lái)的對(duì)電子地圖數(shù)據(jù)需求和現(xiàn)勢(shì)性要求也越來(lái)越高。面對(duì)海量的地名地址點(diǎn),如何更高效的研究新技術(shù)和新方法,完成電子地圖制作的各項(xiàng)數(shù)據(jù)處理工作,變得越來(lái)越重視。
基于Python和ArcPy編輯處理工具是目前比較常用的開(kāi)發(fā)方式,此方法可以實(shí)現(xiàn)自動(dòng)化處理重復(fù)的、多步驟的數(shù)據(jù)處理工作,減少人工參與度,提高工作效率,做到工作流程的優(yōu)化,為數(shù)據(jù)快速更新提供有效的技術(shù)支持。
現(xiàn)階段,點(diǎn)抽稀工作一直是我們?cè)谶M(jìn)行電子地圖配圖過(guò)程中,非常重要的一項(xiàng)工作。也是一個(gè)必不可少的環(huán)節(jié),我們?cè)谶M(jìn)行點(diǎn)抽稀工作前,需要進(jìn)行一系列的數(shù)據(jù)預(yù)處理,比如數(shù)據(jù)的優(yōu)先級(jí)設(shè)置、點(diǎn)距離設(shè)定等工作,然后再運(yùn)用抽稀方法進(jìn)行抽稀處理,實(shí)現(xiàn)地名地址點(diǎn)的有效及合理應(yīng)用。
常規(guī)的SubPoints點(diǎn)抽稀方法,是人工加程序交互的處理方式,存在較多弊端:① 人工參與度高,容易出現(xiàn)誤操作;② 工具運(yùn)行錯(cuò)誤時(shí)不能及時(shí)修復(fù);③ 工作效率較低、處理時(shí)間長(zhǎng);④ 抽稀步驟太多,不容易掌握。
所以,常規(guī)點(diǎn)抽稀方法已經(jīng)越來(lái)越不能適應(yīng)目前測(cè)繪市場(chǎng)的應(yīng)用需求,研究如何能更簡(jiǎn)單快捷的完成抽稀工作已經(jīng)成為當(dāng)前非常必要的研究?jī)?nèi)容。
Python是一種開(kāi)源的面向?qū)ο蟮慕忉屝陀?jì)算腳本語(yǔ)言,有豐富的資源庫(kù)。由于Python 處理速度快、功能強(qiáng)大且具有廣泛的認(rèn)可度,ESRI 選擇它作為腳本語(yǔ)言嵌入ArcGIS 中。
ArcPy是一個(gè)原生的Python站點(diǎn)包,它涵蓋并進(jìn)一步加強(qiáng)了ArcGIS的arcgisscripting模塊的功能?;赑ython和ArcPy方法進(jìn)行GIS數(shù)據(jù)處理方法開(kāi)發(fā),既可以運(yùn)用Python語(yǔ)言的簡(jiǎn)單性和高效性,又可以直接調(diào)用ArcGIS已有的成熟的GIS處理工具,做到自由組合、相輔相成、高效專業(yè),是當(dāng)前比較成熟有效的開(kāi)發(fā)方式[5]。
所以,基于Python和ArcPy實(shí)現(xiàn)數(shù)據(jù)自動(dòng)化處理的方法可行并且有效。運(yùn)用該方法可以編寫(xiě)代碼實(shí)現(xiàn)GIS數(shù)據(jù)處理的多個(gè)環(huán)節(jié)、多個(gè)循環(huán)的自動(dòng)讀取、遍歷、更新、轉(zhuǎn)換、融合等處理,實(shí)現(xiàn)自動(dòng)化完成多個(gè)工序的功能[6]。
本文運(yùn)用Python方法實(shí)現(xiàn)點(diǎn)抽稀功能[7],是在結(jié)合SubPoints方法基礎(chǔ)上,進(jìn)行了一系列的優(yōu)化處理,同時(shí)考慮各級(jí)別顯示內(nèi)容一致性限制的情況下完成。具體點(diǎn)抽稀要求為:① 上下級(jí)顯示的地名地址點(diǎn)內(nèi)容要一致(本級(jí)顯示的點(diǎn),在下一級(jí)必須顯示);② 優(yōu)先選擇優(yōu)先級(jí)高的點(diǎn);③ 優(yōu)先級(jí)一樣時(shí),優(yōu)先選擇NAME內(nèi)容短的點(diǎn);④ 優(yōu)先級(jí)和NAME長(zhǎng)度一樣時(shí),任意選一個(gè)點(diǎn);⑤ 保證抽稀成果的均勻性,并滿足各級(jí)別抽稀間距符合各級(jí)抽稀距離限制。
結(jié)合點(diǎn)抽稀的具體要求,進(jìn)行編程方法的抽稀數(shù)據(jù)的處理流程設(shè)計(jì),構(gòu)建數(shù)據(jù)提取、篩選和Update數(shù)據(jù)處理流程。本方法的抽稀順序是從10級(jí)到20級(jí),即從小比例尺到大比例尺順序進(jìn)行抽稀,具體流程圖如圖3所示。
圖3 抽稀方法流程圖
流程說(shuō)明:
(1)本方法需要的輸入?yún)?shù)分別是:優(yōu)先級(jí)、NAME、DISPLEVEL字段(數(shù)據(jù)顯示級(jí)別字段參數(shù))。DISPLEVEL(用于標(biāo)記各級(jí)別顯示級(jí)別數(shù)):根據(jù)各比例級(jí)別顯示要素要求,填寫(xiě)相應(yīng)數(shù)字,如火車站、公園可以從13級(jí)顯示的,即填寫(xiě)13;公司企業(yè)、工廠等只能在16級(jí)開(kāi)始顯示的,填寫(xiě)16。
(2)首先根據(jù)各字段的“優(yōu)先級(jí)”和“NAME”字段長(zhǎng)度,編輯填寫(xiě)yxjname字段。
(3)遍歷選擇每一級(jí)中DISPLEVEL<=n的點(diǎn),設(shè)置為lyrpoi_n。
(4)用DISPLEVEL<=n-1的點(diǎn),對(duì)lyrpoi_n按當(dāng)前級(jí)別抽稀距離選擇,將選中的點(diǎn)設(shè)置DISPLEVEL=n+1(用上一級(jí)篩除部分點(diǎn))。
(5)對(duì)剩下的lyrpoi_n點(diǎn),提取其yxjname,得到無(wú)重復(fù)元素的List_yxjname列表。
(6)按從小到大順序讀取List_yxjname列表,遍歷各yxjname的要素點(diǎn),對(duì)該要素點(diǎn)進(jìn)行抽稀處理。
(7)n級(jí)處理完成后,再進(jìn)行n+1級(jí)處理。
點(diǎn)抽稀的對(duì)象通常是數(shù)以萬(wàn)計(jì)的POI點(diǎn)大數(shù)據(jù)處理,所以計(jì)算方法的模型設(shè)計(jì)非常關(guān)鍵。本方法研究過(guò)程中,為提高抽稀方法的可行性和有效性,進(jìn)行了多種算法對(duì)比和編碼模型優(yōu)化,目前抽稀結(jié)果在滿足項(xiàng)目抽稀要求的前提下,提取效率顯著提高。
2.5.1 按距離抽稀
抽稀條件只有距離時(shí),只要將遍歷點(diǎn)范圍內(nèi)按距離均勻提取中心點(diǎn),其他點(diǎn)設(shè)置下一級(jí)顯示,然后遍歷下一個(gè)循環(huán)處理即可。圖4(a)按距離抽稀展示圖中紅色POI點(diǎn)為抽稀結(jié)果,其分布均勻,簡(jiǎn)單有效,但其抽稀方式不滿足出圖要求,不可取。
圖4 點(diǎn)抽稀展示圖
2.5.2 按距離和優(yōu)先級(jí)抽稀
按距離和優(yōu)先級(jí)兩個(gè)條件抽稀時(shí),如果先按距離選擇出分組點(diǎn),然后再?gòu)脑摲纸M點(diǎn)中找到優(yōu)先級(jí)最高點(diǎn)提取,其他設(shè)置下一級(jí)顯示,這樣抽稀結(jié)果即為圖4(b)按距離和優(yōu)先級(jí)抽稀展示圖中紅色POI點(diǎn)所示,其抽稀結(jié)果分布不均勻,抽稀不正確。
2.5.3 本方法的抽稀
本方法的抽稀流程圖,能有效實(shí)現(xiàn)按距離、優(yōu)先級(jí)以及NAME名稱長(zhǎng)度進(jìn)行逐級(jí)分布式提取,并能實(shí)現(xiàn)成果點(diǎn)均勻分布,做到周密有效。
算法說(shuō)明(如抽稀K級(jí)):
(1)設(shè)置抽稀對(duì)象為DISPLEVEL <=K(從高級(jí)往低級(jí)抽稀)。
(2)用DISPLEVEL <=K-1的點(diǎn)選擇DISPLEVEL=K,并將選中的點(diǎn)設(shè)置DISPLEVEL <=K+1(將上一級(jí)的點(diǎn)周圍距離的點(diǎn)設(shè)置下一級(jí)顯示)。
(3)遍歷DISPLEVEL <=K的所有點(diǎn)(遍歷逐個(gè)處理)。
(4)如圖4(c)左側(cè),遍歷到點(diǎn)1,按位置選擇周圍抽稀距離范圍內(nèi)的點(diǎn),設(shè)為:組i。
(5)從組i中,選擇優(yōu)先級(jí)最高的點(diǎn),設(shè)為:點(diǎn)2,如圖4(c)右側(cè)。
(6)用點(diǎn)2按位置選擇周圍抽稀距離范圍內(nèi)的點(diǎn),令其DISPLEVEL <=K+1。
(7)繼續(xù)在剩下的組i中,選擇優(yōu)先級(jí)最高的點(diǎn),同點(diǎn)2進(jìn)行處理。
(8)重復(fù)(7)步驟,直到組i中的點(diǎn)全部篩查完畢。
(9)遍歷到下一個(gè)處理點(diǎn),重復(fù)到(4)步驟,直到K級(jí)別中的點(diǎn)全部篩查完畢。
(10)進(jìn)行K+1級(jí)抽稀處理,重復(fù)(1)步驟。
以上方法,運(yùn)用編碼進(jìn)行分級(jí)分批遍歷處理,并結(jié)合按位置選擇、按屬性選擇、屬性計(jì)算、點(diǎn)距離分析等計(jì)算方法,搭建多循環(huán)多遍歷模型,這種層層套疊的計(jì)算流程,有效滿足抽稀要求,最終實(shí)現(xiàn)抽稀工作的全自動(dòng)處理,進(jìn)一步提高數(shù)據(jù)處理的工作效率,有效可取。
2.6.1 篩選次數(shù)的簡(jiǎn)化
抽稀條件中說(shuō)明數(shù)據(jù)提取方式為:優(yōu)先根據(jù)優(yōu)先級(jí)進(jìn)行提取,若提取數(shù)量大于1,則再根據(jù)NAME長(zhǎng)短進(jìn)行提取,若提取結(jié)果仍然大于1,則隨機(jī)提取。本方法通過(guò)代碼優(yōu)化處理,將優(yōu)先級(jí)和NAME兩個(gè)字段的內(nèi)容融合成yxjname字段,成功地將優(yōu)先級(jí)和NAME字段長(zhǎng)度兩次篩查合并成一次篩查,達(dá)到簡(jiǎn)化篩選步驟,優(yōu)化處理方法的效果。
2.6.2 優(yōu)化遍歷對(duì)象
本次抽稀的遍歷對(duì)象是yxjname列表,通過(guò)逐個(gè)讀取該列表中從小到大順序的值,實(shí)現(xiàn)yxjname權(quán)重從高到低提取,逐個(gè)遍歷yxjname列表,設(shè)置POI點(diǎn)進(jìn)行抽稀處理。將計(jì)算對(duì)象從每個(gè)點(diǎn),轉(zhuǎn)換成yxjname列表元素,大幅度地減少了遍歷海量對(duì)象次數(shù),減少抽稀循環(huán)計(jì)算量,達(dá)到優(yōu)化計(jì)算方式,進(jìn)一步提高抽稀速度。
2.6.3 先用上一級(jí)提取點(diǎn)過(guò)濾掉部分點(diǎn)
由抽稀處理的第一個(gè)條件可知,上一級(jí)的點(diǎn)在本級(jí)必須顯示。本方法在抽稀各級(jí)別前,首先進(jìn)行疊加分析處理:運(yùn)用Arcpy的SelectLayerByLocation_management工具,在當(dāng)前級(jí)抽稀處理前,先用上一級(jí)抽稀成果點(diǎn),按位置選擇本級(jí)抽稀距離范圍內(nèi)的點(diǎn),設(shè)置其在下一級(jí)顯示。這樣就能避免后期計(jì)算時(shí),不會(huì)將上級(jí)的點(diǎn)抽稀過(guò)濾掉,實(shí)現(xiàn)上級(jí)點(diǎn)在本級(jí)一定顯示的要求。
通過(guò)這項(xiàng)處理,實(shí)現(xiàn)上級(jí)提取點(diǎn)在本級(jí)一定顯示的目的,同時(shí)提前過(guò)濾部分點(diǎn),減少抽稀計(jì)算對(duì)象,優(yōu)化抽稀算法。
2.6.4 優(yōu)先處理頻率高的點(diǎn)
POI點(diǎn)數(shù)據(jù)量大且分布不均,地理位置的稀疏和稠密程度沒(méi)有規(guī)律。優(yōu)先計(jì)算點(diǎn)密度高的區(qū)域,不但可以快速地過(guò)濾掉較多點(diǎn),而且可以更精確地提取出優(yōu)先級(jí)高的點(diǎn),做到提高處理速度,優(yōu)化計(jì)算方法。
本方法在代碼編輯過(guò)程中,調(diào)用了Arcpy的Frequency_analysis方法,計(jì)算出點(diǎn)距離表中各點(diǎn)的疊加頻數(shù),通過(guò)讀取頻數(shù)高的點(diǎn)進(jìn)行計(jì)算,達(dá)到了優(yōu)化此類計(jì)算方法的效果。
以數(shù)字太倉(cāng)項(xiàng)目POI數(shù)據(jù)為例,運(yùn)用此方法進(jìn)行十個(gè)級(jí)別的抽稀處理。
腳本工具界面及參數(shù)設(shè)置如圖5所示。
圖5 抽稀工具
抽稀處理后,POI點(diǎn)屬性項(xiàng)DISPLEVEL的內(nèi)容即為抽稀結(jié)果,如L級(jí)別設(shè)置的顯示內(nèi)容為:DISPLEVEL<=L,如圖6展示內(nèi)容,每種符號(hào)代表一個(gè)級(jí)別。由圖6可知,顯示的每個(gè)符號(hào)之間沒(méi)有壓蓋,每種符號(hào)都是按相應(yīng)距離均勻分布,能夠符合抽稀要求。
圖6 太倉(cāng)市POI點(diǎn)抽稀前后對(duì)比展示圖
研究表明:本文提出的基于Python和Arcpy的抽稀算法,與其他常規(guī)使用的抽稀方法相比,既保證了重要地物的保留,又有效地實(shí)現(xiàn)了圖面效果均勻、整潔,同時(shí)很好地完成各級(jí)別抽稀成果點(diǎn)之間的繼承和銜接,做到一鍵式全自動(dòng)處理。
隨著國(guó)家經(jīng)濟(jì)社會(huì)的高速發(fā)展,人們對(duì)新型智慧城市服務(wù)需求不斷增加,如何更高效的分析和挖掘海量POI點(diǎn)的工作變得越來(lái)越關(guān)鍵。本文以海量地名地址點(diǎn)抽稀工作的流程優(yōu)化為目標(biāo),運(yùn)用Python和ArcPy相結(jié)合的方法搭建抽稀模型,制作批處理工具,并在數(shù)字太倉(cāng)項(xiàng)目的電子地圖配圖中得到廣泛應(yīng)用。其抽稀結(jié)果整潔清晰、分布均勻,符合電子地圖配圖要求,并且抽稀效率得到大幅提升,有效提高工作效率,實(shí)現(xiàn)工作流程優(yōu)化目標(biāo)。希望通過(guò)該方法的進(jìn)一步推進(jìn),為今后開(kāi)展類似海量數(shù)據(jù)分析和挖掘工作提供新方法和新思路。