谷正楠 張震
摘要:針對(duì)以往GIS設(shè)計(jì)與開發(fā)課程教學(xué)中,學(xué)生對(duì)于編程語(yǔ)言畏難的問題,本文設(shè)計(jì)一個(gè)基于ArcPy的GIS數(shù)據(jù)批處理程序教學(xué)實(shí)驗(yàn),以批量裁剪柵格數(shù)據(jù)為例,詳細(xì)闡述了程序設(shè)計(jì)的具體思路及過程,旨在為學(xué)生自主設(shè)計(jì)實(shí)用的批處理程序提供參考,同時(shí)提高學(xué)生對(duì)GIS開發(fā)的自信,培養(yǎng)學(xué)生對(duì)GIS開發(fā)的興趣,加深學(xué)生對(duì)GIS開發(fā)的認(rèn)識(shí),強(qiáng)化學(xué)生的GIS開發(fā)能力,為以后的編程學(xué)習(xí)奠定基礎(chǔ)。
關(guān)鍵詞:ArcPy;GIS數(shù)據(jù);批處理;程序設(shè)計(jì);開發(fā)
中圖分類號(hào):G642? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)18-0114-03
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(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開發(fā)是地理信息科學(xué)專業(yè)重要的專業(yè)基礎(chǔ)課程[1-2],以往的授課多以ArcGIS Engine教學(xué)為主,學(xué)生編程基礎(chǔ)薄弱,會(huì)對(duì)開發(fā)產(chǎn)生畏難情緒[3],而Python語(yǔ)言簡(jiǎn)單易學(xué)且編程靈活[4],有助于學(xué)生輕松上手。ArcPy是基于ArcGIS的Python站點(diǎn)包,通過調(diào)用ArcPy,可以開發(fā)出大量的用于處理GIS數(shù)據(jù)的實(shí)用程序[5],既可以解決傳統(tǒng)的ArcMap軟件處理GIS數(shù)據(jù)效率低、處理速度慢且容易出錯(cuò)等問題[6-7],又可以培養(yǎng)學(xué)生對(duì)于GIS開發(fā)的積極性,加深學(xué)生對(duì)開發(fā)的認(rèn)識(shí),鍛煉學(xué)生的開發(fā)能力。因此,在傳統(tǒng)ArcGIS Engine教學(xué)前,引入基于ArcPy的GIS數(shù)據(jù)批處理實(shí)驗(yàn),有助于提高學(xué)生對(duì)開發(fā)的自信,拓寬學(xué)生對(duì)開發(fā)的視野,為以后的編程學(xué)習(xí)奠定基礎(chǔ)。
本文設(shè)計(jì)基于ArcPy的GIS數(shù)據(jù)批處理程序教學(xué)實(shí)驗(yàn),旨在讓學(xué)生學(xué)習(xí)和掌握Python和ArcPy程序設(shè)計(jì)的基礎(chǔ)知識(shí)與GIS二次開發(fā)技術(shù)相關(guān)的理論知識(shí),并引導(dǎo)學(xué)生在以后的學(xué)習(xí)中自主開發(fā)實(shí)用的批處理程序。
2 ArcPy簡(jiǎn)介
ArcPy是繼承ArcGIS 9中arcgisscripting模塊的基礎(chǔ)上,在ArcGIS 10中引入Python站點(diǎn)包發(fā)展而成[8-9]。它的出現(xiàn)為用戶在ArcGIS平臺(tái)上更便捷的使用 Python 語(yǔ)言操作提供了可能。通過調(diào)用ArcPy站點(diǎn)包,不僅可以訪問所有地理處理工具(包括擴(kuò)展模塊),還可以調(diào)用多種有用的模塊、函數(shù)和類,便于快速查詢和批量處理GIS 數(shù)據(jù)。
3 GIS數(shù)據(jù)批處理實(shí)驗(yàn)方案設(shè)計(jì)
3.1 實(shí)驗(yàn)設(shè)計(jì)思路
實(shí)驗(yàn)設(shè)計(jì)以柵格數(shù)據(jù)批量裁剪為例,通過詳細(xì)演示實(shí)驗(yàn)步驟,引導(dǎo)學(xué)生根據(jù)實(shí)驗(yàn)設(shè)計(jì)方案,選擇ArcToolbox中其他工具完成實(shí)驗(yàn)。采用由淺入深的教學(xué)方法,詳細(xì)介紹柵格數(shù)據(jù)批量裁剪的思路,該思路對(duì)學(xué)生理解其他工具批處理操作具有重要的指導(dǎo)意義。
3.1.1 柵格數(shù)據(jù)裁剪思路
“幫助”是學(xué)習(xí)GIS開發(fā)最好的資料,在實(shí)驗(yàn)中輔導(dǎo)學(xué)生根據(jù)“幫助”依次完成操作。雖然本課程的授課學(xué)生都具有ArcGIS操作的基礎(chǔ),但缺乏對(duì)ArcGIS“幫助”中代碼的使用意識(shí)。本實(shí)驗(yàn)以柵格初級(jí)裁剪為例引導(dǎo)學(xué)生查看“幫助”。
首先指導(dǎo)學(xué)生打開ArcToolbox中的柵格裁剪工具,查看“幫助”,復(fù)制下面這一行代碼:
arcpy.Clip_management(
"c:/data/image.tif","1952602 294196 1953546 296176",? ? "c:/data/clip.gdb/clip01","#","#","NONE","NO_MAINTAIN_EXTENT")
并將其拷貝到ArcMap的Python窗口中。根據(jù)“幫助”文檔:第一個(gè)參數(shù)和第四個(gè)參數(shù)分別是輸入的柵格數(shù)據(jù)和矢量數(shù)據(jù),需要將其更改為自己的存儲(chǔ)路徑及數(shù)據(jù)名稱;第二個(gè)參數(shù)是裁剪范圍的坐標(biāo),按照X-Minimum,Y-Minimum,X-Maximum,Y-Maximum的順序存儲(chǔ),打開ArcMap中的Clip工具,按照步驟將矢量數(shù)據(jù)導(dǎo)入便可以看到矢量數(shù)據(jù)的矩形范圍,按照順序更改該參數(shù)的數(shù)值;第三個(gè)參數(shù)是數(shù)據(jù)裁剪后的輸出路徑及數(shù)據(jù)名稱,同樣將其更改為自己的存儲(chǔ)路徑及保存名稱;第五個(gè)參數(shù)是設(shè)置缺失值,可以將其設(shè)置為0,也可以保持默認(rèn)(#為默認(rèn)值)設(shè)置;第六個(gè)參數(shù)是選擇裁剪的幾何形狀,有兩個(gè)值可選擇,NONE代表按照輸入數(shù)據(jù)的最小矩形范圍裁剪,ClippingGeometry代表按照輸入矢量數(shù)據(jù)的幾何形狀進(jìn)行裁剪,這里選擇ClippingGeometry方式裁剪;第七個(gè)參數(shù)是選擇是否要調(diào)整裁剪范圍,同樣有兩個(gè)值可選擇,MAINTAIN_EXTENT代表按照矩形范圍進(jìn)行裁剪,NO_MAINTAIN_EXTENT代表調(diào)整為按照輸入矢量數(shù)據(jù)的幾何形狀進(jìn)行裁剪,這里選擇 NO_MAINTAIN_EXTENT。需要注意的是,即使第六個(gè)參數(shù)選擇的是ClippingGeometry,若第七個(gè)參數(shù)選擇MAINTAIN_EXTENT,結(jié)果也將是按照矩形范圍進(jìn)行裁剪。
所有參數(shù)設(shè)置完成后,運(yùn)行代碼,即可得到柵格數(shù)據(jù)的處理結(jié)果,如圖1所示:
該方法雖然能夠正確實(shí)現(xiàn)柵格數(shù)據(jù)裁剪,但每次都需要重新寫入代碼,耗時(shí)耗力。因此,引導(dǎo)學(xué)生將“幫助”文檔里的所有代碼復(fù)制到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為設(shè)置工作空間,即將其路徑設(shè)置為待處理柵格數(shù)據(jù)的存儲(chǔ)路徑,并將Clip_management( )函數(shù)的七個(gè)參數(shù)按照前文所述的步驟進(jìn)行修改。值得注意的是,每次運(yùn)行代碼時(shí)都需要去查找矢量數(shù)據(jù)的矩形范圍,很不便捷。
接下來引入Describe( )函數(shù)的概念,指導(dǎo)學(xué)生在“幫助”中找到Describe( )函數(shù)。ArcPy中的Describe( )函數(shù)可以訪問不同數(shù)據(jù)集和數(shù)據(jù)集的不同屬性對(duì)象,包括輸入數(shù)據(jù)集的數(shù)據(jù)類型、空間參考、要素范圍以及屬性字段等。基于此,通過該函數(shù)的extent屬性來訪問輸入矢量數(shù)據(jù)的矩形范圍。修改后的代碼為:
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")
同時(shí)思考:如何基于以上程序,對(duì)多幅影像實(shí)現(xiàn)批量裁剪?
常規(guī)思路:循環(huán)與if語(yǔ)句相結(jié)合,通過對(duì)擴(kuò)展名進(jìn)行篩查的方式獲取目標(biāo)數(shù)據(jù)。
ArcPy提供的思路:利用ArcPy中提供的一系列列表函數(shù)。
3.1.2 批處理思路
首先在“幫助”文檔里找到ArcPy提供的函數(shù),打開列表數(shù)據(jù)(Listing data),瀏覽Arcpy提供的九個(gè)列表函數(shù)。列表函數(shù)可以根據(jù)指定條件進(jìn)行搜索,列出所有符合條件的數(shù)據(jù),并以列表的形式返回。如處理矢量數(shù)據(jù)可以采用ListFeatureClasses( )函數(shù),處理字段類型數(shù)據(jù)可以采用ListFields( )函數(shù),處理文件類型的數(shù)據(jù)可以采用ListFiles( )函數(shù)等。這里處理的數(shù)據(jù)為柵格數(shù)據(jù),故采用ListRasters( )函數(shù),同樣將下面的代碼復(fù)制到腳本文件里:
rasters = arcpy.ListRasters("*", "GRID")
for raster in rasters:
ListRasters( )函數(shù)包括wild_card和raster_type兩個(gè)參數(shù),分別代表文件名稱和類型。將上面代碼的文件類型更改為tif,即可列出文件夾中所有.tif格式的柵格數(shù)據(jù),再結(jié)合for循環(huán),即可實(shí)現(xiàn)數(shù)據(jù)的批處理。修改后的代碼為:
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( )函數(shù),該函數(shù)可以將文件名與擴(kuò)展名分離出來,從而實(shí)現(xiàn)為每一個(gè)輸出影像不重復(fù)命名。
3.1.3 程序界面設(shè)計(jì)
將編寫完成后的程序打包為ArcGIS中地理處理工具形式的Toolbox,便于下次處理數(shù)據(jù)時(shí)直接使用。同時(shí)注意,上述代碼都是直接指定路徑的,若想實(shí)現(xiàn)與用戶的交互操作,還需要引入GetParameterAsText( )函數(shù),該函數(shù)可以以字符串的形式獲取輸入數(shù)據(jù)和輸出數(shù)據(jù)的路徑。因此完成代碼的最后一步是要將上述代碼的所有路徑更改為arcpy.GetParameterAsText(i)(i按照先后順序賦為0,1,2…),然后在ArcMap中新建一個(gè)Toolbox,并將腳本文件導(dǎo)入Toolbox,設(shè)置相應(yīng)參數(shù)。最后設(shè)計(jì)的程序界面如圖2所示:
根據(jù)該程序,裁剪柵格數(shù)據(jù)(.tif格式)時(shí),只需要輸入柵格數(shù)據(jù)的存儲(chǔ)路徑、裁剪范圍(.shp文件)并選擇裁剪結(jié)果的保存路徑即可。
3.2 學(xué)生實(shí)驗(yàn)實(shí)施與效果
本實(shí)驗(yàn)的最終目的是幫助學(xué)生快速理解在ArcGIS平臺(tái)中Python和ArcPy的開發(fā)方式、掌握ArcPy批處理程序并提高學(xué)生的GIS開發(fā)能力。基于此,在對(duì)2017級(jí)地理信息科學(xué)專業(yè)的學(xué)生進(jìn)行基于ArcPy的GIS數(shù)據(jù)批處理程序教學(xué)實(shí)驗(yàn)設(shè)計(jì)的課程后,讓學(xué)生根據(jù)上述實(shí)驗(yàn),在ArcToolbox中選擇任意工具(不得重復(fù)選擇)設(shè)計(jì)批處理程序并撰寫實(shí)驗(yàn)報(bào)告。
結(jié)果表明,通過本次實(shí)驗(yàn),多數(shù)學(xué)生已經(jīng)認(rèn)識(shí)到了ArcPy功能的強(qiáng)大以及批處理程序設(shè)計(jì)的便捷,實(shí)現(xiàn)了對(duì)ArcPy的入門,并有興趣繼續(xù)學(xué)習(xí)程序設(shè)計(jì),以便在未來的學(xué)習(xí)中可以解決更多問題。
4 結(jié)束語(yǔ)
本文基于ArcPy站點(diǎn)包,設(shè)計(jì)了一個(gè)批量裁剪柵格影像的程序,通過該程序可以使學(xué)生更直觀、清楚的了解到基于ArcPy設(shè)計(jì)批處理程序處理GIS數(shù)據(jù)的快速、高效,也可以培養(yǎng)學(xué)生對(duì)于程序設(shè)計(jì)的興趣。同時(shí),本程序設(shè)計(jì)的方法、思想也同樣適用于基于ArcPy的其他批處理程序設(shè)計(jì),可以為學(xué)生自主開發(fā)批處理程序提供參考,提高學(xué)生的GIS開發(fā)能力。
參考文獻(xiàn):
[1] 姜建武,李景文,陸妍玲,等.普通本科GIS專業(yè)技術(shù)開發(fā)類課程教學(xué)探討[J].中國(guó)教育技術(shù)裝備,2019(6):95-97.
[2] 馬曉哲,張曉萱,耿文均.高校GIS專業(yè)軟件開發(fā)課程教學(xué)現(xiàn)狀及革新[J].高師理科學(xué)刊,2019,39(6):98-101.
[3] 胡最.地方高校GIS專業(yè)程序設(shè)計(jì)技能培養(yǎng)[J].地理空間信息,2020,18(12):58-62,7.
[4] 楊彩云,詹國(guó)華.引導(dǎo)性問題案例在Python數(shù)據(jù)分析基礎(chǔ)課程的教學(xué)[J].計(jì)算機(jī)教育,2021(1):154-157,162.
[5] 周崴,徐東炯,沈麗娟.基于Python和ArcPy的專題圖批量制作方法[J].測(cè)繪與空間地理信息,2020,43(10):17-20.
[6] 曹斌.基于ArcPy的矢量數(shù)據(jù)批處理方法研究[J].科技創(chuàng)新與應(yīng)用,2017(21):90,92.
[7] 段春華,高磊.基于ArcPy的圖斑影像批量截圖方法研究[C]//江蘇省測(cè)繪地理信息學(xué)會(huì)2020年學(xué)術(shù)年會(huì)論文集.南京,2020:113-115.
[8] 邱世平,潘立仁,韋建飛.基于ArcGIS數(shù)據(jù)驅(qū)動(dòng)頁(yè)面與Python腳本語(yǔ)言的專題圖批量出圖技術(shù)研究[J].林業(yè)調(diào)查規(guī)劃,2020,45(2):15-20.
[9] 杜寧,劉國(guó)棟.基于Arcpy與ModelBuilder批量提取柵格數(shù)據(jù)屬性表模型實(shí)驗(yàn)的分析[J].重慶建筑,2020,19(3):13-14.
【通聯(lián)編輯:王力】