彭蓮香 王龍秀 郭星濤 肖雄
[關鍵詞] ArcPy;判重;天地圖;地名地址和POI;近鄰表
地理信息公共服務平臺(天地圖)是自然資源部主導建設的網絡化地理信息公共服務平臺,由國家、省、市三級節(jié)點構成,目的是將天地圖作為大數據對外提供公益性、基礎性服務的統(tǒng)一出口,提高測繪地理信息公共服務能力和水平,為政府、企業(yè)、公眾等用戶提供權威、標準、統(tǒng)一的在線地理信息服務。為實現(xiàn)跨層級(國家、省、市)的數據查詢、統(tǒng)計分析等應用需求,國家主節(jié)點于2013年利用數據融合手段開始節(jié)點同構工作,通過整合國家、省、市各級節(jié)點的數據資源,提高天地圖各級節(jié)點數據的現(xiàn)勢性,豐富數據內容。融合的數據類型包括矢量數據、地名地址和POI數據、影像數據。按照主節(jié)點的數據融合處理要求和驗收標準,地名地址和POI數據中不能出現(xiàn)重復的數據,本文將結合作者實際生產過程對地名地址和POI數據的判重進行深入探討。
地名地址和POI數據基于母庫數據,利用本省基礎測繪、最新地理國情監(jiān)測、市級節(jié)點數據、國家下發(fā)的最新導航數據進行更新。因涉及的數據來源多樣、生產標準不一致、數據分類和屬性不統(tǒng)一、總體數據量大、覆蓋范圍廣,通過人工逐條去篩選判重既費時又費力而且不可避免地會出現(xiàn)遺漏,很不現(xiàn)實。鄭佩燕[1]、付治河[2]、趙秋菊[3]對判重處理的原理進行了論述。徐鳳英[4]提到“判別重復,刪除相似度大于80%的數據,保留更完整數據”,但沒有具體說明相似度如何計算的。王銀花[5]首先采用名稱字段掛接篩選出名稱完全重復的點,然后利用FME構建模糊查詢模塊篩選名稱不完全一致的情況。劉芙蓉[6]將重復點出現(xiàn)的情況分為(1)位置名稱完全一致;(2)名稱相同位置有偏差的;(3)位置和名稱都存在差異三種情況,前兩種情況利用空間分析解決,第三種也同樣利用FME構建名稱模糊匹配模塊進行查重。張慶全提出用程序完成名稱完全一致、名稱不完全一致但意思一致2種地名重復情況的處理思路,但對具體程序實現(xiàn)未進行詳細說明[7]。利用ArcPy進行判重處理的研究較少,本文將探討利用ArcPy進行判重的思路和具體實現(xiàn),為批量輸出地名地址和POI判重結果提供一種思路。
1. 技術路線與實現(xiàn)
1.1 Python 介紹Python 是一種不受局限、跨平臺的開源編程語言,具有簡單易學、開源免費、可移植性強,而且具有豐富的擴展庫,具有強大的圖形處理、數學處理、文本處理、表格處理、多媒體處理等模塊,廣泛使用于web開發(fā)、爬蟲、云計算、人工智能、科學運算等領域,是目前最流行的程序設計語言之一。
1.2 ArcPy 介紹
ArcGIS 9.0 社區(qū)中引入了Python。此后,Python被視為可供地理處理用戶選擇的腳本語言并得以不斷發(fā)展。ArcPy是從ArcGIS 10版本后推出的一個以成功的arcgisscripting 模塊為基礎并繼承了arcgiss?cripting 功能進而構建而成的站點包。站點包是Py?thon 術語,表示用于將附加函數添加到Python 中的庫,而ArcPy站點包則用于將GIS函數添加到Python中的庫。ArcPy 站點包隨ArcGIS 一起安裝。采用新的ArcPy命名空間取代arcgisscripting命名空間,可通過引用ArcPy站點包直接調用其提供的一系列方法、類和模塊,主要由制圖模塊(arcpy.mapping)、數據訪問模塊(arcpy.da)、空間分析模塊及擴展模塊(arcpy.sa)和基本函數功能組成[8],可實現(xiàn)地理數據分析、數據轉換、數據管理和地理自動化創(chuàng)建。使用以ArcPy編寫的ArcGIS應用程序和腳本的優(yōu)勢在于,可以訪問并使用由來自多個不同領域的GIS專業(yè)人員和程序員開發(fā)的大量Python模塊[9]。
1.3 技術路線分析
2020年內蒙古自治區(qū)天地圖地名地址和POI數據融合的數據源包括省級節(jié)點本地數據和天地圖國家主節(jié)點下發(fā)數據兩部分。前者包括內蒙古自治區(qū)地理國情監(jiān)測數據(2019年)、市級節(jié)點地名地址和興趣點數據;后者包括導航地名地址與興趣點數據(2020年春)、國家母庫地名地址與興趣點數據。按照《天地圖數據融合技術要求(2020)》,融合不同來源數據,得到全區(qū)70多萬條地名地址和POI數據成果。地名地址和POI 數據中包括ELEMID(唯一標識碼)、NAME(名稱)、LON(經度)、LAT(緯度)、ADDRESS(地址)、TELEPHONE(電話)、TYPE2018(類型編碼)等字段。
70多萬條地名地址和POI 的重復點處理是一項繁瑣且令人頭大的工作,采用ArcGIS 軟件的工具和人工結合的方式常常耗時長且不可避免地出現(xiàn)遺漏。為解決這一問題,筆者利用ArcPy 和Python,分盟市按照地名地址和POI的類型編碼分情況判斷NAME、ADDRESS、TELEPHONE 和點之間的距離,分別進行相同判重和相似判重,然后人工按照判重結果進行重復點處理。
相同判重包括四種情況:1)NAME、ADDRESS、TELEPHONE都相同;2)僅NAME、ADDRESS 相同;3)僅NAME、TELEPHONE 相同;4)僅NAME 相同。對于學校、醫(yī)院、單位(博物館、科技館、電視臺、圖書館、政府及管理機構、公檢法等)及鄉(xiāng)鎮(zhèn)以上行政地名等類型的數據,不限定判重距離,其他類型的數據判重距離設定為1.5km。
相似判重是指NAME、ADDRESS、TELEPHONE都互不完全相同,但是可通過兩個點的NAME得到相似度。判重距離設定為1.5km。
判重距離可根據實際情況設定,設置的距離越大生成判重結果中的干擾項會越多,距離設置小會出現(xiàn)判重不夠徹底的情況。
判重實現(xiàn)詳細步驟如圖1,可大體分成三步:
1.因全區(qū)數據龐大,將數據按照盟市進行分割,分盟市進行判重;
2.分盟市按判重距離1.5km生成近鄰表;
3. 分盟市導出dbf(只保留ELEMID、NAME、TYPE2018、ADDRESS、TELEPHONE、LON、LAT 等與判重相關的字段),然后分盟市導出Excel表。
4.判斷數據類型,若為學校、醫(yī)院、單位(博物館、科技館、電視臺、圖書館、政府及管理機構、公檢法等)及鄉(xiāng)鎮(zhèn)以上行政地名等類型的數據,相同判重不限定判重距離,否則相同判重距離設定為1.5km。所有數據的相似判重距離均為1.5km。
5.相同判重分盟市輸出相同判重結果,分別對應相同判重的1)、2)、3)、4)中情況將判重結果分別存放于repeat_poi_name_address_phone. txt、repeat_poi_name_address. txt、repeat_poi_name_phone. txt、re?peat_poi_name_coordinate(1.5km).txt。
6.相似判重分盟市輸出相似判重結果。按照相似度區(qū)間90%~100%、80%~90%、70%~80%、65%~70%、60%~65%、分別將判重結果存放于poi_match_result_90_100. txt、poi_match_result_80_90. txt、poi_match_result_70_80. txt、poi_match_result_65_70.txt、poi_match_result_60_65.txt。
7.根據判重結果,人工處理數據。
1.4 具體實現(xiàn)
1.4.1 程序使用的Python擴展庫
本程序使用的Python 擴展庫及相應的函數如表1:
1.4.2 程序使用的ArcPy類及函數
本程序使用的ArcPy類及函數如表2:
1.5 實現(xiàn)效果
1.5.1 判重結果目錄結構
判重結果按盟市輸出,分別存放在以盟市命名的文件夾中,每個盟市的文件中包括10個txt,前5個為相似判重結果,后5個為相同判重結果,如圖2:
1.5.2 相同判重結果示例
相同判重結果結構如圖3。以repeat_poi_name_address.txt的判重結果為例,如圖4,3行為一組判重結果,表示唯一碼ELEMID1和ELEMID2的兩個點距離小于1.5 km,并且名稱和地址完全相同。第一行是表示兩個點的ELEMID,第二行表示點1對應的屬性信息,第三行表示點2對應的屬性信息。
1.5.3 相似判重結果示例
相似判重結果結構如圖5。以poi_match_result_90_100.txt的判重結果為例,如圖6,5行為一組判重結果,表示唯一碼ELEMID1和ELEMID2的兩個點距離小于1.5km,并且名稱的相似度區(qū)間處于90%~100%之間。第一行是表示兩個點的ELEMID,第二行表示點1對應的屬性信息,第三行表示點2對應的屬性信息,第四行表示兩點之間的距離,第五行表示兩點之間的相似度。
1.5.4 運行時間統(tǒng)計
筆者工作站配置為16 核32 線程、128G 內存、512G固態(tài)硬盤、P5000顯卡,安裝ArcGIS 10.2,補充了64位GP處理模塊,利用64位Python 2.7.3編寫程序,對全區(qū)70多萬條地名地址和POI數據進行測試,列舉以下盟市各個步驟的運行時間,如表3。可以直觀地看出,一是近鄰表的條目數巨大,普遍達到千萬級,甚至超過億,比如烏蘭察布數據條目有5萬余條,近鄰表達到了8千萬余條;赤峰數據條目有8萬余條,近鄰表達到了1億余條,利用Python多線程模塊可在第二步、第三步中實現(xiàn)對大數據量近鄰表的查詢處理,充分利用工作站資源,快速輸出結果,可避免程序運行時間過長或者報錯得不到完整結果的問題;二是程序的運行時間雖然與數據條目數有關,但是主要取決于近鄰表中的條目數,而這跟地名地址和POI數據的密集程度有關,比如,包頭和錫林郭勒盟的數據條目數均約7萬條,但錫林郭勒盟的近鄰表僅8千萬余條,因包頭數據分布密度高,其近鄰表達到近2億條,程序總運行時間也是錫林郭勒盟的2倍多。
2. 結語
在大數據量的情況下,手動檢查的人工成本較高,效率低且易出錯[10],而已有的文獻中,分情況采用空間分析或者FME模塊處理的方法不能一次性輸出判重結果,為解決這些問題,筆者利用ArcPy和Python編寫程序綜合考慮相同判重和相似判重的情況,利用多線程模塊優(yōu)化程序,實現(xiàn)大數據量的判重結果的自動輸出,應用于實際生產中,能解決判重結果批量輸出的問題。但是后續(xù)還需要人工輔助完成判重處理,這也需要一定的工作量,怎么快速的處理判重結果,徹底釋放人工,還需要進行下一步深入的研究。