?

基于ArcPy與定制ArcToolbox的礦山新增圖斑自動編號及方法改進

2021-07-08 10:42陳棟姚維嶺
自然資源遙感 2021年2期
關鍵詞:圖斑代碼矢量

陳棟,姚維嶺

(中國自然資源航空物探遙感中心,北京 100083)

0 引言

長期以來,礦產資源開發給國民經濟發展提供了強有力的保障,但由于多種原因,我國礦產資源開發“規模小、分布散、數量多”的局面仍然存在,礦產資源開發利用粗放、生產效率低、資源浪費嚴重的現象在部分地區一直有著不同程度的顯現[1]。礦山遙感監測可以為礦山地質環境恢復治理工作提供決策數據和監督手段[2]。通過遙感監測了解和掌握礦業活動占地情況、礦區地質災害分布狀況和礦山環境污染情況,為礦區環境綜合整治提供決策數據,同時也為礦山地質環境恢復治理工作提供監督手段。礦山遙感監測數據在礦產資源規劃、保持礦產資源可持續開發與利用、維護礦業秩序及綜合整治礦區環境等領域提供了重要基礎信息[3]。

礦山遙感監測是我國長期開展的一項礦情調查工作,監測成果的表達方式以圖件、表格、矢量數據為主。全國每年均會產生大量的礦山新增圖斑,主要包括新增礦山恢復治理土地和新增礦山損毀土地兩種類型。圖斑是當前礦山工作中的最小單位,也是對數據進行編輯整理、分析處理以及報表圖件制作的核心單位。所有的礦山監測、檢查工作都是圍繞著圖斑來進行的[4]。圖斑隸屬于礦山主體,一個礦山主體可能有一個或多個圖斑,若想要區分不同圖斑,納入數據庫中作為基礎數據管理,就需要用到圖斑編號。圖斑編號不僅是每一個圖斑的“身份證”,也是實現多期數據對比以及統計數據生成中不可或缺的一項內容,其準確性與唯一性是礦山遙感監測數據的關鍵,也是保證成果數據質量的基礎。

在目前礦山新增恢復治理及違法開采圖斑的成果制作中,給新增圖斑進行編號是一項既費時又容易出現差錯的工作。若出現錯誤,對本期數據,甚至對未來的工作也會產生很大的影響,也不利于以數據為支撐的礦政管理服務。

目前來看,礦山遙感監測新增圖斑編號的工作具有以下難點:

1)圖斑數據關聯密切,結構復雜,要求嚴格。依據目前的項目技術規范[5],礦山新增損毀和恢復治理圖斑編號共15位,由4部分組成,這4部分分別與圖斑的空間數據和屬性數據相關聯,導致結構復雜,要求嚴格。

2)圖斑編號工作量大,重復性高,易出錯。圖斑編號的編制工作往往是以省或縣為單元,涉及圖斑少則幾百,多則成千上萬,數據量龐大,重復性強,容易出現因技術人員頻繁、重復性的工作而導致的缺項漏項錯誤。另外,一旦在編制過程中某個圖斑編號錯誤,修改過程都需要重新排序一次,導致較高的時間和人力成本。

3)圖斑編號編制標準變化頻繁。因礦山遙感監測工作具有持續性的特點,項目技術規范經常會根據上級管理部門或服務對象的要求進行修改,技術人員需要不斷更新技術方案,按照新要求對圖斑進行重新編制,對技術人員的工作經驗有很高的要求。

為此,在當前礦山遙感監測工作數字信息化、流程規范化、信息提取自動化、統計分析智能化的趨勢下,利用計算機快速、高效、準確地完成數量龐大且關系復雜的礦山圖斑自動化編號就成為了一項亟待解決的工作,具有重要的現實意義和應用價值。

1 圖斑編號編制要求

