徐邦歲 魏春玲
(1.響水縣土地勘測有限公司,江蘇 鹽城 224600;2.響水縣自然資源和規劃局,江蘇 鹽城 224600)
近年來,隨著經濟社會的高速發展,我國陸續推進了“數字城市”“智慧城市”建設,以及國土調查、地理國情普查、房地一體不動產確權登記等一系列國家級項目,隨著這些重大項目的開展,測繪事業得到了快速發展,基層測繪單位開展了大量測繪活動,形成了海量的多源多維地理信息數據,由此,怎樣科學精準地管理這些數據成為當前亟待解決的問題。
日常地理信息數據管理工作通常使用ArcGIS 軟件處理各種相關任務,其中有大量重復性工作,比如數據格式轉換、數據拼接與裁切、數據輸出與保存等[1]。人工操作這些重復性工作容易出錯,效率低下,難以保證數據成果質量,由此,尋求一種高效快捷的批量處理方法極為重要。Python 作為ArcGIS 支持的一種腳本語言,功能強大、簡單易學,在數據批處理方面具有明顯優勢[2]。自ArcGIS 9.0 版本引入Python 后,逐漸得到廣大地理信息數據處理用戶的關注,并取得快速發展,之后ArcGIS 的每個版本都進一步增強了Python 體驗,為用戶提供了更加豐富、友好、更多功能性的體驗,用它編寫腳本程序是解決地理信息數據自動化批量處理的有效方法。本文結合工作實踐,利用Python 語言編寫代碼,通過調用第三方數據處理包以及自帶的標準庫,實現了三個地理信息數據批處理方面的應用,提高了數據處理的準確度和工作效率。
Python 是由荷蘭的計算機和數學家吉多·范羅蘇姆設計出的一種跨平臺的計算機程序設計語言,最早出現于1990 年代,開始只被當作取代ABC(一種分布式操作系統)的腳本語言[3],但不久后這種新型編程語言就被引入其他平臺,尤其成為了學習數據科學、虛擬現實和人工智能方面首選的一門編程語言。
Python 具有以下優勢:易于學習,適合初學者;可伸縮程度高,適用于大型項目或小型的一次性程序(稱為腳本);可移植,跨平臺;可嵌入ArcGIS;穩定成熟;用戶社區規模大[4]。美國ESRI 公司已將Python 完全納入ArcGIS,從ArcGIS 10 開始,ESRI采用ArcPy(通常稱為ArcPy 站點包),為用戶提供了使用Python 語言操作所有地理信息數據處理工具(包括擴展模塊)的機會,并提供多種有用的函數和類,用于處理和詢問GIS 數據。使用Python 和ArcPy,可以開發出數量無限的可處理地理數據的實用程序。
地理信息數據管理工作常常涉及空間數據格式轉換、數據拼接與裁切、數據輸出與保存等步驟,下面具體說明使用Python 實現這三個功能的過程。
筆者曾遇到一套采用國標NSDTF 格式的DEM 數據(如圖1 所示),其能使用文本格式保存,也可使用記事本打開查看,但ArcGIS 軟件卻不支持該格式的文件,需將其轉換為ESRI ASCII 格式才能正常使用。常規思路是將NSDTF 格式的DEM 數據通過人工修改來轉換,工作量大且容易出錯。若利用Python 強大的文本處理能力來編寫腳本程序,可實現全自動化數據格式轉換,工作效率將大大提高,并能保證數據轉換質量。

圖1 NSDTF_DEM數據
在編寫空間數據格式轉換程序前,查閱了相關資料了解NSDTF 文件頭的定義,其文件格式的定義如下:
DataMark:格網數據交換格式-中國地球空間數據交換格式(CNSDTF-RAS 或CNS-DTF-DEM)的標志。
Version:空間數據交換格式的版本號,如1.0。
Unit:坐標單位,K 是公里,M 是米,D 是以度為單位的經緯度,S 是以度分秒表示的經緯度(坐標格式為DDDMMSS.SSSS,DDD 為度,MM 為分,SS.SSSS 為秒)。
Alpha:方向角。Compress:壓縮方法,0 表示不壓縮,1 表示游程編碼。Xo:左上角原點X 坐標。Yo:左上角原點Y 坐標。DX:X 方向的間距。DY:Y 方向的間距。Row:行數。Col:列數。
HZoom:高程放大倍率,設置高程的放大倍率,使高程數據以整數形式來存儲,例如,高程精度精確到厘米,則高程的放大倍率為100。
ESRI ASCII 柵格格式可與其他基于像元或柵格的系統進行信息傳輸,其文件頭的格式說明如表1 所示。

表1 ESRI ASCII文件頭說明
Python 有強大的文本處理能力,其附帶的os 模塊可加載多種功能完善的文件操作函數,因此對于Python 來說,將DEM 轉換為ESRI ASCII 格式非常簡單,短短幾十行腳本代碼就能輕松實現,具體源代碼如下:



圖2 腳本運行過程
數據拼接與裁切的實現步驟為:首先將要拼接的數據轉換成統一格式(例如mdb 格式),再將數據進行坐標變換,統一到同一個投影坐標系,以便后續處理。根據不同項目的需求,規范數據的各要素集和屬性字段的名稱、類型等;其次創建一個空數據庫,該數據庫的要素集只含項目需要的要素集,不必是分幅數據中所有要素集,要素集的各屬性字段須和分幅數據完全相同 ;最后,進行數據拼接并輸出報告。部分代碼如下:
成果數據庫中需要的要素集列表
fileList = os.listdir(datadir)#分幅數據目錄中的所有文件
幅數據中的要素集列表
數據拼接后,還需使用作業區域界線(一般為縣界)進行裁切,同樣,通過整合后的標準分幅數據,如交通、水利普查等數據,由于范圍較廣、數據層較多、數據量大等,也要使用作業區域進行裁切。若用人工裁切,需耗費大量時間,因此,可使用Python 編程實現自動處理。需注意,數據工作空間中的每層要素都要遍歷,然后使用裁切范圍線進行自動裁切,主要代碼如下:
遍歷要素層

范圍裁切要素層位接圖表數據庫,提取每一個圖廊要素,作為裁切范圍。
日常工作中地理信息從業者常常需要把mxd 格式的地圖文檔輸出為pdf 格式文件,ArcGIS 10 以后的版本都提供了Arcpy.mapping 這樣一個Python 腳本模塊,該模塊可隨著ArcGIS for Desktop 一同安裝,利用Arcpy.mapping 模塊編程可將地圖文檔輸出為pdf格式,也可實現地圖文檔圖層數據源的更新、修復或替換、圖層符號系統更新、文本字符串修改等功能。
如果是單個mxd 文件輸出,在Arc-Map 的Python窗口中輸入兩行代碼就可實現,代碼如下:

同時,也可在上述代碼中加入output-PDF.appendPages(str(PDFPath)),實現把一個pdf 文件追加到另一個多頁pdf 文件中。
隨著大數據時代的到來,更加多源、海量、復雜的地理信息數據也會隨之而來[5],如何快速、高效地處理和利用這些數據,是地理信息工作者面臨的問題。Python 簡單易學,在數據自動化處理方面非常強大,熟練掌握并利用好Python 語言,對減輕工作人員的勞動強度、提高數據處理的效率和準確率有重大意義。