ArcGIS Python編程案例(6)-使用腳本執(zhí)行地理處理工具

第五章 自動(dòng)化地圖生產(chǎn)和打印 ||| 第七章 創(chuàng)建自定義地理處理工具


我們將在本章介紹以下案例:

  • 查找地理處理工具
  • 查找工具箱別名
  • 使用腳本執(zhí)行地理處理工具
  • 使用地理處理工具結(jié)果作為其他工具的輸入?yún)?shù)
  • 設(shè)置環(huán)境變量

引言

ArcGIS桌面軟件提供了800多個(gè)地理處理工具,這些工具都可以在Python腳本中使用。在本章中,你將學(xué)習(xí)如何在腳本中使用這些工具。每一個(gè)工具都有自己的特點(diǎn)。由于各個(gè)工具對(duì)輸入?yún)?shù)的要求不同,執(zhí)行每個(gè)工具的語(yǔ)法也有區(qū)別。我們會(huì)介紹如何使用ArcGIS桌面軟件幫助系統(tǒng)來了解某一工具輸入?yún)?shù)要求。腳本運(yùn)行過程除了會(huì)生成一個(gè)或多個(gè)數(shù)據(jù)集,還會(huì)生成一組消息。我們還將了解如何使用這些消息。最后,我們會(huì)了解如何通過腳本獲取并設(shè)置環(huán)境變量。

查找地理處理工具

地理處理腳本調(diào)用工具前,你需要先確認(rèn)當(dāng)前運(yùn)行或者最終用戶運(yùn)行的ArcGIS桌面產(chǎn)品的許可級(jí)別下是否能夠使用這些工具。這類許可級(jí)別的信息在ArcGIS桌面產(chǎn)品的幫助系統(tǒng)中可以找到。

Getting ready

你編寫的腳本中調(diào)用的地理處理工具是否可用取決于當(dāng)前使用的ArcGIS的許可級(jí)別。ArcGIS 10.1版本有三種許可級(jí)別,分別為基礎(chǔ)版(Basic)標(biāo)準(zhǔn)版(Standard)以及高級(jí)版(Advanced)。三種許可級(jí)別分別對(duì)應(yīng)于大家熟知的ArcView,ArcEditor以及ArcInfo。對(duì)于腳本編寫人員來講,想要在腳本中使用工具,那么理解許可級(jí)別是很重要的。除了許可級(jí)別之外,ArcGIS產(chǎn)品中的擴(kuò)展模塊也會(huì)影響工具的可用性。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)。如下圖所示彈出搜索窗口。通常情況下,你會(huì)用來查找工具:

3.在搜索文本框中輸入Clip。開始輸入內(nèi)容后,搜索文本框會(huì)根據(jù)輸入的字符篩選結(jié)果。你會(huì)看到三個(gè)最有可能包含Clip字符的工具,分別為
clip(analysis),clip(coverage),clip(data_management)。ArcGIS中有一些具有相同名稱的地理處理工具。為了能夠唯一識(shí)別工具,工具名稱后面緊跟所在工具箱的別名。我們會(huì)在下一個(gè)案例中來進(jìn)一步了解工具箱別名的細(xì)節(jié)。
4.如下圖所示,輸入完成后點(diǎn)擊搜索按鈕生成一個(gè)匹配的工具列表。在搜索結(jié)果中工具會(huì)用錘子的圖標(biāo)來標(biāo)識(shí)。你還會(huì)在搜索結(jié)果看到其他兩種圖標(biāo)。一種是卷軸圖標(biāo)表示這是一個(gè)Python腳本工具,另一個(gè)就是包含多個(gè)顏色框的圖標(biāo)來表示這是一個(gè)模型:

5.選擇Clip(Analysis)工具。之后會(huì)出現(xiàn)Clip(Analysis)工具的對(duì)話框。對(duì)于程序員來講,僅僅這些并沒有太多幫助。ArcGIS桌面軟件幫助系統(tǒng)中工具幫助信息會(huì)更加詳細(xì)。
6.點(diǎn)擊工具對(duì)話框底部的工具幫助(Tool Help)按鈕查看該工具的詳細(xì)幫助信息。

7.滾動(dòng)Clip工具幫助頁(yè)面的底部來查看該工具的語(yǔ)法信息。

How it works...

