魏智東 李美珍
(廣東省國土資源測繪院, 廣東 廣州 510500)
隨著計算機水平的不斷發(fā)展,為適應新時代對測繪事業(yè)提出的新需求,測繪地理信息行業(yè)發(fā)展由原來傳統(tǒng)測繪逐步邁向數(shù)字化測繪[1]。地理信息數(shù)據(jù)庫作為數(shù)字化測繪產(chǎn)品的重要載體,廣泛應用在測繪地理信息產(chǎn)業(yè)中[2]。隨著測繪地理信息產(chǎn)業(yè)化的不斷發(fā)展,地理信息數(shù)據(jù)庫應用也深入到各行各業(yè)中[3]。隨著需求的不斷增加,如何更好地管理地理信息數(shù)據(jù)庫是目前行業(yè)發(fā)展的重要難點。申傳明[4]等人對如何進行空間數(shù)據(jù)庫建設進行探討,提出了空間數(shù)據(jù)庫建庫的方法;劉翔宇,朱大明[5]針對相同數(shù)據(jù)結(jié)構(gòu)的不同地理數(shù)據(jù)庫,提出使用ArcGIS基于Python提出批量合并矢量數(shù)據(jù)的方法;曹斌[6]提出了基于ArcPy地理信息數(shù)據(jù)批處理辦法;屈鵬[7]基于python介紹了批量處理地理信息數(shù)據(jù)庫要素類的方法;溫樹棟[8]等人通過ArcGIS模型構(gòu)建器,創(chuàng)建了批量裁剪數(shù)據(jù)庫的方法,但是,針對地理信息數(shù)據(jù)庫不同的存儲格式、要素集與要素類并存等情況,并沒有展開深入的研究。在這樣的基礎下,本文以廣東省2019年基礎性地理國情監(jiān)測為例,結(jié)合生產(chǎn)過程中人員任務分配及任務區(qū)地理空間數(shù)據(jù)庫提取,基于ArcPy編寫了地理信息數(shù)據(jù)庫批量裁剪工具,用于節(jié)省人員提取自己任務分區(qū)地理信息數(shù)據(jù)庫,減少人員操作失誤,縮減任務分工時間,提高數(shù)據(jù)生產(chǎn)效率,保證了基礎性地理國情監(jiān)測順利開展。地理信息數(shù)據(jù)庫批量裁剪工具也可應用于其他的項目,大大提高了地理信息數(shù)據(jù)庫批量裁剪工具的生命周期。
ArcPy是python的一個原生站點包,作為腳本語言嵌入ArcGIS[9],可讓我們基于ArcPy進行地理空間數(shù)據(jù)處理分析,ArcPy共分為四大模塊,如圖1所示,其中:Arcpy.mapping自動化模塊為用戶提供制圖等相關(guān)函數(shù);Arcpy.sa模塊為用戶提供地理空間分析等相關(guān)函數(shù);Arcpy.na模塊為用戶提供網(wǎng)絡分析相關(guān)函數(shù);Arcpy.da模塊為用戶提供數(shù)據(jù)訪問等相關(guān)函數(shù)[10],在本次ArcPy地理空間數(shù)據(jù)庫批量裁剪工具設計中,主要運用了Arcpy.da相關(guān)函數(shù)功能。
圖1 ArcPy四大模塊
根據(jù)2019年全國基礎性地理國情監(jiān)測實施方案要求,基礎性地理國情監(jiān)測在 “多規(guī)合一”、城市規(guī)劃實施監(jiān)管、環(huán)境保護與治理、自然資源管理、空間用途管制等多個方面得到廣泛應用,是我國生態(tài)文明制度建設中不可或缺的重要組成部分。根據(jù)《中華人民共和國國民經(jīng)濟和社會發(fā)展第十三個五年規(guī)劃綱要》《全國基礎測繪中長期規(guī)劃綱要(2015—2030年)》(國函〔2015〕92號)、《測繪地理信息事業(yè)“十三五”規(guī)劃》《廣東省基礎測繪“十三五”規(guī)劃(2016—2020年)》要求和自然資源部對于2019年基礎性地理國情監(jiān)測工作的安排,基礎性地理國情監(jiān)測將會逐年開展,由于基礎性地理國情監(jiān)測任務時間緊,任務重,投入人員較多,任務分工存在一定的難度。為了更好地解決項目前期人員任務分工問題,基于ArcPy地理空間數(shù)據(jù)庫批量裁剪工具可以直接統(tǒng)籌任務分發(fā),避免每個作業(yè)人員由于自身水平等原因耗時耗力,達到節(jié)省時間、提高作業(yè)效率的目的?;A性地理國情監(jiān)測作業(yè)圖見圖2所示。
圖2 基礎性地理國情監(jiān)測作業(yè)圖
作業(yè)人員根據(jù)自己的任務范圍進行基礎性地理國情監(jiān)測數(shù)據(jù)生產(chǎn),首先需要從上一年度基礎性地理國情成果庫中,提取自己任務范圍內(nèi)地理國情矢量數(shù)據(jù),完成第一批數(shù)據(jù)后,才能進行下一批數(shù)據(jù)的生產(chǎn)。從生產(chǎn)環(huán)節(jié)中可以得知:每一位作業(yè)人員需要多次從上一年度基礎性地理國情成果庫提取自己的作業(yè)數(shù)據(jù)。其中,由于上一年度基礎性地理國情成果庫成果較多,圖層要素達40多個,若是按照傳統(tǒng)的方式由作業(yè)人員一一提取,耗時較長,人工操作錯誤率較高?;贏rcPy地理空間數(shù)據(jù)庫批量裁剪工具可直接按任務分工將上一年度基礎性地理國情成果庫分割成每個作業(yè)人員的作業(yè)數(shù)據(jù)庫,大大地減少任務分工時間,提高分工準確率與基礎性地理國情監(jiān)測生產(chǎn)效率。
基礎性地理國情監(jiān)測地理信息數(shù)據(jù)庫采用文件地理信息數(shù)據(jù)庫的存儲方式進行存儲,按數(shù)據(jù)集(feature dataset)和要素層(feature class)組織,要素層要素只采用簡單點、線、面表達,共6個數(shù)據(jù)集,分別存儲在不同的文件地理信息數(shù)據(jù)庫中,具體存儲情況如表1、表2所示,若是按照現(xiàn)有的裁剪工具,需要對每一個要素集內(nèi)的每一個要素圖層進行一一裁剪。這樣操作數(shù)據(jù)庫,容易出現(xiàn)因人員操作失誤而導致數(shù)據(jù)裁剪出現(xiàn)錯誤,并且耗時耗力,本文設計的ArcPy地理空間數(shù)據(jù)庫批量裁剪工具可以很好的避免由于人工干預而造成的錯誤,并且效率比一一裁剪數(shù)據(jù)要高。
表1 基礎性地理國情監(jiān)測分區(qū)國情數(shù)據(jù)庫
表2 基礎性地理國情監(jiān)測不分區(qū)國情數(shù)據(jù)庫
本次設計以PyCharm作為python的編譯器,通過PyCharm使用ArcGIS本身安裝的python2.7版本進行程序編寫,通過使用ArcPy模板,進行基于ArcPy地理空間數(shù)據(jù)庫批量裁剪工具設計編寫,具體實現(xiàn)流程如圖3所示。
圖3 基于ArcPy地理空間數(shù)據(jù)庫批量裁剪工具原理
2.2.1 基于ArcPy實現(xiàn)地理空間數(shù)據(jù)庫批量裁剪工具主要代碼
(1) python識別中文路徑
由于數(shù)據(jù)存儲在中文路徑,因此需要在python加入代碼用于識別中文字符,便于程序識別電腦中文路徑,具體實現(xiàn)代碼如下:
# coding:utf-8
import arcpy
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
(2)基于ArcPy實現(xiàn)地理空間數(shù)據(jù)庫批量裁剪工具代碼
基于ArcPy實現(xiàn)地理空間數(shù)據(jù)庫批量裁剪工具使用思路如下:①選擇被裁剪數(shù)據(jù)庫,判斷數(shù)據(jù)庫類型為“文件地理數(shù)據(jù)庫(Geodatabase,GDB)”或“個人地理數(shù)據(jù)庫(Microsoft Database,MDB)”格式,為后期創(chuàng)建成果數(shù)據(jù)庫做準備;②判斷被裁剪數(shù)據(jù)庫是否存在要素數(shù)據(jù)集,若存在則遍歷數(shù)據(jù)庫內(nèi)所有的要素數(shù)據(jù)集及其要素類,若不存在,則遍歷被裁剪數(shù)據(jù)庫內(nèi)的要素類;③選擇裁剪要素,并根據(jù)裁剪要素選擇將要用于創(chuàng)建成果數(shù)據(jù)庫命名的字段,遍歷字段獲取字段唯一值;④根據(jù)裁剪要素字段名創(chuàng)建成果數(shù)據(jù)庫,并選擇裁剪要素,對被裁剪數(shù)據(jù)庫進行裁剪,保存在成果數(shù)據(jù)庫中。核心代碼如下:
1)工具箱初始參數(shù)
gdbPath=arcpy.GetParameterAsText(0) #獲取裁剪的數(shù)據(jù)庫路徑
clp_fea=arcpy.GetParameterAsText(1) #選擇裁剪要素圖層
fieldname=arcpy.GetParameterAsText(2) #選擇用于批量裁剪的字段
savepath=arcpy.GetParameterAsText(3) #選擇裁剪數(shù)據(jù)庫保存文件夾
dec=arcpy.Describe(clp_fea) #獲取裁剪要素的詳細信息
decbana=dec.baseName # 獲取裁剪要素的名稱
arcpy.env.workspace=gdbPath #設置工作空間
2)根據(jù)裁剪要素及相關(guān)字段獲取屬性唯一值
fielddatalist=[] #列表用于保存遍歷選擇要素某一字段值
#遍歷要素字段屬性唯一值
with arcpy.da.SearchCursor(clp_fea, fieldname) as cursor: # 通過游標獲取唯一值
for row in cursor:
if row[0] not in fielddatalist:
fielddatalist.append(row[0])
3)遍歷數(shù)據(jù)庫所有的要素集及要素類
fcf=[] #列表用于保存數(shù)據(jù)庫的要素類
fcs=[] #列表用于保存數(shù)據(jù)庫要素數(shù)據(jù)集
fcs_fc=[] #列表用于保存數(shù)據(jù)庫要素數(shù)據(jù)集及要素類的路徑
fds_fc=[] #列表用于保存數(shù)據(jù)庫要素數(shù)據(jù)集及要素類
fcs_in_fc=[] #列表用于保存數(shù)據(jù)庫要素類路徑
sr='' #初始化,用于保存數(shù)據(jù)庫坐標信息
for fds in arcpy.ListDatasets('','')+['']: # 遍歷gdbPath數(shù)據(jù)庫所有要素集及要素類
if not fds=='': #如果數(shù)據(jù)庫存在要素集
fcs.append(fds)
for fc in arcpy.ListFeatureClasses('', '', fds):
fcclip=os.path.join(arcpy.env.workspace,fds,fc)
fcs_fc.append(fcclip)
fdsfc=fds+ ""+ fc
采用SPSS20.0軟件對本研究數(shù)據(jù)進行處理,計量資料以t檢驗,(±s)表示,計數(shù)資料以x2檢驗,差異有統(tǒng)計學意義為P<0.05。
fds_fc.append(fdsfc)
desc=arcpy.Describe(fcclip)
sr=desc.SpatialReference
else: #如果數(shù)據(jù)庫不存在要素集
for fc in arcpy.ListFeatureClasses():
in_fc=arcpy.env.workspace+ ""+ fc
fcf.append(fc)
4)根據(jù)裁剪要素圖層裁剪數(shù)據(jù)庫
i1=0
lengi1=len(fielddatalist)
while i1 GDB=arcpy.CreateFileGDB_management(savepath, fielddatalist[i1]) #創(chuàng)建數(shù)據(jù)庫 i=0 lengi=len(fcs) while i arcpy.CreateFeatureDataset_management(GDB, fcs[i], sr) #創(chuàng)建數(shù)據(jù)庫 i+=1 clipfc=arcpy.SelectLayerByAttribute_management(decbana,"NEW_SELECTION", "%s='%s'"% (fieldname, fielddatalist[i1])) #根據(jù)遍歷列表fielddatalist讀取裁剪要素值 if not fcs=='': #數(shù)據(jù)庫要素集裁剪處理 l=0 lengl=len(fds_fc) while l savegdbfc=savepath+ ""+ fielddatalist[i1]+".gdb"+ ""+ fds_fc[l] arcpy.Clip_analysis(fcs_fc[l], clipfc, savegdbfc) #調(diào)用裁剪工具對數(shù)據(jù)庫裁剪 l+=1 if not fcf=='': #數(shù)據(jù)庫要素圖層裁剪處理 j=0 lengj=len(fcf) #遍歷要素集所有的圖層 while j savefcf=savepath+ ""+ fielddatalist[i1]+".gdb"+ ""+ fcf[j] arcpy.Clip_analysis(fcs_in_fc[j], clipfc, savefcf) #調(diào)用裁剪工具對數(shù)據(jù)庫裁剪 j+=1 i1+=1 2.2.2 基于ArcPy實現(xiàn)地理空間數(shù)據(jù)庫批量裁剪工具注意事項 (1)被裁剪數(shù)據(jù)庫必須為文件地理信息數(shù)據(jù)庫或個人地理信息數(shù)據(jù)庫; (2)裁剪要素必須為面要素,且坐標系與被裁剪數(shù)據(jù)庫坐標系一致,不然會由于坐標系不一致而導致程序無法正確運行; (3)裁剪要素所選擇的字段不能出現(xiàn)文件命名格式不允許的情況出現(xiàn),例如:“*”或“.”等。 2.2.3 地理空間數(shù)據(jù)庫批量裁剪工具運行情況 工具通過ArcMap添加工具箱的方式加入即可,打開工具,選擇被裁剪數(shù)據(jù)庫,裁剪要素,選擇字段,保存文件夾位置,然后運行程序,工具運行完成,用時1 min 53 s,工具執(zhí)行完成后,結(jié)果保存在指定的目錄,通過這樣的工具,既可減少由于作業(yè)人員操作誤差而導致的失誤,亦可提高任務分工效率。 基礎性地理國情監(jiān)測項目是一項關(guān)乎國家民生的工作,同時也是一項時間緊、任務重、長期性的工作,如何在生產(chǎn)項目過程中,提高生產(chǎn)效率與降低錯誤率,是基礎性地理國情監(jiān)測項目生產(chǎn)的重中之重,以廣東省基礎性地理國情監(jiān)測項目為例,每年投入人數(shù)不少于200人,在人員眾多、工作量繁重的情況下,使用基于ArcPy地理空間數(shù)據(jù)庫批量裁剪工具將人員解放出來,由專門的工作人員進行任務分配與溝通,采用1對多的工作模式,大大地提高了工作效率??傊?本文研究總結(jié)如下: (1)通過基于ArcPy地理空間數(shù)據(jù)庫批量裁剪工具可以將繁重的地理信息數(shù)據(jù)庫按區(qū)域提取工作交由計算機自動完成,減少人員干預,提高裁剪正確性,工具不僅可以在基礎性地理國情監(jiān)測項目中使用,也可應用到其他測繪地理信息項目。 (2)本文所設計工具在使用過程中,需在ArcMap工程文件的環(huán)境下方可運行,并且被裁剪數(shù)據(jù)庫與裁剪要素數(shù)據(jù)兩者坐標系統(tǒng)必須相同,不然無法得出正確的結(jié)果,未來將工具封裝為單獨運行的程序,做到不依賴于ArcMap工程文件運行。 (3)本文所設計的工具,僅對數(shù)據(jù)存儲為個人地理信息數(shù)據(jù)庫及文件地理信息數(shù)據(jù)庫格式的矢量地理信息數(shù)據(jù)庫有用,對其他數(shù)據(jù)存儲格式的矢量數(shù)據(jù)以及柵格數(shù)據(jù)尚未完善,后期將嘗試加入自動矢量數(shù)據(jù)與柵格數(shù)據(jù),根據(jù)輸入數(shù)據(jù)類型,實現(xiàn)自動化處理流程。3 結(jié)束語