第五章 自動化地圖生產(chǎn)和打印 ||| 第七章 創(chuàng)建自定義地理處理工具
我們將在本章介紹以下案例:
- 查找地理處理工具
- 查找工具箱別名
- 使用腳本執(zhí)行地理處理工具
- 使用地理處理工具結(jié)果作為其他工具的輸入?yún)?shù)
- 設(shè)置環(huán)境變量
引言
ArcGIS桌面軟件提供了800多個(gè)地理處理工具,這些工具都可以在Python腳本中使用。在本章中,你將學(xué)習(xí)如何在腳本中使用這些工具。每一個(gè)工具都有自己的特點(diǎn)。由于各個(gè)工具對輸入?yún)?shù)的要求不同,執(zhí)行每個(gè)工具的語法也有區(qū)別。我們會介紹如何使用ArcGIS桌面軟件幫助系統(tǒng)來了解某一工具輸入?yún)?shù)要求。腳本運(yùn)行過程除了會生成一個(gè)或多個(gè)數(shù)據(jù)集,還會生成一組消息。我們還將了解如何使用這些消息。最后,我們會了解如何通過腳本獲取并設(shè)置環(huán)境變量。
查找地理處理工具
地理處理腳本調(diào)用工具前,你需要先確認(rèn)當(dāng)前運(yùn)行或者最終用戶運(yùn)行的ArcGIS桌面產(chǎn)品的許可級別下是否能夠使用這些工具。這類許可級別的信息在ArcGIS桌面產(chǎn)品的幫助系統(tǒng)中可以找到。
Getting ready
你編寫的腳本中調(diào)用的地理處理工具是否可用取決于當(dāng)前使用的ArcGIS的許可級別。ArcGIS 10.1版本有三種許可級別,分別為基礎(chǔ)版(Basic),標(biāo)準(zhǔn)版(Standard)以及高級版(Advanced)。三種許可級別分別對應(yīng)于大家熟知的ArcView,ArcEditor以及ArcInfo。對于腳本編寫人員來講,想要在腳本中使用工具,那么理解許可級別是很重要的。除了許可級別之外,ArcGIS產(chǎn)品中的擴(kuò)展模塊也會影響工具的可用性。ArcGIS桌面產(chǎn)品提供了兩種主要的查找工具方式。第一個(gè)是使用搜索窗口,第二個(gè)是瀏覽ArcToolbox工具箱中的內(nèi)容。在本案例中,你將學(xué)習(xí)如何在搜索窗口查找在腳本中可使用的地理處理工具。
How to do it...
1.在ArcMap中打開C:\ArcpyBook\Ch6\Crime_Ch6.mxd
文件。
2.點(diǎn)擊地理處理(Geoprocessing)菜單下的搜索工具(Search For Tools)。如下圖所示彈出搜索窗口。通常情況下,你會用來查找工具:
3.在搜索文本框中輸入Clip
。開始輸入內(nèi)容后,搜索文本框會根據(jù)輸入的字符篩選結(jié)果。你會看到三個(gè)最有可能包含Clip
字符的工具,分別為
clip(analysis)
,clip(coverage)
,clip(data_management)
。ArcGIS中有一些具有相同名稱的地理處理工具。為了能夠唯一識別工具,工具名稱后面緊跟所在工具箱的別名。我們會在下一個(gè)案例中來進(jìn)一步了解工具箱別名的細(xì)節(jié)。
4.如下圖所示,輸入完成后點(diǎn)擊搜索按鈕生成一個(gè)匹配的工具列表。在搜索結(jié)果中工具會用錘子的圖標(biāo)來標(biāo)識。你還會在搜索結(jié)果看到其他兩種圖標(biāo)。一種是卷軸圖標(biāo)表示這是一個(gè)Python腳本工具,另一個(gè)就是包含多個(gè)顏色框的圖標(biāo)來表示這是一個(gè)模型:
5.選擇Clip(Analysis)工具。之后會出現(xiàn)Clip(Analysis)工具的對話框。對于程序員來講,僅僅這些并沒有太多幫助。ArcGIS桌面軟件幫助系統(tǒng)中工具幫助信息會更加詳細(xì)。
6.點(diǎn)擊工具對話框底部的工具幫助(Tool Help)按鈕查看該工具的詳細(xì)幫助信息。
7.滾動Clip工具幫助頁面的底部來查看該工具的語法信息。
How it works...
幫助系統(tǒng)中包含了每一個(gè)工具有關(guān)的摘要,說明,用法,語法,代碼示例,可用的環(huán)境變量,相關(guān)主題以及許可信息等內(nèi)容。作為一名地理處理腳本程序員,你將主要關(guān)注處于頁面底部的語法,代碼示例以及許可信息部分的內(nèi)容。
你應(yīng)該查看位于工具幫助頁面底部的許可信息部分以確保當(dāng)前許可級別下可以使用該工具。
語法部分包含了如何在Python腳本中調(diào)用工具的相關(guān)信息,這些信息包括工具名稱以及必選參數(shù)和可選參數(shù)。所有的參數(shù)都用括號括起。Clip
工具的必選參數(shù)包括in_feature,clip_feature
以及out_feature_class
。在腳本中調(diào)用該工具的時(shí)候,你必須向工具提供這些參數(shù)才能正確執(zhí)行工具。第四個(gè)參數(shù)是一個(gè)叫做cluster_tolerance
的可選參數(shù)。可選參數(shù)使用花括號括起。下圖就展示了一個(gè)可選參數(shù)的例子。不過這并不意味著當(dāng)你調(diào)用該工具的時(shí)候也要使用花括號。幫助系統(tǒng)中只是通過花括號來指明該參數(shù)為可選參數(shù):
查找工具箱別名
所有的工具箱都有自己的一個(gè)別名,在ArcGIS桌面產(chǎn)品中,工具箱別名與工具名稱一起使用能夠?yàn)槊總€(gè)工具提供唯一的引用。由于許多工具的名稱相同,因此在腳本中調(diào)用某個(gè)工具時(shí)同時(shí)引用工具名稱和工具箱別名就很有必要。
Getting ready
在上一個(gè)查找Clip工具的案例中,Clip工具出現(xiàn)在Analysis,Coverage以及Data Management工具箱中。每個(gè)工具箱中Clip工具執(zhí)行不同的功能。舉個(gè)例子,Analysis工具箱下的Clip工具使用某個(gè)輸入要素來裁剪一個(gè)矢量要素類,而Data Management工具箱下的Clip工具則用于創(chuàng)建一個(gè)柵格的空間子集。由于存在多個(gè)工具同名的情況,因此我們應(yīng)該同時(shí)使用工具名稱和該工具所在的工具箱別名來標(biāo)識該工具。在本案例中,你將學(xué)習(xí)如何查找工具箱的別名。
How to do it...
1.在ArcMap中打開C:\ArcpyBook\Ch6\Crime_Ch6.mxd
文件。
2.ArcToolBox若未顯示,則打開ArcToolBox。
3.如下圖所示找到Analysis Tools工具箱:
4.右鍵單擊Analysis Tools工具箱選擇屬性(Properties)。如下圖所示將彈出Analysis Tools Properties對話框。別名(Alias)文本框中則是工具箱別名:
How it works...
你可以按照以上的步驟來查找所有工具箱的別名。在Python腳本中,使用<工具名稱>_<工具箱別名>的語法格式來引用工具。舉個(gè)例子,如果你想調(diào)用Buffer
工具,你就可以使用buffer_analysis
語法來實(shí)現(xiàn)。工具箱別名都很簡單。別名通常是一個(gè)不包含點(diǎn)劃線和特殊字符的單詞。在下一個(gè)案例中,我們將編寫一個(gè)簡單的腳本根據(jù)工具別名的語法格式來執(zhí)行工具。
使用腳本執(zhí)行地理處理工具
獲取工具箱別名并核實(shí)了當(dāng)前許可級別下工具的可用性之后,你就可以在腳本中執(zhí)行該地理處理工具了。
Getting ready
現(xiàn)在你已經(jīng)了解如何查找可用的工具以及如何準(zhǔn)確引用這些工具,那么下一步就是整合這些知識來編寫腳本執(zhí)行工具。在本案例中,你將通過腳本來執(zhí)行地理處理工具。
How to do it...
1.在ArcMap中打開C:\ArcpyBook\Ch6\Crime_Ch6.mxd
文件。
2.點(diǎn)擊添加數(shù)據(jù)(Add Data)按鈕,添加EdgewoodSD.shp
文件。
3.關(guān)閉Crime Density by School District圖層以及Burglaries in 2009圖層。目前該地圖文檔中只有一個(gè)多邊形要素。EdgewoodSD圖層表示Edgewood學(xué)區(qū)范圍。現(xiàn)在我們編寫一個(gè)腳本使用該圖層來裁剪Burglaries in 2009要素。
4.打開ArcMap中的Python窗口。
5.導(dǎo)入arcpy
模塊:
import arcpy
6.創(chuàng)建一個(gè)變量并引用要裁剪的輸入要素類:
in_feature ="C:/ArcpyBook/data/CityOfSanAntonio.gdb/Burglary"
7.創(chuàng)建一個(gè)變量并引用用于裁剪的要素類:
clip_feature = "C:/ArcpyBook/Ch6/EdgewoodSD.shp"
8.創(chuàng)建一個(gè)變量并引用輸出的要素類:
out_feature_class = "C:/ArcpyBook/Ch6/ClpBurglary.shp"
9.執(zhí)行Analysis Tools工具箱下的Clip
工具:
arcpy.Clip_analysis(in_feature,clip_feature,out_feature_class)
10.運(yùn)行腳本。如下圖所示,結(jié)果中僅包括添加到數(shù)據(jù)框中Edgewood學(xué)區(qū)范圍內(nèi)的發(fā)生盜竊案的點(diǎn)數(shù)據(jù):
How it works...
本案例中重要的一行代碼就是最后執(zhí)行Clip
工具。我們通過Clip_analysis
的語法來調(diào)用工具,該語句指定了我們引用的是Analysis Tools工具箱(別名為analysis
)下的Clip
工具。我們還向該工具傳遞了三個(gè)參數(shù),分別為輸入要素類,裁剪要素類以及輸出的要素類。這里還需要指明一點(diǎn)每個(gè)數(shù)據(jù)集的路徑采用了硬編碼的方式。這其實(shí)并不是一個(gè)好的編程習(xí)慣,在這里只是用來說明如何執(zhí)行工具。后面的章節(jié)中,我們還會闡述如何移除腳本中的硬編碼,使腳本更加靈活。
你使用的大部分工具都會要求提供數(shù)據(jù)源的路徑。路徑必須與ArcCatalog中位置(Location)工具欄中的一致,如下圖所示:
工具使用ArcCatalog中的路徑來查找地理數(shù)據(jù)。該路徑是一個(gè)字符串且每一個(gè)數(shù)據(jù)集的路徑都是唯一的。路徑中可以包括文件夾位置,數(shù)據(jù)庫鏈接或者是URL地址。因此你在編寫腳本處理數(shù)據(jù)前,使用ArcCatalog來查看路徑是很重要的。ArcSDE路徑需要特別注意。許多ArcSDE用戶并沒有有一個(gè)標(biāo)準(zhǔn)化的連接名稱,這會在運(yùn)行模型或腳本的時(shí)候出現(xiàn)問題。
There's more...
地理處理工具有兩種組織管理方式。你可以以arcpy
中函數(shù)的形式來訪問工具,也可以以工具箱別名命名的模塊中的函數(shù)的形式來訪問工具。第一種情況,即工具作為arcpy
中的函數(shù),工具會以本案例中的格式來調(diào)用。工具名后緊跟下劃線以及工具箱別名。第二種情況,即工具作為使用工具箱別名的模塊中的函數(shù)。按照如下的方式來調(diào)用:
arcpy.analysis.Clip(in_feature,clip_feature,out_feature_class)
其中工具箱別名analysis
作為一個(gè)模塊,Clip
作為該模塊中的函數(shù)。
使用哪一種方式是個(gè)人偏好。兩種方式都可以執(zhí)行地理處理工具。
使用地理處理工具結(jié)果作為其他工具的輸入?yún)?shù)
使用某個(gè)工具的輸出結(jié)果作為其他工具的輸入?yún)?shù)的情況會經(jīng)常碰到。這種情況稱為工具鏈。舉個(gè)例子,對一個(gè)河流的圖層執(zhí)行緩沖區(qū)操作后再查找所有落在緩沖區(qū)范圍內(nèi)的居民點(diǎn)。在這種情況下Buffer
工具會先生成一個(gè)新的圖層,之后新生成的圖層會作為按位置選擇圖層工具或其他疊加工具的輸入?yún)?shù)。在本案例中你將學(xué)習(xí)如何獲取工具的輸出結(jié)果并將其作為其他工具的輸入?yún)?shù)。
Getting ready
Buffer
工具會從一個(gè)輸入要素圖層中按照指定的距離參數(shù)生成一個(gè)輸出要素類。該輸出結(jié)果保存在一個(gè)變量中,之后該變量可作為按位置選擇工具圖層的輸入?yún)?shù)。在本案例中,你將學(xué)習(xí)如何將Buffer
工具的輸出結(jié)果作為按位置選擇工具的輸入?yún)?shù)以查找所有位于河流0.5英里范圍內(nèi)的學(xué)校。
How to do it...
1.打開ArcMap,創(chuàng)建一個(gè)新的地圖文檔。
2.點(diǎn)擊添加數(shù)據(jù)(Add Data)按鈕,添加C:\ArcpyBook\data\TravisCounty
中的Streams.shp
和Schools.shp
文件。
3.點(diǎn)擊Python窗口按鈕。
4.導(dǎo)入arcpy
模塊
import arcpy
5.設(shè)置工作空間:
arcpy.env.workspace = "C:/ArcpyBook/data/TravisCounty"
6.使用try
語句,創(chuàng)建分別保存河流圖層,河流緩沖區(qū)圖層,緩沖距離值以及學(xué)校圖層的變量:
try:
streams = "Sream.shp"
streamsBuffer = "StreamsBuffer.shp"
distance = "2640 Feet"
school2mile = "Schools.shp"
7.調(diào)用Buffer
工具,并將保存河流圖層,緩沖區(qū)圖層,距離的變量以及用于控制緩沖區(qū)外觀的幾個(gè)參數(shù)傳遞給該工具:
arcpy.Buffer_analysis(streams,streamsBuffer,distance,"FULL","ROUND","ALL")
8.調(diào)用Make Feature Layer
工具創(chuàng)建一個(gè)引用Schools.shp
文件的臨時(shí)圖層:
arcpy.MakeFeatureLayer_management(schools2mile,"School2Mile_lyr")
9.調(diào)用Select Layer by Location
工具選擇位于學(xué)習(xí)0.5英里范圍內(nèi)的所有的學(xué)校:
arcpy.SelectLayerByLocation_management("School2Mile_lyr","intersect",streamsBuffer)
10.添加except
語句用于捕獲錯(cuò)誤信息:
except:
print "Error in script"
11.完整代碼如下:
import arcpy
arcpy.env.workspace = "C:/ArcpyBook/data/TravisCounty"
try:
streams = "Streams.shp"
streamsBuffer = "StreamsBuffer.shp"
distance = "2640 Feet"
schools2mile = "Schools.shp"
arcpy.Buffer_analysis(streams,streamsBuffer,distance,"FULL","ROUND","ALL")
arcpy.MakeFeatureLayer_management(schools2mile,"Schools2Mile_lyr")
arcpy.SelectLayerByLocation_management("Schools2Mile_lyr","intersect",streamsBuffer)
except:
print "Error in script"
How it works...
Buffer
工具生成了一個(gè)StreamsBuffer.shp
的文件并保存在streamsBuffer
變量中。之后該變量作為按位置選擇圖層工具的第三個(gè)參數(shù)。只要簡單地將某工具的結(jié)果賦給一個(gè)變量后,再在其他工具中調(diào)用該變量即可。
設(shè)置環(huán)境變量并查看工具消息
環(huán)境變量提供了可設(shè)置的額外參數(shù),這些環(huán)境變量可在多個(gè)環(huán)境級別中作為全局變量來獲取。你可以在腳本中獲取環(huán)境變量并設(shè)置變量值。你需要了解環(huán)境變量在腳本中的可用性以及獲取方式。除此以外,工具在執(zhí)行過程中會返回消息文本。這些消息也有不同類型。
Getting ready
環(huán)境變量設(shè)置在工具執(zhí)行過程中可在腳本中使用的附加參數(shù)。你可以通過點(diǎn)擊地理處理(Geoprocessing)-環(huán)境變量(Environment)菜單打開一個(gè)對話框,這就在ArcGIS桌面軟件應(yīng)用程序級別下一次性設(shè)置這些環(huán)境變量的值,如下圖所示,環(huán)境變量是以目錄形式來進(jìn)行組織:
這些設(shè)置與操作系統(tǒng)的環(huán)境變量設(shè)置非常類似,只不過這些環(huán)境變量僅針對于ArcGIS地理處理框架。應(yīng)用程序級別環(huán)境設(shè)置是最高級別,也是應(yīng)用于所有工具的默認(rèn)設(shè)置。除了應(yīng)用程序級別環(huán)境設(shè)置,你還可以應(yīng)用工具級別的環(huán)境設(shè)置。工具級別環(huán)境設(shè)置會直接繼承來自應(yīng)用程序級別的環(huán)境設(shè)置。不過,工具級別設(shè)置僅應(yīng)用于當(dāng)前工具且會覆蓋應(yīng)用程序級別的環(huán)境設(shè)置。Python腳本中可以通過arcpy
中的env
類來獲取并設(shè)置環(huán)境變量,這些變量都是讀/寫屬性。應(yīng)用程序級別和工具級別環(huán)境設(shè)置都可以在腳本中調(diào)用且都可以應(yīng)用于通過腳本運(yùn)行的所有工具。你還可以覆蓋腳本中即將在工具執(zhí)行過程中使用的環(huán)境設(shè)置。需要注意的是,在腳本中的環(huán)境設(shè)置僅應(yīng)用于當(dāng)前執(zhí)行的腳本。不過,有兩種情況下環(huán)境設(shè)置不能在腳本中調(diào)用。腳本在ArcGIS應(yīng)用程序以外的環(huán)境下運(yùn)行,比如通過操作系統(tǒng)的命令行模式執(zhí)行腳本,以及腳本調(diào)用其他腳本的情況下不能在腳本中調(diào)用環(huán)境設(shè)置。在本案例中,你會學(xué)習(xí)如何在腳本中設(shè)置環(huán)境變量以及查看工具執(zhí)行過程中返回的消息文本。
How to do it...
1.在IDLE中創(chuàng)建一個(gè)新的腳本并保存為C:\ArcpyBook\Ch6\SetEnvVariables.py
文件。
2.導(dǎo)入arcpy
模塊:
import arcpy
3.使用環(huán)境變量來設(shè)置工作空間路徑:
arcpy.env.workspace = "C:/ArcpyBook/Ch6"
4.調(diào)用Buffer
工具:
arcpy.Buffer_analysis("Streams.shp","Streams_Buffer.shp","200 Feet")
5.打印工具執(zhí)行過程中返回的消息文本:
print arcpy.getMessages()
6.保存腳本。
How it works...
環(huán)境變量可以在應(yīng)用程序級別以及工具級別下進(jìn)行設(shè)置。應(yīng)用程序級別環(huán)境設(shè)置類似于全局環(huán)境設(shè)置,將會影響所有的工具。而工具級別環(huán)境設(shè)置則僅影響當(dāng)前運(yùn)行的工具。這兩種環(huán)境級別設(shè)置都可以在ArcGIS軟件中設(shè)置。你也可以在腳本中設(shè)置環(huán)境變量,不過這僅作用于當(dāng)前執(zhí)行的腳本。這與工具級別下的情況類似。腳本中最為常用的環(huán)境變量設(shè)置就是env.workspace
變量,該變量用于定義當(dāng)前腳本的工作目錄。由于在腳本的頂部設(shè)置了當(dāng)前工作空間,腳本的其他位置也就不需要引用數(shù)據(jù)集的完整路徑,這會讓代碼更為簡潔,不過還是需要引用工作空間下的數(shù)據(jù)集名稱。