摘" 要:在日常數(shù)據(jù)處理過程中,由于空間數(shù)據(jù)的數(shù)據(jù)量較大,在對其進(jìn)行重復(fù)性數(shù)據(jù)處理工作中,工作人員需進(jìn)行大量手動操作且容易出錯??臻g數(shù)據(jù)的自動批處理可以大幅度降低數(shù)據(jù)處理人員的工作強(qiáng)度,提高工作效率。結(jié)合山東省新型基礎(chǔ)測繪生產(chǎn)項目,使用ArcPy腳本對一些重復(fù)性的工作進(jìn)行批處理,實現(xiàn)數(shù)據(jù)分發(fā)、影像挑選、數(shù)據(jù)合并等的批量操作,為ArcPy腳本在空間數(shù)據(jù)自動批處理中的應(yīng)用提供一種可行且高效的方案。
關(guān)鍵詞:新型基礎(chǔ)測繪;ArcPy;批處理;數(shù)據(jù)分發(fā);影像挑選
中圖分類號:P208" " " "文獻(xiàn)標(biāo)志碼:A" " " " " 文章編號:2095-2945(2023)31-0177-04
Abstract: In the daily data processing process, due to the large amount of spatial data, staff need to do a lot of manual operations and are prone to errors in the repetitive data processing. Automatic batch processing of spatial data can greatly reduce the work intensity of data processors and improve work efficiency. Combined with the new basic surveying and mapping production project in Shandong Province, ArcPy script is used to batch some repetitive work, and the batch operations of data distribution, image selection and data merging are realized, which provides a feasible and efficient scheme for the application of ArcPy script in automatic batch processing of spatial data.
Keywords: new basic surveying and mapping; ArcPy; batch processing; data distribution; image selection
在日常數(shù)據(jù)處理過程中,由于空間數(shù)據(jù)的數(shù)據(jù)量較大,在對其進(jìn)行投影變換、字段編輯、拼接裁剪和數(shù)據(jù)轉(zhuǎn)換等重復(fù)性數(shù)據(jù)處理工作中,工作人員需進(jìn)行大量手動操作且容易出錯[1]。為了降低數(shù)據(jù)處理人員的工作強(qiáng)度,提高工作效率,使用ArcPy腳本進(jìn)行自動化處理是一種有效的方法。ArcPy腳本在矢量數(shù)據(jù)處理中已有較多應(yīng)用,李乃強(qiáng)[2]、吳后清等[3]分別討論了其在地理空間數(shù)據(jù)質(zhì)量控制方面的應(yīng)用,鄭繼武等[4]基于ArcPy研究了大比例尺地形圖圖幅結(jié)合表的自動繪制方法,袁玏[5]研究了其在農(nóng)村土地承包經(jīng)營權(quán)地塊處理中的應(yīng)用,本文以山東省新型基礎(chǔ)測繪生產(chǎn)工作為例,探討了使用ArcGIS中腳本工具包ArcPy進(jìn)行數(shù)據(jù)自動批處理的可行性,為ArcPy在空間數(shù)據(jù)處理中的應(yīng)用提供了一種可行且高效的方案。
1" ArcPy簡介
ArcGIS是一款具有強(qiáng)大功能的地理信息數(shù)據(jù)處理軟件,本身就帶有許多地理信息數(shù)據(jù)處理工具,能夠很好地滿足日常工作中大部分情況下的數(shù)據(jù)處理工作,但其無法滿足某些用戶個性化的數(shù)據(jù)處理流程,因此,ArcGIS推出了ArcPy[6]。
ArcPy是一個以成功的arcgisscripting模塊為基礎(chǔ)并繼承了arcgisscripting功能構(gòu)建而成的站點包,目的是以實用高效的方式通過Python執(zhí)行地理數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理和地圖自動化創(chuàng)建基礎(chǔ)[7]。使用ArcPy的另一個主要原因是,Python是一種通用的編程語言。它是一種支持動態(tài)輸入的解釋型語言,適用于交互操作以及一次性程序(即腳本)快速原型制作,同時具有編寫大型應(yīng)用程序的強(qiáng)大功能。用ArcPy編寫的ArcGIS應(yīng)用程序的優(yōu)勢在于,可以使用由多個不同領(lǐng)域的GIS專業(yè)人員和程序員組成的眾多Python小群體開發(fā)的附加模塊[8]。
1.1" ArcPy模塊
模塊為包含函數(shù)和類的Python文件。ArcPy由數(shù)據(jù)訪問模塊(arcpy.da)、制圖模塊(arcpy.mapping)、ArcG IS Spatial Analyst擴(kuò)展模塊(arcpy.sa),以及ArcG IS Network Analyst擴(kuò)展模塊(arcpy.na) 等一系列模塊支持,這些模塊分別集成不同的功能。
1.2" ArcPy類
類的作用類似于建筑設(shè)計藍(lán)圖。藍(lán)圖為如何創(chuàng)建事物提供了一個框架。類可用于創(chuàng)建對象,即通常所說的實例。ArcPy類,如SpatialReference和Extent類,通常用作地理處理工具參數(shù)設(shè)置的快捷方式,否則的話,這些參數(shù)會使用更加復(fù)雜的字符串。
1.3" ArcPy函數(shù)
函數(shù)是用于執(zhí)行某項特定任務(wù)并能夠納入更大的程序的已定義功能。在ArcPy中,所有地理處理工具均以函數(shù)形式提供,但并非所有函數(shù)都是地理處理工具。除工具之外,ArcPy還提供多種函數(shù)來更好地支持Python地理處理工作流。函數(shù)(通常稱為方法)可用于列出某些數(shù)據(jù)集、檢索數(shù)據(jù)集的屬性、在將表添加到地理數(shù)據(jù)庫之前驗證表名稱,或執(zhí)行其他許多有用的腳本任務(wù)。
2" 生產(chǎn)中遇到的問題
基礎(chǔ)測繪是測繪事業(yè)的核心組成部分,對于國防建設(shè)、經(jīng)濟(jì)建設(shè)、社會發(fā)展和生態(tài)保護(hù)具有重要意義,同時為自然資源管理、公共安全與應(yīng)急管理等提供數(shù)據(jù)支持和技術(shù)保障。新型基礎(chǔ)測繪是基礎(chǔ)測繪在新時代的轉(zhuǎn)型升級,其成果具有全域覆蓋、數(shù)據(jù)量大、內(nèi)容豐富等突出特點,這也使得在生產(chǎn)過程中會面臨大量耗時且重復(fù)性的工作,影響工作效率。為了降低工作人員的工作強(qiáng)度,提高工作效率,使用ArcPy對一些重復(fù)性的工作進(jìn)行批處理是一種有效的方法。
在山東省“十四五”基礎(chǔ)測繪規(guī)劃中,計劃5 a內(nèi)實現(xiàn)基于0.2 m分辨率影像全省更新一遍以及基于0.5 m分辨率影像的年度更新, 更新內(nèi)容包括山體、水系、冰雪、海洋、農(nóng)林用地與土質(zhì)、高程、水利、交通、建(構(gòu))筑物及場地設(shè)施、管線、院落、人工地貌、行政區(qū)劃單元、地名地址、國土空間規(guī)劃單元和其他管理單元等。相比“十三五”的5 a全省基于0.5 m分辨率影像更新一輪,任務(wù)比以前成倍地增加,因此在分發(fā)任務(wù)的過程中需要更多的時間來處理更多的數(shù)據(jù)量。
另一方面,在“十三五”基礎(chǔ)測繪中普遍使用的是0.5 m分辨率的影像,按照1∶10 000的圖幅進(jìn)行分幅,每幅圖面積為25 km2,單個子任務(wù)區(qū)使用的影像數(shù)量不多,人工挑選耗時并不明顯。由于“十四五”基礎(chǔ)測繪使用的0.2 m分辨率的影像是基于1∶2 000的圖幅進(jìn)行分幅,即每幅圖面積為1 km2,因此更新中每個子任務(wù)區(qū)使用的影像呈現(xiàn)指數(shù)級增加,人工挑選耗時明顯增加。
以上2個問題均為重復(fù)性的海量數(shù)據(jù)處理問題,利用ArcPy站點包可以很好地解決這個問題。
3" ArcPy在生產(chǎn)中的應(yīng)用
3.1" 數(shù)據(jù)分發(fā)
在基礎(chǔ)測繪實際生產(chǎn)中,由于工期的限制,每個任務(wù)區(qū)需要分為多個子任務(wù)區(qū)由不同的作業(yè)員完成,因此在任務(wù)分配過程中涉及數(shù)據(jù)分發(fā)的問題。傳統(tǒng)的做法是利用Arcgis制作矢量的任務(wù)分塊圖,然后由作業(yè)員自己對原始數(shù)據(jù)進(jìn)行裁切,這樣每個作業(yè)員需要處理一遍數(shù)據(jù)。由此想到使用ArcPy腳本,根據(jù)分配好的任務(wù)分塊圖對多個原始數(shù)據(jù)進(jìn)行統(tǒng)一分配及裁切,能大大節(jié)省任務(wù)分配的時間。
腳本具體思路為:先將制作好的矢量任務(wù)分塊圖對自身進(jìn)行分割處理,形成多個子任務(wù)分塊圖,然后使用分割好的子任務(wù)分塊圖對數(shù)據(jù)進(jìn)行裁剪,使用“原始數(shù)據(jù)+作業(yè)員”的格式對裁切后的數(shù)據(jù)命名,處理流程如圖1所示。
部分代碼如下:
for fenkuai in arcpy.ListFiles(\"*.shp\"):
arcpy.Split_analysis(fenkuai,fenkuai, “作業(yè)員“, data_path+\"/guocheng\", \"\")
for shuju in arcpy.ListFiles(\"*.gdb\"):
env.workspace = data_path+\"/guocheng\"
for fenkuai2 in arcpy.ListFiles(\"*.shp\"):
clip_name=os.path.splitext(shuju)[0]+\"_\"+os.path.splitext(fenkuai2)[0]+\".gdb\"
arcpy.CreateFileGDB_management(data_path+ \"/jieguo\",clip_name, \"9.3\")
env.workspace = data_path+\"/\"+shuju
for shapefile in arcpy.ListFeatureClasses():
arcpy.Clip_analysis(shapefile, data_path + \"/guocheng/\" + fenkuai2,data_path + \"/jieguo/\" + clip_name + \"/\" + shapefile)
腳本在ArcGIS集成軟件IDLE中運行,將數(shù)據(jù)放入指定文件夾中,即可實現(xiàn)自動運行。運行過程中顯示每個gdb數(shù)據(jù)庫的操作過程,可以實現(xiàn)實時監(jiān)控,保證數(shù)據(jù)處理的準(zhǔn)確性。對于裁切后的數(shù)據(jù),每個作業(yè)員根據(jù)分配結(jié)果選取自己的任務(wù)區(qū)進(jìn)行直接生產(chǎn)。
3.2" 影像挑選
每個任務(wù)區(qū)的影像在分發(fā)時在一個文件夾下,作業(yè)員需要根據(jù)自己的子任務(wù)區(qū)進(jìn)行挑選。根據(jù)分配任務(wù)區(qū)大小的不同,每個作業(yè)員在單個任務(wù)區(qū)生產(chǎn)中需要挑選的影像為50~200 mm不等,人工挑選耗費時間且容易出錯,再次想到使用ArcPy腳本,根據(jù)子任務(wù)區(qū)與圖幅的空間關(guān)系進(jìn)行批量挑選。
影像挑選的腳本思路為:對子任務(wù)區(qū)和影像結(jié)合表進(jìn)行相交處理,得到子任務(wù)區(qū)需要的影像結(jié)合表,將相交后的影像結(jié)合表中的影像名稱提取到數(shù)組中,根據(jù)提取數(shù)組中的影像名在原文件夾里將影像復(fù)制到目標(biāo)文件夾內(nèi),處理流程如圖2所示。
部分代碼如下:
arcpy.SpatialJoin_analysis(rwfk_shp, DLGfenfu_shp,
jieguo2, \"JOIN_ONE_TO_MANY\", \"KEEP_ALL\",\"\", \"INTERSECT\", \"\", \"\")
arcpy.AddField_management(jieguo2, \"domtif\",\"TEXT\",\"\",\"\",\"20\",\"\",NULLABLE\",\"\", \"\")
arcpy.CalculateField_management(jieguo2, \" domtif \",\"!NAME! +\\".tif\\"\",\"\", \"\")
arcpy.AddField_management(jieguo2, \"domtfw\",\"TEXT\",\"\",\"\",\"20\",\"\", ULLABLE\", \"\", \"\")
arcpy.CalculateField_management(jieguo2, \" domtfw \", \"!NAME! + \\".tfw\\"\", \"\", \"\")
shpfields = [' domtif ', ' domtfw ']
shp_TXT = []
shprows = arcpy.SearchCursor(jieguo2, shpfields)
while True:
shprow = shprows.next()
if not shprow:
break
shp_TXT.append(shprow. domtif)
shp_TXT.append(shprow. domtfw)
for i in range(0, len(shp_TXT)):
if arcpy.Exists(src_file+'/'+shp_TXT[i]):
shutil.copy(src_file+'/'+shp_TXT[i],
dst_file)
else:
print src_file+'\\'+shp_TXT[i]+u\"不存在!\"
生產(chǎn)中根據(jù)實際情況將原始數(shù)據(jù)路徑設(shè)置好,點擊運行即可實現(xiàn)影像的自動挑選,挑選過程在后臺運行,不影響作業(yè)員處理其他工作,速度數(shù)倍快于人工,并且不會出現(xiàn)挑選錯誤的情況。
3.3" 數(shù)據(jù)合并
由于基礎(chǔ)測繪數(shù)據(jù)存儲時是按縣級任務(wù)區(qū)進(jìn)行組織的,因此需要對每個作業(yè)員生產(chǎn)完成的單個子任務(wù)區(qū)數(shù)據(jù)進(jìn)行合并處理,并按要求對數(shù)據(jù)進(jìn)行接邊。由于接邊需要人工干預(yù)過程,因此考慮使用ArcPy腳本進(jìn)行前期自動處理,后期人工干預(yù)。
腳本具體思路為:遍歷文件夾中的數(shù)據(jù)庫文件,將每個數(shù)據(jù)庫的相應(yīng)圖層一一追加至模板數(shù)據(jù)庫中,追加完成后,對每個圖層的數(shù)據(jù)根據(jù)各自屬性進(jìn)行預(yù)接邊,即融合處理,再將融合后的數(shù)據(jù)追加到模板中,處理流程如圖3所示。
部分代碼如下:
f_list=arcpy.ListFiles(\"*.gdb\")
env.workspace = path+\"/\"+mb_name
fcList = arcpy.ListFeatureClasses()
for f in f_list:
for shapefile in fcList:
arcpy.Append_management(path+\"/shuju/\"+f+\"/\"+shapefile,
path+\"/\"+mb_name+\"/\"+shapefile,\"NO_TEST\",\"\")
arcpy.CreateFileGDB_management (path+\"/DIS_gdb\",mb_name, \"9.3\")
arcpy.Dissolve_management(path+\"/\"+mb_name+\"/HFCL\",path+\"/DIS_gdb/\"+mb_name+\"/HFCL\", \"…………\", \"\", \"SINGLE_PART\", \"DISSOLVE_LINES\")#根據(jù)實際情況定義融合字段
disfcList=[\"HFCL\",…………]#需要融合的圖層
for i in disfcList:
arcpy.TruncateTable_management(path+\"/\"+mb_name+\"/\"+i)
arcpy.Append_management(path+\"/DIS_gdb/\"+mb_name+\"/\"+i,
path+\"/\"+mb_name+\"/\"+i,\"NO_TEST\",\"\")
腳本會對各作業(yè)員提交的分塊數(shù)據(jù)進(jìn)行合并,并進(jìn)行初步融合處理,在分界線兩側(cè)數(shù)據(jù)均無變化的情況下實現(xiàn)效果較好,個別變化的細(xì)節(jié)需要后期人工干預(yù)加以判斷。經(jīng)實際生產(chǎn)驗證,采用此種人機(jī)交互的方式,合圖速度有明顯提升。
4" 工程實例
本文基于“十四五”新型基礎(chǔ)測繪生產(chǎn)項目,選取具有代表性的幾個任務(wù)區(qū),分別采用原始方法和文中腳本進(jìn)行數(shù)據(jù)的分發(fā)、合并以及影像的挑選工作。以樣本任務(wù)區(qū)A區(qū)為例,使各子任務(wù)區(qū)作業(yè)員使用原始方法進(jìn)行以上工作并記錄所用時間,同時實驗人員使用腳本進(jìn)行處理并記錄時間,最終統(tǒng)計時間見表1。
經(jīng)實際生產(chǎn)驗證結(jié)果,使用腳本后生產(chǎn)效率有明顯提升,數(shù)據(jù)合并因涉及人工干預(yù)工作,效率提升不及數(shù)據(jù)分發(fā)和影像挑選明顯。
5" 結(jié)束語
隨著信息技術(shù)的發(fā)展,地理信息工作所需要處理的數(shù)據(jù)越來越多,如何快速、高效地處理海量信息數(shù)據(jù),是每個從業(yè)者必須面對的問題?;贏rcPy腳本的基礎(chǔ)測繪批處理工具針對實際生產(chǎn)需要進(jìn)行開發(fā),解決了生產(chǎn)中遇到的問題,減少了大量重復(fù)性的工作,保證成果質(zhì)量的同時提高了生產(chǎn)效率。利用ArcPy腳本進(jìn)行批量地理處理工作流設(shè)計,能夠充分提高處理效率,有效規(guī)避人為錯誤,大幅度節(jié)約人工成本,值得學(xué)習(xí)和推廣,使其在測繪地理信息工作中發(fā)揮更重要的作用。
參考文獻(xiàn):
[1] 李詩宇,鄧吉強(qiáng).基于ArcPy的地學(xué)數(shù)據(jù)自動化處理與分析方法[J].科技創(chuàng)新與生產(chǎn)力,2018(3):44-46,49.
[2] 李乃強(qiáng).基于ArcPy的地理空間數(shù)據(jù)質(zhì)檢技術(shù)研究[J].地礦測繪,2021,37(3):38-41,45.
[3] 吳厚清,熊維康,聶晨暉,等.ArcPy腳本工具在新型基礎(chǔ)測繪質(zhì)量控制中的應(yīng)用[J].測繪通報,2022(8):160-164.
[4] 鄭繼武,鄧學(xué)鋒.基于ArcPy的大比例尺地形圖圖幅接合表自動繪制方法[J].地理空間信息,2022,20(9):121-124.
[5] 袁玏.基于Python的農(nóng)村土地承包經(jīng)營權(quán)地塊數(shù)據(jù)處理的研究[J].南方國土資源,2016(8):38-40.
[6] 馬云崗.Arcpy在地理信息數(shù)據(jù)處理中的應(yīng)用[J].華北自然資源,2019(5):78-80.
[7] 佟中石,張文朗,劉佰瑩.ArcPy腳本在山東省基礎(chǔ)測繪項目中的應(yīng)用[J].測繪與空間地理信息,2021,44(S1):139-141,146.
[8] 孫咸磊,許捍衛(wèi),李文博.ArcPy在長江河道水下空間數(shù)據(jù)批量處理中的應(yīng)用[J].測繪與空間地理信息,2015,38(2):97-99.