數據提交說明是為了滿足礦山遙感調查與監測成果數據入庫以及信息系統開發的需要,對需要提交檢查并入庫的成果數據內容、數據格式、數據說明等信息做出的規定和要求[5]。需提交的成果數據內容有矢量數據、切圖、元數據表等,而新增圖斑編號不僅是矢量內圖斑的唯一編號,同時也與切圖名、元數據表索引緊密相關[6]。在最新一期二級項目技術要求中規定,新增圖斑編號共15位,由4部分組成,包括6位縣級行政區劃代碼、4位影像年份、1位類別代碼和4位順序號,其中類別代碼用于區分新增損毀與新增恢復治理圖斑,新增損毀圖斑為S,新增恢復治理圖斑為H。圖1是目前的礦山新增恢復治理及新增損毀圖斑編號示意圖。

圖1 礦山新增恢復治理及新增損毀圖斑編號示意圖Fig.1 Diagram of new restoration and new damage patches serial number

在手工編寫圖斑編號的過程中,行政區劃代碼、影像年份、類別代碼同一縣域內均相同,規則較為簡單,保證整體一致性即可;較為復雜的是順序號。近年來,新增圖斑編號在順序號這一項上的規則主要有兩項,即在每個縣域內,首先以“從左到右,從上到下”的編號順序,同時應保證同一礦山主體內圖斑的編號連續;也就是若圖斑在空間上連續,但是所屬礦山主體不同,也需要根據礦山主體來進行分組分別連續編號。

以圖2為例。圖2(a)為只遵從 “從左到右,從上到下”規則排序的示意圖,其中有淡綠與淡黃色的區域分別代表兩個礦山主體XKZ1與XKZ2。若引入礦山主體的約束,1,2,4,5屬于同一礦山主體XKZ1;3,6,7屬于另一礦山主體XKZ2,那么在圖斑編號的過程中內應先對XKZ1內這4個圖斑進行連續編號,再對XKZ2號礦山主體內接著上個礦山主體內最大序號進行編號,這樣兩許可證相交區域的圖斑編號順序就發生了改變,順序如圖2(b)。上述即為當前的新增圖斑編號手動工作方式,但是在現實工作中,各種圖斑之間的幾何關系比上圖更為復雜,所以在人工排序時時常會出現漏編、排序規則不統一的情況,對于整個項目成果的統一規范化表達、有效應用會產生不利影響。因此,自動編號的實現對于工作效率以及工作準確度的提升、成果的規范化表達具有重要價值。

(a)無礦山主體約束 (b)有礦山主體約束

2 自動編號的實現

當前礦山新增圖斑及成果是以省為單位進行提交的,而在每個省內是分縣進行的圖斑編號。分析數據提交說明中對于新增圖斑編號的命名規則,實現自動編號的需求,主要有如下幾步:①讀取全省域的矢量,根據縣行政代碼字段進行分割,形成每個縣一個矢量;②針對每一個縣域矢量,將其每一條記錄按照左上到右下的順序排列;③再根據礦山主體編號進行分組,同一主體進行順序排號;④補齊序號前的縣代碼、年份、類別代碼,寫入屬性表中對應字段。

2.1 技術手段

本文所提出的礦山新增圖斑編號自動編制工具基于ArcGIS10.2版本的ArcPy以及ArcToolbox開發完成。ArcGIS軟件的安裝自動配置ArcPy的運行環境(Python2.7)以及簡易代碼編輯器IDLE,為操作人員省去繁瑣的環境配置過程。

Python是一種解釋型的、通用的編程語言,具有簡單易學、功能強大、可跨平臺、不受局限等優點[7]。ArcPy是ESRI公司針對有批處理腳本以及二次開發需求的ArcGIS使用者,提供的一個Python站點包,是以arcgisscripting模塊為基礎并繼承了arcgisscripting功能構建而成的,目的是以實用高效的方式通過Python執行地理數據分析、數據轉換、數據管理和地圖自動化創建等功能[8]。簡單來說,就是ArcGIS的一些核心功能,如相交分析、屬性表查詢等功能,可以利用代碼來進行組合,實現依次運行的整合性功能組和一些需要大量重復操作的自動化運行[9-12]。

