
摘要:該文以地震工程鉆孔數據的批量處理為案例,探討了如何結合ArcGIS10.8版本中的Python腳本編程以及ArcToolbox工具箱,開發自動化的數據批量導入和檢索程序。這一過程通過對數據的導入和篩選,有效提高了工作流程的效率。
關鍵詞:鉆孔數據規范化處理;腳本編程;數據檢索;自動化流程
doi:10.3969/J.ISSN.1672-7274.2024.11.005
中圖分類號:P 315;TP 3" " " " " " " " "文獻標志碼:A" " " " " " 文章編碼:1672-7274(2024)11-00-03
Research on the Method of Batch Importand Retrieval of Borehole Data
Based on Python in the ArcGIS Environment
A NaEe1, ZHANG HaoMing1, WangLei1, YANG Yuxia2
(1. Inner Mongolia Seismological Bureau, Hohhot 010051, China; 2.School of Computer Science and Technology, Inner Mongolia University for Nationalities, Tongliao" 028099, China)
Abstract: This study takes the batch processing of drilling data in seismic engineering as an example, and discusses how to develop an automated batch data import and retrieval program by combining Python script programming in ArcGIS 10.8 and ArcToolbox. This process effectively improves the efficiency of the workflow by importing and screening the data.
Keywords: borehole data standardization processing, ArcGIS, Python, script programming, data retrieval, automated process
0" "引言
ArcGIS內置的ArcToolbox工具箱,為GIS專業人士提供了一系列高效的批處理工具,可執行范圍從簡易的緩沖區創建與多邊形疊加,到高級的回歸分析與遙感影像分類等多樣化GIS任務。在進行GIS建模或數據管理時,經常需要對大量數據進行一連串的處理,以提升操作精度并降低重復工作量,此時可借助腳本程序模型進行輔助[1]。
1" "Python及Arcpy工具包概述
Python,作為一種廣泛應用的開源、跨平臺編程語言,在引入ArcGIS 9.0之際被整合入系統,自那時起,Python成為ArcGIS的主要腳本語言并不斷進化。以Esri公司為例,他們主要采用C++語言來開發ArcGIS軟件[2]。ArcGIS中的所有開發包含ArcObjects的應用程序[3]。Python的利用則更加靈活,它不僅能夠訪問ArcGIS現有功能,還能通過函數組合來擴展ArcGIS的功能[4]。
Arcpy是一款Python站點包,旨在提供一種高效且實用的方式,通過Python實現地理數據的分析、轉換、管理和地圖自動化。Arcpy使用戶能夠通過Python語言接口操控所有的地理處理工具(包括擴展模塊),并且提供了眾多功能函數與類,以便于GIS數據的處理和查詢。采用Arcpy編寫的ArcGIS應用程序和腳本具有雙重優勢:一是它能夠便捷地訪問眾多Python模塊,并與ArcGIS系統無縫集成;二是Python作為一種易于掌握的通用編程語言,通過這種解釋型和動態編程語言,用戶能夠在交互式環境中迅速構建腳本原型并進行驗證測試[5]。
2" "程序設計
2.1 流程規劃
按照需要實現的基礎功能,程序的模塊功能如下:①檢索文件夾中所有項目名稱、經緯度、存儲路徑,將檢索結果以列表形式展示;②設置篩選功能,以用戶輸入的經緯度坐標為中心,以用戶自定義的距離為搜索半徑檢索區域內所有項目;③設置鼠標動作,增加選定和打開項目文件夾功能。
2.2 程序實現
為保證較好的可移植性和二次開發功能,選用Qt程序包設計腳本GUI。在實際操作中,可安裝適用于Python的PyQt程序包,安裝時需注意PyQt版本應與Arcgis自帶的Python版本相匹配[6-8]。可在Ui_MainWindow類中定義各類組件的大小及坐標組裝GUI界面,代碼示例如下:
class Ui_MainWindow(object):
defsetupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8
(\"MainWindow\")) MainWindow.resize(951, 806)
self.groupBox = QtGui.QGroupBox(self.centralwidget)
self.groupBox.setGeometry(QtCore.QRect
(90,110, 771, 91)) self.groupBox.setObjectName
(_fromUtf8(\"groupBox\"))
self.groupBox.setTitle(_translate(\"MainWindow\",\"參數設置\", None))
項目搜索功能涉及搜索的根目錄、搜索的中心點和搜索半徑,具體實現方式如下:①在讀取GUI界面中所需信息后,通過python的xlrd程序包讀取根目錄中每個項目的標準化信息表;②從信息表中提取鉆孔經緯度坐標;③根據搜索中心點和搜索半徑篩選目標項目;④提取目標信息,以二維表形式展示。其中項目篩選的代碼示例如下:
defrpscreen(list,lati,longti,searchrange,fcount):#
對全部項目篩選
inrange_count = 0
inrange_list =[[iforjinrange(6)] foriinrange(fcount)]
fori_inrangeinrange(fcount):
i_lati = list[i_inrange][2]i_longti =
list[i_inrange][3]dlati =(lati- i_lati)*100
dlongti =(longti -i_longti)*111.32
distance = math.sqrt( dlati* dlati +dlongti* dlongti)
ifdistancelt;= searchrange:
inrange_list[inrange_count][0]" " " " " " " " " " " =
list[i_inrange][0]inrange_list[inrange_count][1] =
list[i_inrange][1]inrange_list[inrange_count][2] =
list[i_inrange][2]inrange_list[inrange_count][3] =
list[i_inrange][3]inrange_list[inrange_count][4] =
list[i_inrange][4]inrange_count = inrange_count +1
return inrange_list, inrange_count
其中,list為包含全部項目經緯度的二維信息表、lati為搜索中心的緯度、longti為搜索中心的經度、searchrange為搜索半徑、fcount為篩選出來的項目總數。由于Arcgis在GUI上顯示時需要從UTF-8編碼轉換為gbk才可以正常顯示中文字符,需將第一列中文項目名進行轉碼(datac ol=0),具體代碼示例如下:
#導入表格內顯示
self.tableWidget.setRowCount(inrange_count)f
or datarow in range(inrange_count):
fordatacolinrange(5):#載入基礎數據
ifdatacol == 0:###中文項目名解碼
rptableItems = inrange_list[datarow][datacol]
rptableItems = rptableItems.decode('gbk')
rptableItem =
QtGui.QTableWidgetItem(rptableItems)self.tableWidge
t.setItem(datarow,datacol,rptableItem)
else:
rptableItem =
QtGui.QTableWidgetItem(str(inrange_list[datarow][datacol]))self.tableWid
get.setItem(datarow,datacol,rptableItem)
最后,設置鼠標動作,在雙擊某一項目所在的行時打開項目文件夾,設置方式如下。至此,已實現插件全部預期功能。
#打開報告文件夾
deftableWidget_double_clicked(self,index):
table_row = index.row()
#print(table_row)
folder = self.tableWidget.item(table_row,4).text()#print(folder)
os.startfile(folder)
3" "案例分析
3.1 研究背景
本文中收集整理了2005年以來內蒙古震防中心開展過的地震安全性評價、地震小區劃、區域性地震安全性評價項目1 700余個鉆孔相關數據,包括鉆孔成果以及成果圖件、成果報告等內容。
為了革新傳統的地震工程地質勘查鉆孔資料存儲管理模式,本研究旨在提供一種高效的數據檢索、篩選、統計和管理方法,通過開發基于ArcGIS平臺的腳本工具實現批量輸入、搜索地質鉆探數據,以及腳本工具的共享功能。
3.2 數據選取
本文中主要搜集了經省級審核批準或已備案的地震安全性評估報告,并從中提取地震鉆孔的勘察成果及其相關地震動參數等。數據整合是基于統一的數據模板進行的[9-10]。鉆孔編號的命名規則是“地區名稱+該區域鉆孔總序號”。數據文件分為Excel電子表格數據和柵格圖像數據兩類,其中Excel數據的序號標記為“E1”,柵格圖像數據的文件序號范圍為“P1”至“P9”。
3.3 操作實例
一份完備的地震工程鉆孔資料共包含10個數據文件,其中包括一個Excel電子表格文件,記錄了鉆探數據的標準化信息,是鉆探資料的主體部分,另外的9份圖像文件則是數據的重要輔助內容。所有的標準化鉆孔數據都儲存在一個Excel文件中(文件序號標記為“E1”),該文件包含18個工作表,具體內容見表1所示。
利用ArcGIS平臺結合Python語言開發了自動化腳本程序。利用該腳本,工作人員能夠通過指定項目路徑快速導入所有鉆孔數據,并可設定參數進行數據檢索,如輸入地理坐標和設定搜索半徑來篩選所需的鉆探數據,大幅提高了工作效率,降低了工作人員的勞動強度。
4" "結束語
本文基于ArcGIS平臺,利用Python腳本定制開發,實現了鉆孔數據的高效批量導入和檢索,極大地縮短了數據搜索和篩選過程中所需的時間。后期將鉆孔數據庫通過二次開發,實現可視化、空間分析、專題圖制作,研究建立地球深部科普服務平臺。此項研究是內蒙古自治區地震局首次將多個地震安全評價項目收集整理與標準化,這項研究工作有利于后期項目成果統一入庫,統一管理,為內蒙古自治區地震局地震災害風險防治區劃和第六代地震區劃圖編制尊定基礎,同時也為內蒙古地區城市地震災害風險評估與抗震規劃提供參考價值。
參考文獻
[1] 呂德昊,宋偉東,董山,賈國輝,金光.利用Python腳本在ArcGIS中實施地理數據批處理的方法研究[J].測繪與空間地理信息,2021,44(2):111-117.
[2] 易嘉.城市交通分區優化劃分方法研究[D].上海:同濟大學,2006.
[3] 趙永國,譚建軍.ArcObjects架構下多種版面要素處理研究[C].ArcGIS及ERDAS中國用戶會議,2006.
[4] 包瑞清.ArcGIS平臺下的Python編程指南[M].南京:江蘇鳳凰科學技術出版社,2015.
[5] 林璐,王爽,李海泉,等.在ArcGIS下基于Python的矢量數據處理方法[J].測繪技術裝備,2016,18(4):63-65.
[6] [美]Eric Pimpler 著.基于ArcGIS的Python編程秘笈(第2版)[M]. 牟乃夏,張靈先,張恒才 譯.北京:人民郵電出版社,2017.
[7] [美]Eric Matthes 著.Python編程從入門到實踐(第2版)[M].袁國忠,譯.北京:人民郵電出版社,2021.
[8] [美]Paul A.Zandbergen 著.面向ArcGIS的Python腳本編程[M].李明巨,譯.北京:人民郵電出版社,2014.
[9] 劉翔宇,朱大明.ArcGIS中基于Python的地理數據庫批量合并方法研究[J].軟件,2018,39(7):161-165.
[10] 邱世平,潘立仁,韋建飛.基于ArcGIS數據驅動頁面與Python腳本語言的專題圖批量出圖技術研究[J].林業調查規劃,2020,45(2):15-20.