幫助系統(tǒng)中包含了每一個(gè)工具有關(guān)的摘要,說明,用法,語(yǔ)法,代碼示例,可用的環(huán)境變量,相關(guān)主題以及許可信息等內(nèi)容。作為一名地理處理腳本程序員,你將主要關(guān)注處于頁(yè)面底部的語(yǔ)法,代碼示例以及許可信息部分的內(nèi)容。

你應(yīng)該查看位于工具幫助頁(yè)面底部的許可信息部分以確保當(dāng)前許可級(jí)別下可以使用該工具。

語(yǔ)法部分包含了如何在Python腳本中調(diào)用工具的相關(guān)信息,這些信息包括工具名稱以及必選參數(shù)和可選參數(shù)。所有的參數(shù)都用括號(hào)括起。Clip工具的必選參數(shù)包括in_feature,clip_feature以及out_feature_class。在腳本中調(diào)用該工具的時(shí)候,你必須向工具提供這些參數(shù)才能正確執(zhí)行工具。第四個(gè)參數(shù)是一個(gè)叫做cluster_tolerance的可選參數(shù)。可選參數(shù)使用花括號(hào)括起。下圖就展示了一個(gè)可選參數(shù)的例子。不過這并不意味著當(dāng)你調(diào)用該工具的時(shí)候也要使用花括號(hào)。幫助系統(tǒng)中只是通過花括號(hào)來指明該參數(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)識(shí)該工具。在本案例中,你將學(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對(duì)話框。別名(Alias)文本框中則是工具箱別名:

How it works...

你可以按照以上的步驟來查找所有工具箱的別名。在Python腳本中,使用<工具名稱>_<工具箱別名>的語(yǔ)法格式來引用工具。舉個(gè)例子,如果你想調(diào)用Buffer工具,你就可以使用buffer_analysis語(yǔ)法來實(shí)現(xiàn)。工具箱別名都很簡(jiǎn)單。別名通常是一個(gè)不包含點(diǎn)劃線和特殊字符的單詞。在下一個(gè)案例中,我們將編寫一個(gè)簡(jiǎn)單的腳本根據(jù)工具別名的語(yǔ)法格式來執(zhí)行工具。

使用腳本執(zhí)行地理處理工具

獲取工具箱別名并核實(shí)了當(dāng)前許可級(jí)別下工具的可用性之后,你就可以在腳本中執(zhí)行該地理處理工具了。

Getting ready

現(xiàn)在你已經(jīng)了解如何查找可用的工具以及如何準(zhǔn)確引用這些工具,那么下一步就是整合這些知識(shí)來編寫腳本執(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ū)范圍?,F(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的語(yǔ)法來調(diào)用工具,該語(yǔ)句指定了我們引用的是Analysis Tools工具箱(別名為analysis)下的Clip工具。我們還向該工具傳遞了三個(gè)參數(shù),分別為輸入要素類,裁剪要素類以及輸出的要素類。這里還需要指明一點(diǎn)每個(gè)數(shù)據(jù)集的路徑采用了硬編碼的方式。這其實(shí)并不是一個(gè)好的編程習(xí)慣,在這里只是用來說明如何執(zhí)行工具。后面的章節(jié)中,我們還會(huì)闡述如何移除腳本中的硬編碼,使腳本更加靈活。
你使用的大部分工具都會(huì)要求提供數(shù)據(jù)源的路徑。路徑必須與ArcCatalog中位置(Location)工具欄中的一致,如下圖所示:

工具使用ArcCatalog中的路徑來查找地理數(shù)據(jù)。該路徑是一個(gè)字符串且每一個(gè)數(shù)據(jù)集的路徑都是唯一的。路徑中可以包括文件夾位置,數(shù)據(jù)庫(kù)鏈接或者是URL地址。因此你在編寫腳本處理數(shù)據(jù)前,使用ArcCatalog來查看路徑是很重要的。ArcSDE路徑需要特別注意。許多ArcSDE用戶并沒有有一個(gè)標(biāo)準(zhǔn)化的連接名稱,這會(huì)在運(yùn)行模型或腳本的時(shí)候出現(xiàn)問題。

There's more...

地理處理工具有兩種組織管理方式。你可以以arcpy中函數(shù)的形式來訪問工具,也可以以工具箱別名命名的模塊中的函數(shù)的形式來訪問工具。第一種情況,即工具作為arcpy中的函數(shù),工具會(huì)以本案例中的格式來調(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ù)的情況會(huì)經(jīng)常碰到。這種情況稱為工具鏈。舉個(gè)例子,對(duì)一個(gè)河流的圖層執(zhí)行緩沖區(qū)操作后再查找所有落在緩沖區(qū)范圍內(nèi)的居民點(diǎn)。在這種情況下Buffer工具會(huì)先生成一個(gè)新的圖層,之后新生成的圖層會(huì)作為按位置選擇圖層工具或其他疊加工具的輸入?yún)?shù)。在本案例中你將學(xué)習(xí)如何獲取工具的輸出結(jié)果并將其作為其他工具的輸入?yún)?shù)。