雖然ArcGIS內部也提供了Model Builder用以創建、編輯模型并集成化運行一系列的地理處理工具,但它只是為ArcGIS內部的功能提供了一個可視化、簡易化的一個工作流編輯器,對于Python語言本身很多強大高效的功能卻無法使用,而ArcPy而不會受此限制,拓展性更強。

2.2 矢量分割

矢量分割基本流程是:初始化一個列表結構XDM_list,來存儲縣代碼,再使用SearchCursor游標遍歷全省矢量,讀取其縣代碼字段下的數據,若此縣代碼不在這個列表中,那就將此縣代碼添加其中;否則跳過。這一次遍歷即可將此省所有縣代碼存儲進XDM_list中。

接下來依次讀取列表中每一個縣代碼,再次進行全省矢量的遍歷,使用到核心Select_Analysis函數,此函數的主要參數有3個:待處理矢量、輸出路徑以及選擇條件,選擇條件設置為縣代碼字段內容等于當前循環的縣代碼,即可將每一個縣的記錄分別導出成一個單獨的矢量。運行完成后就可以快速地實現在ArcMap中選擇-導出各縣矢量的操作。

2.3 空間位置第一次排序

這一步的核心是進行圖斑在空間位置上的排序。先直接使用ArcPy內置的排序函數,即Sort_management函數。此函數的主要參數有4項:待排序矢量、排序完成后輸出矢量路徑、待排序的字段及升降序、空間位置排序規則(如左上、左下等)。此函數可以2種方式進行矢量排序:UL排序和屬性數值排序。屬性數值只是根據第3項參數的大小進行排序;UL排序則是根據矢量具體的空間位置,按著給定規則進行排序。因為在礦山新增圖斑編號規則中,序號就是以從左到右、上到下的規則進行排序,等同于從左上開始依次排序,則首先就是以空間位置排序規則來進行排序,代碼如下:

arcpy.Sort_management(goal_layer,sortedgoal_layer,["Shape"],"UL")

需要說明一點,若想在Sort_management函數中使用空間位置排序,函數的第3個參數便要固定為“Shape”,才可以使得第4項參數有效,其中,UL代表從左上角開始排序,UR代表右上,LL代表左下,LR代表右下。

這一步完成后,已經輸出了從左上角開始排序且每個縣單獨一個的矢量,接下來就要針對礦山主體編號來進行二次編號。

2.4 礦山主體分組后二次排序

礦山主體分組后二次排序首先初始化一個記錄礦山主體編號的列表xkzSeq,針對某一個縣的矢量,遍歷所有記錄,使用類似于第一步中記錄所有縣代碼的方法,將此縣中所有出現過的礦山主體編號進行記錄。同時,因為此矢量中的記錄已經在空間上排序完成,那么,xkzSeq中的順序也代表著不同礦山主體在空間上的順序;接下來,初始化一個計數器i,按順序提取xkzSeq中的礦山主體編號,每提取一個礦山主體編號,就遍歷一次矢量中的記錄,對比xkzSeq中與記錄中的礦山主體編號,若相等,就可給當前記錄賦值順序號i,同時i自增1,不相等就跳轉到下一條記錄。這樣循環下來,既保證了空間順序的一致性,又保證了技術要求中“同一礦山主體的圖斑順序號要連續”的規定。

2.5 屬性類編號內容補足

第4步操作較為簡單,根據縣代碼、矢量類型和年份補足圖斑編號的其他位數。當所有步驟完成后,即可使用UpdateCursor,setValue和updateRow方法來對矢量內容進行更新。若有需要,可將所有編好號的分縣矢量使用Merge_management方法來進行合并,形成全省總矢量。至此,便實現了礦山新增圖斑編號的自動編制工作。

2.6 定制ArcToolbox

