谷正楠 張震


摘要:針對以往GIS設計與開發課程教學中,學生對于編程語言畏難的問題,本文設計一個基于ArcPy的GIS數據批處理程序教學實驗,以批量裁剪柵格數據為例,詳細闡述了程序設計的具體思路及過程,旨在為學生自主設計實用的批處理程序提供參考,同時提高學生對GIS開發的自信,培養學生對GIS開發的興趣,加深學生對GIS開發的認識,強化學生的GIS開發能力,為以后的編程學習奠定基礎。
關鍵詞:ArcPy;GIS數據;批處理;程序設計;開發
中圖分類號:G642? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)18-0114-03
開放科學(資源服務)標識碼(OSID):
Teaching Experimental Design of GIS Data Batch Processing Program Based on ArcPy
GU Zheng-nan, ZHANG Zhen
(School of Geomatics, Anhui University of Science and Technology, Huainan 232001, China)
Abstract:For the current problem that students were afraid of programming language in the past teaching of GIS design and development courses, this article designs a teaching experiment of GIS data batch processing program based on ArcPy. Taking batch cropping of raster data as an example, the specific ideas of program design are explained in detail. The purpose of this process is to provide a reference for students to design practical batch processing programs independently, and at the same time improve students confidence in GIS development, cultivate students interest in GIS development, deepen students understanding of GIS development, and strengthen students GIS development capabilities. Lay the foundation for future programming learning.
Key words:ArcPy; GIS data; batch processing; program design; development
1 引言
GIS開發是地理信息科學專業重要的專業基礎課程[1-2],以往的授課多以ArcGIS Engine教學為主,學生編程基礎薄弱,會對開發產生畏難情緒[3],而Python語言簡單易學且編程靈活[4],有助于學生輕松上手。ArcPy是基于ArcGIS的Python站點包,通過調用ArcPy,可以開發出大量的用于處理GIS數據的實用程序[5],既可以解決傳統的ArcMap軟件處理GIS數據效率低、處理速度慢且容易出錯等問題[6-7],又可以培養學生對于GIS開發的積極性,加深學生對開發的認識,鍛煉學生的開發能力。因此,在傳統ArcGIS Engine教學前,引入基于ArcPy的GIS數據批處理實驗,有助于提高學生對開發的自信,拓寬學生對開發的視野,為以后的編程學習奠定基礎。
本文設計基于ArcPy的GIS數據批處理程序教學實驗,旨在讓學生學習和掌握Python和ArcPy程序設計的基礎知識與GIS二次開發技術相關的理論知識,并引導學生在以后的學習中自主開發實用的批處理程序。
2 ArcPy簡介
ArcPy是繼承ArcGIS 9中arcgisscripting模塊的基礎上,在ArcGIS 10中引入Python站點包發展而成[8-9]。它的出現為用戶在ArcGIS平臺上更便捷的使用 Python 語言操作提供了可能。通過調用ArcPy站點包,不僅可以訪問所有地理處理工具(包括擴展模塊),還可以調用多種有用的模塊、函數和類,便于快速查詢和批量處理GIS 數據。
3 GIS數據批處理實驗方案設計
3.1 實驗設計思路
實驗設計以柵格數據批量裁剪為例,通過詳細演示實驗步驟,引導學生根據實驗設計方案,選擇ArcToolbox中其他工具完成實驗。采用由淺入深的教學方法,詳細介紹柵格數據批量裁剪的思路,該思路對學生理解其他工具批處理操作具有重要的指導意義。
3.1.1 柵格數據裁剪思路
“幫助”是學習GIS開發最好的資料,在實驗中輔導學生根據“幫助”依次完成操作。雖然本課程的授課學生都具有ArcGIS操作的基礎,但缺乏對ArcGIS“幫助”中代碼的使用意識。本實驗以柵格初級裁剪為例引導學生查看“幫助”。
首先指導學生打開ArcToolbox中的柵格裁剪工具,查看“幫助”,復制下面這一行代碼:
arcpy.Clip_management(
"c:/data/image.tif","1952602 294196 1953546 296176",? ? "c:/data/clip.gdb/clip01","#","#","NONE","NO_MAINTAIN_EXTENT")
并將其拷貝到ArcMap的Python窗口中。根據“幫助”文檔:第一個參數和第四個參數分別是輸入的柵格數據和矢量數據,需要將其更改為自己的存儲路徑及數據名稱;第二個參數是裁剪范圍的坐標,按照X-Minimum,Y-Minimum,X-Maximum,Y-Maximum的順序存儲,打開ArcMap中的Clip工具,按照步驟將矢量數據導入便可以看到矢量數據的矩形范圍,按照順序更改該參數的數值;第三個參數是數據裁剪后的輸出路徑及數據名稱,同樣將其更改為自己的存儲路徑及保存名稱;第五個參數是設置缺失值,可以將其設置為0,也可以保持默認(#為默認值)設置;第六個參數是選擇裁剪的幾何形狀,有兩個值可選擇,NONE代表按照輸入數據的最小矩形范圍裁剪,ClippingGeometry代表按照輸入矢量數據的幾何形狀進行裁剪,這里選擇ClippingGeometry方式裁剪;第七個參數是選擇是否要調整裁剪范圍,同樣有兩個值可選擇,MAINTAIN_EXTENT代表按照矩形范圍進行裁剪,NO_MAINTAIN_EXTENT代表調整為按照輸入矢量數據的幾何形狀進行裁剪,這里選擇 NO_MAINTAIN_EXTENT。需要注意的是,即使第六個參數選擇的是ClippingGeometry,若第七個參數選擇MAINTAIN_EXTENT,結果也將是按照矩形范圍進行裁剪。
所有參數設置完成后,運行代碼,即可得到柵格數據的處理結果,如圖1所示:
該方法雖然能夠正確實現柵格數據裁剪,但每次都需要重新寫入代碼,耗時耗力。因此,引導學生將“幫助”文檔里的所有代碼復制到IDLE的腳本文件里:
import arcpy
arcpy.env.workspace = "C:/Workspace"
arcpy.Clip_management(
"c:/data/image.tif","1952602 294196 1953546 296176",? ? "c:/data/clip.gdb/clip01","#","#","NONE","NO_MAINTAIN_EXTENT")
其中,arcpy.env.workspace為設置工作空間,即將其路徑設置為待處理柵格數據的存儲路徑,并將Clip_management( )函數的七個參數按照前文所述的步驟進行修改。值得注意的是,每次運行代碼時都需要去查找矢量數據的矩形范圍,很不便捷。
接下來引入Describe( )函數的概念,指導學生在“幫助”中找到Describe( )函數。ArcPy中的Describe( )函數可以訪問不同數據集和數據集的不同屬性對象,包括輸入數據集的數據類型、空間參考、要素范圍以及屬性字段等。基于此,通過該函數的extent屬性來訪問輸入矢量數據的矩形范圍。修改后的代碼為:
import arcpy
arcpy.env.workspace = " D:/data"
clipFeature = "D:/data/clip.shp"
raster = "D:/data /image.tif"
outraster = " D:/result.gdb/clip"
desc = arcpy.Describe(clipFeature)
extent = desc.extent
arcpy.Clip_management(
raster , str(extent), outraster, clipFeature , "#","ClippingGeometry" ,"NO_MAINTAIN_EXTENT")
同時思考:如何基于以上程序,對多幅影像實現批量裁剪?
常規思路:循環與if語句相結合,通過對擴展名進行篩查的方式獲取目標數據。
ArcPy提供的思路:利用ArcPy中提供的一系列列表函數。
3.1.2 批處理思路
首先在“幫助”文檔里找到ArcPy提供的函數,打開列表數據(Listing data),瀏覽Arcpy提供的九個列表函數。列表函數可以根據指定條件進行搜索,列出所有符合條件的數據,并以列表的形式返回。如處理矢量數據可以采用ListFeatureClasses( )函數,處理字段類型數據可以采用ListFields( )函數,處理文件類型的數據可以采用ListFiles( )函數等。這里處理的數據為柵格數據,故采用ListRasters( )函數,同樣將下面的代碼復制到腳本文件里:
rasters = arcpy.ListRasters("*", "GRID")
for raster in rasters:
ListRasters( )函數包括wild_card和raster_type兩個參數,分別代表文件名稱和類型。將上面代碼的文件類型更改為tif,即可列出文件夾中所有.tif格式的柵格數據,再結合for循環,即可實現數據的批處理。修改后的代碼為:
import arcpy
import os
arcpy.env.workspace = " D:/data"
clipFeature = "D:/data/clip.shp"
rasters = arcpy.ListRasters("*", "tif")
for raster in rasters:
outraster= "D:/result.gdb/" + os.path.splitext(raster)[0] + "_clip"
desc = arcpy.Describe(clipFeature)
extent = desc.extent
arcpy.Clip_management(
raster , str(extent), outraster, clipFeature , "#","ClippingGeometry" ,"NO_MAINTAIN_EXTENT")
這里用到了os包提供的splitext( )函數,該函數可以將文件名與擴展名分離出來,從而實現為每一個輸出影像不重復命名。
3.1.3 程序界面設計
將編寫完成后的程序打包為ArcGIS中地理處理工具形式的Toolbox,便于下次處理數據時直接使用。同時注意,上述代碼都是直接指定路徑的,若想實現與用戶的交互操作,還需要引入GetParameterAsText( )函數,該函數可以以字符串的形式獲取輸入數據和輸出數據的路徑。因此完成代碼的最后一步是要將上述代碼的所有路徑更改為arcpy.GetParameterAsText(i)(i按照先后順序賦為0,1,2…),然后在ArcMap中新建一個Toolbox,并將腳本文件導入Toolbox,設置相應參數。最后設計的程序界面如圖2所示:
根據該程序,裁剪柵格數據(.tif格式)時,只需要輸入柵格數據的存儲路徑、裁剪范圍(.shp文件)并選擇裁剪結果的保存路徑即可。
3.2 學生實驗實施與效果
本實驗的最終目的是幫助學生快速理解在ArcGIS平臺中Python和ArcPy的開發方式、掌握ArcPy批處理程序并提高學生的GIS開發能力。基于此,在對2017級地理信息科學專業的學生進行基于ArcPy的GIS數據批處理程序教學實驗設計的課程后,讓學生根據上述實驗,在ArcToolbox中選擇任意工具(不得重復選擇)設計批處理程序并撰寫實驗報告。
結果表明,通過本次實驗,多數學生已經認識到了ArcPy功能的強大以及批處理程序設計的便捷,實現了對ArcPy的入門,并有興趣繼續學習程序設計,以便在未來的學習中可以解決更多問題。
4 結束語
本文基于ArcPy站點包,設計了一個批量裁剪柵格影像的程序,通過該程序可以使學生更直觀、清楚的了解到基于ArcPy設計批處理程序處理GIS數據的快速、高效,也可以培養學生對于程序設計的興趣。同時,本程序設計的方法、思想也同樣適用于基于ArcPy的其他批處理程序設計,可以為學生自主開發批處理程序提供參考,提高學生的GIS開發能力。
參考文獻:
[1] 姜建武,李景文,陸妍玲,等.普通本科GIS專業技術開發類課程教學探討[J].中國教育技術裝備,2019(6):95-97.
[2] 馬曉哲,張曉萱,耿文均.高校GIS專業軟件開發課程教學現狀及革新[J].高師理科學刊,2019,39(6):98-101.
[3] 胡最.地方高校GIS專業程序設計技能培養[J].地理空間信息,2020,18(12):58-62,7.
[4] 楊彩云,詹國華.引導性問題案例在Python數據分析基礎課程的教學[J].計算機教育,2021(1):154-157,162.
[5] 周崴,徐東炯,沈麗娟.基于Python和ArcPy的專題圖批量制作方法[J].測繪與空間地理信息,2020,43(10):17-20.
[6] 曹斌.基于ArcPy的矢量數據批處理方法研究[J].科技創新與應用,2017(21):90,92.
[7] 段春華,高磊.基于ArcPy的圖斑影像批量截圖方法研究[C]//江蘇省測繪地理信息學會2020年學術年會論文集.南京,2020:113-115.
[8] 邱世平,潘立仁,韋建飛.基于ArcGIS數據驅動頁面與Python腳本語言的專題圖批量出圖技術研究[J].林業調查規劃,2020,45(2):15-20.
[9] 杜寧,劉國棟.基于Arcpy與ModelBuilder批量提取柵格數據屬性表模型實驗的分析[J].重慶建筑,2020,19(3):13-14.
【通聯編輯:王力】