Getting ready

Buffer工具會(huì)從一個(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.shpSchools.shp文件。
3.點(diǎn)擊Python窗口按鈕。
4.導(dǎo)入arcpy模塊

import arcpy

5.設(shè)置工作空間:

arcpy.env.workspace = "C:/ArcpyBook/data/TravisCounty"

6.使用try語(yǔ)句,創(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語(yǔ)句用于捕獲錯(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ǎn)單地將某工具的結(jié)果賦給一個(gè)變量后,再在其他工具中調(diào)用該變量即可。

設(shè)置環(huán)境變量并查看工具消息

環(huán)境變量提供了可設(shè)置的額外參數(shù),這些環(huán)境變量可在多個(gè)環(huán)境級(jí)別中作為全局變量來獲取。你可以在腳本中獲取環(huán)境變量并設(shè)置變量值。你需要了解環(huán)境變量在腳本中的可用性以及獲取方式。除此以外,工具在執(zhí)行過程中會(huì)返回消息文本。這些消息也有不同類型。

Getting ready

環(huán)境變量設(shè)置在工具執(zhí)行過程中可在腳本中使用的附加參數(shù)。你可以通過點(diǎn)擊地理處理(Geoprocessing)-環(huán)境變量(Environment)菜單打開一個(gè)對(duì)話框,這就在ArcGIS桌面軟件應(yīng)用程序級(jí)別下一次性設(shè)置這些環(huán)境變量的值,如下圖所示,環(huán)境變量是以目錄形式來進(jìn)行組織:

這些設(shè)置與操作系統(tǒng)的環(huán)境變量設(shè)置非常類似,只不過這些環(huán)境變量?jī)H針對(duì)于ArcGIS地理處理框架。應(yīng)用程序級(jí)別環(huán)境設(shè)置是最高級(jí)別,也是應(yīng)用于所有工具的默認(rèn)設(shè)置。除了應(yīng)用程序級(jí)別環(huán)境設(shè)置,你還可以應(yīng)用工具級(jí)別的環(huán)境設(shè)置。工具級(jí)別環(huán)境設(shè)置會(huì)直接繼承來自應(yīng)用程序級(jí)別的環(huán)境設(shè)置。不過,工具級(jí)別設(shè)置僅應(yīng)用于當(dāng)前工具且會(huì)覆蓋應(yīng)用程序級(jí)別的環(huán)境設(shè)置。Python腳本中可以通過arcpy中的env類來獲取并設(shè)置環(huán)境變量,這些變量都是讀/寫屬性。應(yīng)用程序級(jí)別和工具級(jí)別環(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è)置。在本案例中,你會(huì)學(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í)別以及工具級(jí)別下進(jìn)行設(shè)置。應(yīng)用程序級(jí)別環(huán)境設(shè)置類似于全局環(huán)境設(shè)置,將會(huì)影響所有的工具。而工具級(jí)別環(huán)境設(shè)置則僅影響當(dāng)前運(yùn)行的工具。這兩種環(huán)境級(jí)別設(shè)置都可以在ArcGIS軟件中設(shè)置。你也可以在腳本中設(shè)置環(huán)境變量,不過這僅作用于當(dāng)前執(zhí)行的腳本。這與工具級(jí)別下的情況類似。腳本中最為常用的環(huán)境變量設(shè)置就是env.workspace變量,該變量用于定義當(dāng)前腳本的工作目錄。由于在腳本的頂部設(shè)置了當(dāng)前工作空間,腳本的其他位置也就不需要引用數(shù)據(jù)集的完整路徑,這會(huì)讓代碼更為簡(jiǎn)潔,不過還是需要引用工作空間下的數(shù)據(jù)集名稱。


第五章 自動(dòng)化地圖生產(chǎn)和打印 ||| 第七章 創(chuàng)建自定義地理處理工具

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容