ArcGIS為用戶提供了一套地理處理任務的工具集,不僅提供基礎的數據處理、分析和制圖功能,而且提供腳本編程批處理、空間分析和建模功能,這些優勢都為降低開發成本和實現難度提供了充分的技術條件[13]。這些地理處理任務都包含在ArcToolbox工具箱中,其中包含了ArcGIS地理處理的大部分分析工具和數據管理工具[14-15]。大部分情況下軟件使用者都是單獨使用這些工具。對于一些需要整合不同工具形成流程化工作流的需求,ArcGIS也提供了定制工具箱方法,只保留需要用戶填寫的內容,以ArcToolbox式的可交互界面形式展現在用戶面前,本文便是使用這種方法對編寫的代碼進行整合。

在封裝工具箱之前,需要將代碼中需要用戶填寫的路徑、字段名等等內容挖空,如圖3(a)。接下來就可在ArcGIS新建自己的工具箱了。通過將挖空參數與界面中填空區域進行一一對應,如圖3(b),定制工具箱就可以開始運行并實現新增圖斑編號的全自動編制工作。

(a)參數挖空代碼 (b)定制工具箱界面

3 自動編號方法的改進

經過試驗,本方法雖然在排列較為規律的圖斑時能夠取得較為良好的效果,但是在處理現實中排列方式十分復雜的礦山圖斑的時候,空間位置第一次排序會出現不合理的結果。以西寧市大通回族土族自治縣的部分圖斑為例,如圖4(a)是使用Sort_management函數中UL的排序方式,可以發現,在這種情況下,2,3,4,5位的順序會出現左右方向較為大范圍的跨度;而且可以看出,直接使用UL參數進行的排序,更多的是遵循從上到下的順序,左右順序的混亂使這種排序方式不能應用到實際的工作當中。

(a)UL方法排序結果 (b)XY數值方法排序結果

圖4(b)是采用屬性數值方式排序。因從X,Y值的角度來看,從左到右、從上到下的順序就是X升序、Y降序在空間上的一種表現方式,所以,將參數改為X值升序,Y值降序的方式排序觀察效果,即

arcpy.Sort_management

(in_layer,out_layer,[["X","ASCENDING"],["Y","DESCENDING"]])

會發現排序的結果會更加混亂,如圖4(b)。此時感覺更多的是以從左到右,即X升序的方式進行排序,Y方向已無法看出明顯的規律,不符合排序規范,影響實際工作。所以,考慮改良排序方法,使之在X和Y方向上均能遵循一定的規范。

3.1 改良排序方法

本文考慮的是根據矢量的X值,首先對矢量空間進行分帶,這樣再從左向右依帶進行處理,就可實現整體范圍上從左向右依次排序的目標,不會出現圖中左右大范圍來回橫移的現象;在每一個分帶內,使用Y值從大到小依次排列,便可實現從上到下的排序。這種處理方法,雖然沒有實現從左到右、從上到下排序同時進行,但是在相對小尺度上能夠保證序號的基本連續與規范。排序方法的流程圖如圖5所示。

圖5 改良排序方法流程圖Fig.5 Flow chart of improved sorting method

3.2 改良排序方法的代碼實現

首先,對X值進行分帶,分別進行處理??紤]到我國大部分縣域以及礦山圖斑的跨度,結合已有的工作經驗,本文使用10′(約0.166 7°)一帶進行分帶,數值也可根據不同工作區進行手動調整。某個縣內的分帶數g計算公式為:

(1)

式中:Xmax與Xmin為最大和最小X值,通過Python的max()和min()方法可快速實現;[·]為向下取整符號。

接下來就是對每一個條帶內的Y值從大到小排列,因為此排序結果并沒有考慮礦山主體,不是最終結果,所以新建一個Seq_Long字段作為臨時記錄的一個字段,待最后排序完成將編號寫入原有字段中,再將此字段刪除。

遍歷當前縣矢量的過程中,判斷X值是否在此條帶范圍內,若在便可將當前圖斑的FID和Y值寫入FID_X字典中;當此條帶遍歷完成后,將FID_X根據Y值進行降序排列。排列代碼如下:

FID_X =sorted(FID_X.items(),key=lambda x:x[1],reverse=True)

在此需要注意,sorted方法雖然針對的是字典對象,但是在排序完成后,會將原字典變成列表,所以復制一個FID_X命名為FID_X2,用以二次循環時的鍵值比對。

