韓紅花
(山東省國土測繪院,山東 濟南 250013)
地理國情監(jiān)測與基礎(chǔ)測繪是測繪行業(yè)的兩大重點工程。基礎(chǔ)測繪是建立全國統(tǒng)一的測繪基準和測繪系統(tǒng),是進行基本航空攝影,獲取基礎(chǔ)地理信息的遙感數(shù)據(jù),測制和更新國家基本比例尺地圖,影像圖和數(shù)字化產(chǎn)品,建立、更新基礎(chǔ)地理信息系統(tǒng)[1]。地理國情主要是指地表自然和人文地理要素的空間分布、特征和相互關(guān)系,是基本國情的重要組成部分[2-4]。山東省在第一次地理國情普查完成后,省情監(jiān)測與基礎(chǔ)測繪要求進行年度更新,實際生產(chǎn)中出現(xiàn)很多重復(fù)繁瑣的工作步驟,需要處理大量冗余數(shù)據(jù),而且兩者在表達方式和數(shù)據(jù)分類上有部分重合,如有價值數(shù)據(jù)的整合、代碼的轉(zhuǎn)換等,人工處理過程中易出錯,且工作效率不高,因此,如何在保證數(shù)據(jù)更新質(zhì)量的前提下實現(xiàn)兩者數(shù)據(jù)的相互轉(zhuǎn)換,提高工作效率亟待解決。
Python是一款免費的開源軟件,功能強大,具有簡單易學(xué)及跨平臺可移植等特點。Python擴展了ArcGIS功能,許多地理處理工具都是由Python編寫的。ArcPy是一個基于ArcGIS Scripting模塊成功構(gòu)建并繼承ArcGIS Scripting功能的站點包,其目的是通過Python,以實用和高效的方式為地理數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理和地圖自動化創(chuàng)建基礎(chǔ)[5]。它提供了使用Python語言操作所有GP工具的入口,并提供了多種有用的函數(shù)種類,以用于處理和訪問GIS數(shù)據(jù)[6-7]。在Python中使用ArcPy的另一個主要原因是Python是一種通用編程語言,能夠支持動態(tài)輸入,而且支持交互式操作和腳本的一次性程序快速原型,具有編寫大型應(yīng)用程序的能力,可以便捷高效地進行數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)管理,還可以根據(jù)實際生產(chǎn)的需要擴展功能。
山東省“十三五”基本測繪要求對全省地形要素進行年度更新、整合,刪除或不采集省內(nèi)已經(jīng)不存在的、有較低實際應(yīng)用價值的、用于輔助制圖的要素,增加一些新的政務(wù)需要和公眾關(guān)注的要素,合并一些相近的要素[8]。主要工作有數(shù)據(jù)的整合、分幅、采集更新、成果檢查、接邊等。但是根據(jù)國家相關(guān)的規(guī)范和要求,地理省情監(jiān)測數(shù)據(jù)與基礎(chǔ)測繪數(shù)據(jù)在屬性結(jié)構(gòu)以及采集范圍上都有所不同,因此會出現(xiàn)數(shù)據(jù)的結(jié)構(gòu)不一致,整合和分幅工作量大,成果質(zhì)量難把握等問題,這時可以利用Python編寫腳本處理工具來解決。
基礎(chǔ)測繪中地形要素表達了地球表面形態(tài)的要素,表達地球表面形態(tài)的要素,包括測量控制點、交通、管線、水系、居民地及設(shè)施、地貌、植被與土質(zhì)以及地理單元,要素數(shù)據(jù)存儲在34個數(shù)據(jù)層,類型遠遠多于地理國情普查[9-10]。山東省情監(jiān)測是基于地理國情監(jiān)測的技術(shù)規(guī)定和規(guī)范文件,主要包括重要地理國情監(jiān)測要素、地表覆蓋和地表形態(tài)3個分類對象。2018基礎(chǔ)地理國情普查綜合考慮上述3類信息,確定內(nèi)容分類對象及采集指標,分為10個一級類,59個二級類,143個三級類,其中一級類包括種植土地、林草覆蓋、房屋建筑(區(qū))、鐵路與道路、構(gòu)筑物、人工堆掘地、荒漠與裸露地、水域、地理單元、地形[11]?;A(chǔ)地理國情監(jiān)測數(shù)據(jù)存儲方式按數(shù)據(jù)集和要素層組織,要素層要素采用點、線、面表達,數(shù)據(jù)集包括地表覆蓋數(shù)據(jù)集、交通網(wǎng)絡(luò)數(shù)據(jù)集、水域網(wǎng)絡(luò)數(shù)據(jù)、構(gòu)筑物要素數(shù)據(jù)集、地理單元數(shù)據(jù)集[12]?;A(chǔ)測繪和地理省情監(jiān)測數(shù)據(jù)的地形要素對比分析如表1所示。
通過比較發(fā)現(xiàn),“十三五”基礎(chǔ)測繪的表達方式與分類體系和地理省情監(jiān)測數(shù)據(jù)有部分重合,而且對同一個地形要素在表達內(nèi)容上也是相同的[13]。從表1可以看出,地理省情數(shù)據(jù)LCRA層中的植被數(shù)據(jù)、公路和鐵路線層、水系線與面層、地理單元點與面層、行政村以及構(gòu)筑物要素點線面層內(nèi)容是相同的,將這些能夠利用的數(shù)據(jù)按照基礎(chǔ)測繪的數(shù)據(jù)格式進行轉(zhuǎn)換,然而對于同一地物,二者的表達方式不同,即屬性結(jié)構(gòu)不同,這樣在數(shù)據(jù)轉(zhuǎn)換過程中就會出現(xiàn)屬性信息丟失的情況。在實際作業(yè)中,省情監(jiān)測數(shù)據(jù)是根據(jù)圖層、CC碼來確定一類要素,基礎(chǔ)測繪的數(shù)據(jù)是通過圖層、GB碼來確定一類要素,在此以公路層城際公路中心線為例進行分析(表2)。
表1 地形要素分類對比
表2 字段對應(yīng)關(guān)系表
通過對比基礎(chǔ)測繪數(shù)據(jù)和地理省情監(jiān)測數(shù)據(jù)的屬性信息,發(fā)現(xiàn)有部分屬性字段是相同的,或者字段不同但是所表達的意思是相同的,所以在數(shù)據(jù)轉(zhuǎn)換時首先要建立一一對應(yīng)的關(guān)系。先按照基礎(chǔ)測繪屬性的字段類型和長度建立新的字段,按照表2確立的對應(yīng)關(guān)系,把屬性值轉(zhuǎn)換之后賦給新的字段,然后刪除原有字段,主要代碼如下:
arcpy.env.workspace="E:data"#設(shè)置當前工作環(huán)境
arcpy.AddField_management("LRDL","GB","LONG",)#添加字段屬性
arcpy.AddField_management("LRDL","RN","STRING",8)
arcpy.AddField_management("LRDL","NAME","STRING",64)
cursor=arcpy.UpdateCursor("LRDL")#創(chuàng)建更新游標
for row in cursor: # 更新字段GB、NAME的值
row.setValue("LRDL", row.getValue("GB"))
row.setValue("LRDL", row.getValue("RN"))
row.setValue("LRDL", row.getValue("NAME"))
cursor.updateRow(row)
del cursor, row
在實際作業(yè)過程中,“十三五”基礎(chǔ)測繪數(shù)據(jù)以任務(wù)分塊范圍的主要道路和河流為邊界劃分作業(yè)網(wǎng)格,而之前的基礎(chǔ)測繪和地理國情數(shù)據(jù)都是1∶10000的分幅數(shù)據(jù),因此首先在作業(yè)之前需要對數(shù)據(jù)進行合并融合,把涵蓋任務(wù)區(qū)范圍的圖幅進行融合,利用Python腳本將圖幅與圖幅邊界上的線段偽結(jié)點,屬性相同的未合并面進行融合,較少后期質(zhì)量檢查時會出現(xiàn)較多拓撲錯誤,例如道路水系線的偽節(jié)點,植被面、道路面的相鄰面未合并等問題。利用Python腳本對數(shù)據(jù)進行融合處理,可以減少后期出現(xiàn)以上錯誤,主要代碼如下:
arcpy.Disslove_management(path+"LRDL",path+"LRDL_Disslove",["GB","RN","NAME","RTEG"],"SINGLE_PART","DISSOLVE_LINES")#設(shè)置需要融合的屬性字段
print("道路線融合完成!")
地理省情數(shù)據(jù)集要素層數(shù)較多,結(jié)構(gòu)復(fù)雜,在生產(chǎn)中需要收集大量的參考數(shù)據(jù),例如交通廳的道路橋梁數(shù)據(jù),水利廳的河流水庫等水利數(shù)據(jù),鐵路局的鐵道數(shù)據(jù)等,數(shù)據(jù)類型多種多樣,并且數(shù)據(jù)量大。同時在基礎(chǔ)測繪數(shù)據(jù)實踐生產(chǎn)中要分工協(xié)作,需要對使用作業(yè)區(qū)域進行分塊,這就需要對參考數(shù)據(jù)進行裁切。但是在分圖時靠人工裁切費時費力,通過Python編寫腳本自動處理,既節(jié)省了時間,又提高了工作效率。在腳本中添加裁切范圍的SHP數(shù)據(jù)路徑,利用Python中的Clip語句剪切遍歷gdb或mdb數(shù)據(jù)集中所有層的數(shù)據(jù),主要代碼如下:
clipshp="D: eedRegion.shp"#設(shè)置裁切范圍
for fds in arcpy.ListDatasets(): #遍歷數(shù)據(jù)集中所有的數(shù)據(jù)
for fc in arcpy.ListFeatureClasses('','',fds):
outputfeature=output+""+fc+".shp" #設(shè)置輸出環(huán)境
arcpy.Clip_analysis(fc,clipshp,outputfeature,"")
基礎(chǔ)測繪數(shù)據(jù)質(zhì)檢必須在技術(shù)、手段、方法等方面不斷提高能力水平,才可以與新型基礎(chǔ)測繪的生產(chǎn)水平相適應(yīng)[14]。拓撲通過表達規(guī)定數(shù)據(jù)之間的空間關(guān)系,將采集的地理數(shù)據(jù)盡可能地與現(xiàn)實數(shù)據(jù)保持一致,以實現(xiàn)能夠精準表達空間數(shù)據(jù)的目的。因此,結(jié)合技術(shù)規(guī)范要求和GIS 基本拓撲結(jié)構(gòu),設(shè)計出不同要素層之間要素的拓撲關(guān)系,對規(guī)范要素空間幾何關(guān)系、提高驗收的工作效率和保證成果數(shù)據(jù)質(zhì)量具有重要意義[15]。在基礎(chǔ)測繪中,利用拓撲規(guī)則檢查各層數(shù)據(jù)之間的拓撲關(guān)系來確定數(shù)據(jù)的正確性,既規(guī)范了成果數(shù)據(jù)之間的空間幾何關(guān)系,確保了數(shù)據(jù)質(zhì)量,又能更逼真地表現(xiàn)地理要素。常見的拓撲規(guī)則有國省縣鄉(xiāng)行政區(qū)不能有縫隙,房屋建筑區(qū)不能與水域面重疊,城市道路線層要素數(shù)據(jù)不能存在懸掛點和偽節(jié)點,同層面之間不能重疊,高速公路出入口必須位于公路線上,涵洞需要落在水系線上,橋梁等須與道路重合,地理單元點不能落入地理單元面內(nèi)等。
利用Python編譯空間拓撲腳本,可以解決地理省情數(shù)據(jù)中的植被層與基礎(chǔ)測繪數(shù)據(jù)中的居民地面層、水系面層以及附屬設(shè)施面層出現(xiàn)重疊的情況,還可以檢查道路層、水系層的偽節(jié)點、懸掛等問題。通過創(chuàng)建拓撲規(guī)則建立拓撲后,驗證數(shù)據(jù)是否違反了其定義的規(guī)則。驗證拓撲后,后續(xù)編輯將會把違反拓撲規(guī)則的,且需要重新驗證的要素數(shù)據(jù)集子集標記出來,這樣就只需處理需要重新驗證的區(qū)域即可,從而來規(guī)范要素空間的幾何關(guān)系,提高數(shù)據(jù)編輯工作的效率,保證成果數(shù)據(jù)的質(zhì)量,主要代碼如下:
input_dataset=r"C:MyProjectsMyProject.gdbfds"#設(shè)置需要拓撲的數(shù)據(jù)集路徑
topo_name="Topology"#為拓撲命名
rules=r"'Must Not Overlap (Area)' #設(shè)置拓撲規(guī)則
out_topo=arcpy.CreateTopology_management(input_dataset,topo_name,cluster_tol) #創(chuàng)建拓撲
arcpy.AddFeatureClassToTopology_management(out_topo, in_fc, xy_rank, z_rank) #將數(shù)據(jù)集添加到拓撲中
arcpy.AddRuleToTopology_management(out_topo, rule_type, in_fc1, subtype1, in_fc2, subtype2) #將拓撲規(guī)則加入拓撲中
arcpy.ValidateTopology_management(out_topo) #驗證拓撲
由于Python是純腳本語言,對于作業(yè)者來說使用不方便,尤其是重復(fù)使用時需要對腳本進行修改,因此,在ArcGIS中可以將Python腳本導(dǎo)入到ArcToolBox工具箱中,這樣可視化的圖形界面方便作業(yè)者使用。創(chuàng)建一個新工具箱并在工具箱中添加腳本,設(shè)置腳本的名稱,標簽和描述,將編譯好的腳本py文件導(dǎo)入,設(shè)置參數(shù),例如變量名稱和屬性信息,輸入輸出路徑等,從而方便作業(yè)者使用腳本來處理數(shù)據(jù)(圖1、圖2)。以拓撲錯誤檢查為例,選擇數(shù)據(jù)路徑和所需檢查的植被數(shù)據(jù)層與居民地數(shù)據(jù)層,運行后得到拓撲驗證后的結(jié)果即數(shù)據(jù)中拓撲關(guān)系錯誤的紅色標識,進而對錯誤數(shù)據(jù)進行修改(圖3)。
圖1 Arcpy腳本可視化界面
圖2 拓撲檢查操作窗口
圖3 運行結(jié)果
通過創(chuàng)建Arcpy工具,實現(xiàn)圖形界面的可視化,形成了一個可交互的數(shù)據(jù)處理環(huán)境,方便了對已編譯的Python腳本的使用。
該文按照基礎(chǔ)測繪的技術(shù)要求和生產(chǎn)所需的相關(guān)信息,結(jié)合地理省情監(jiān)測數(shù)據(jù),利用Python API for ARCGIS編寫腳本工具,實現(xiàn)數(shù)據(jù)處理和轉(zhuǎn)化中幾個重要的步驟,將地理省情監(jiān)測數(shù)據(jù)轉(zhuǎn)換到基礎(chǔ)測繪工作中,在保證質(zhì)量的前提下減少了工作量,在數(shù)據(jù)轉(zhuǎn)換中進行實踐和創(chuàng)新。目前“十三五”基礎(chǔ)測繪工作正在進行中,在作業(yè)過程中還可以通過Python編寫相關(guān)數(shù)據(jù)的定義投影,有向點處理,合并融合等多種數(shù)據(jù)處理腳本工具,滿足實際作業(yè)中的各種要求。也可利用Python工具,把現(xiàn)勢性好的基礎(chǔ)測繪數(shù)據(jù)轉(zhuǎn)換到地理省情監(jiān)測數(shù)據(jù)中,實現(xiàn)數(shù)據(jù)的互提取。Python的應(yīng)用減少了作業(yè)過程中的重復(fù)性工作,保證了數(shù)據(jù)更新的質(zhì)量,有利于實現(xiàn)數(shù)據(jù)的自動化處理,提升工作效率,對地理省情監(jiān)測工作實現(xiàn)實時化和智能化有著一定的價值和意義。