最后就是將按排序好的順序,將序號寫入Seq_Long字段中,此時使用到了UpdateCursor,updateRow,getValue與setValue函數,用于對屬性表值的獲取及編輯。當遍歷完所有條帶后,當前縣所有圖斑的序號也就寫入完成了。寫入的代碼如下:

row.setValue("Seq_Long",get_Index(row.getValue("FID"),FID_X)+ firstIndex)

updateCursor.updateRow(row)

接下來也是根據礦山主體編號來分組再次排序,以及補齊其他位代碼形成完整的編號,方法與上述相同在此不再贅述。

使用相同的數據進行排序效果如圖6,可以看到1,2號圖斑分在了一個條帶中,余下其他圖斑分在了另一個。在每個條帶中按照由上到下順序排列,這樣就完成了在大范圍上由左向右,在小范圍上由上到下的排序方式。

圖6 改良方法排序結果Fig.6 Sequence in improved sorting method

4 實驗結果

本文對青海省化隆回族自治縣22個、門源回族自治縣53個、共和縣91個、大通湟中平安三縣共215個,以及全青海省(有圖斑共32個縣)近千個圖斑進行人工和自動編制的對比實驗??梢钥闯?,隨著工作量的增加,自動編號的效率對比手工編號越高;同時,本文也對五種數量下進行的人工和自動編制出現的誤差進行了比對,因手動編制出現編號錯誤后需要對當前縣再進行依次重新排序與編號,每一次誤差的返工耗時量在10 min左右,誤差代價十分巨大,而自動編號則不會出現錯誤,時間及誤差對比如表1。工作所用機器配置為戴爾P7920臺式工作站,Intel Xeon 4110 2.2 GHz CPU,96 GB內存。編號流程自動化的實現,不僅可以節省時間,提高工作效率。一旦出現編號規范變化的情況,重新編號僅僅需要修改少量代碼,大大降低時間和勞動成本。

表1 手動與自動圖斑編號時間及誤差對比Tab.1 Time and error comparison of manual and automatic patch numbering

5 結論

針對批量圖斑編號效率低、易出錯的問題,本文利用ArcPy并結合定制ArcToolbox實現了這一工作批量自動化處理,并用不同數據量的圖斑進行了對比實驗,結果表明新增礦山圖斑編制工作的效率得到提高,有助于礦山監測遙感工作信息化水平向更高層次發展。具體完成了以下幾項內容:

1)基于ArcPy編寫代碼,將過去在ArcGIS新增圖斑編號的編制工作中需要手動操作的部分進行整合處理,并且將代碼整合成ArcToolbox添加到ArcMap中直接使用,使得程序的分發與應用更加便捷高效,免去繁瑣的重復勞動,保證編號準確性,工作效率大大提升。

2)針對ArcPy中自帶的空間位置排序方法不適應于礦山遙感工作中要求的問題,將圖斑排序方法進行改良,能夠滿足在大尺度上從左到右,小尺度上從上到下的排序要求,使得圖斑編號更加規范,有據可查。

3)針對日后可能發生變化的技術要求與提交說明,只需更改排序方法內部的邏輯代碼即可實現對程序功能的更新,重新進行圖斑編號的工作量和時間成本也會大大減少。

4)此自動編號方法不僅適用于礦山新增圖斑,也適用于土地新增圖斑等有一定規則與數據量的編號工作。矢量自動編號是圖件編制的基礎,有助于礦山遙感監測成果統一規范化,只有高質量的成果數據和成果圖件,才能更有效服務于國家礦政管理工作、國土空間用途管制和礦山生態修復工作。

猜你喜歡
圖斑代碼矢量
地理國情監測中異形圖斑的處理方法
基于C#編程的按位置及屬性值自動合并圖斑方法探究
矢量三角形法的應用
土地利用圖斑自動檢測算法研究
創世代碼
創世代碼
創世代碼
創世代碼
基于矢量最優估計的穩健測向方法
三角形法則在動態平衡問題中的應用
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合