本章將涉及以下案例:
使用ArcGIS Python窗體
訪問ArcPy
從腳本中執行工具
使用ArcGIS桌面軟體幫助系統
使用變量存儲數據
訪問ArcPy中的模塊
引言地理處理任務往往是耗時且重複性的工作,通常又需要定期執行。地理處理任務需要頻繁地涉及到諸多數據圖層及功能。針對ArcGIS的ArcPy Python站點包提供了一系列工具及其執行環境用於將數據轉換為有意義的結果。使用腳本可以自動化完成地理處理任務,而且可以安排在單位最為合適的時間內執行。
ArcGIS提供了一個地理處理框架,通過一系列工具及其執行環境來自動化完成那些重複性的GIS任務。所有的工具都是對提供的輸入數據集執行一定的操作後生成一個新的輸出數據集。在一個較大的工作流程中,新生成的輸出數據集必要情況下會作為其他地處理工具的輸入數據集。ArcGIS地理處理框架提供了大量工具,每一個工具可執行特定的功能。
儘管你可以在許多不同的開發環境中編寫Python地理處理腳本,不過本書將關注於內置的ArcGIS Python窗口以及Python的IDLE編輯器。
在本案例中,你將了解到如何使用ArcGIS Python 窗口。本章介紹另一種編寫地理處理腳本的開發環境。兩種開發環境都可以使用,不過通常來講你們會從ArcGIS Python 窗口開始編寫腳本,編寫複雜腳本再轉到IDLE中。我也注意到你可能會考慮像PythonWin,Wingware,Komodo等開發環境。選擇開發環境因人而異。
Getting ready新的Python窗口是ArcGIS10版本桌面軟體中的一個嵌入式交互式窗體。它適合於測試小的代碼塊,學習Python基礎知識,創建方便快捷的工作流以及執行地理處理工具等。不過,隨著腳本內容變得越來越複雜,你很快就會發現需要一個更加強壯(魯棒性更好)的開發環境。默認情況下IDLE會隨著ArcGIS桌面軟體一起安裝,因此IDLE理所當然地成為許多人的選擇。儘管如此,對應新人來講ArcGIS Python窗口仍是學習Python的好選擇。
ArcGIS Python窗口除了用於編寫代碼之外還有許多功能。你可以將窗口中的內容保存為Python腳本文件,也可以將已有的Python腳本文件加載到窗體中。窗體位置可以固定或浮動。當處於浮動窗口時,窗體大小可以隨意擴大或縮小。窗口也可以固定在ArcGIS界面的多個位置。你還可以通過在窗口中右鍵選擇格式來設置窗體中的字體和文本顏色。
點擊ArcGIS桌面軟體工具條上的Python窗體按鈕打開Python窗口。
1.在ArcMap中打開c:\ArcpyBook\Ch2\Crime_Ch2.mxd文件。
你可以不用打開Crime_Ch2.mxd文件。任何地圖文檔文件都可以在Python窗口中使用
2.點擊ArcMap工具條上的Python窗口按鈕打開Python窗口,見下圖。Python窗口是一個浮動窗口,因此你可以根據需要縮放同時也可以將該窗口停靠在ArcMap界面中的多個位置:
Python窗體實際上是一個shell窗口,你可以在每行的輸入符號>>>後面輸入一行語句。右邊側欄是一個幫助窗口。
3.在Python窗體中右鍵單擊選擇加載(Load),選擇C:\ArcpyBook\Ch2目錄下的ListFields.py文件加載該腳本。
你還可以在窗口中右鍵選擇格式(Format)來設置窗體中的字體和文本顏色。窗體提供了黑白兩個主題,可以分別選擇字體和顏色:
點擊設置黑色主題(Set Black Theme)來看一下效果。如果需要花費大量時間來編寫代碼,你會發現深色背景主題看起來更舒服:
訪問ArcPy你在使用ArcPy提供的所有地理處理功能之前,需要首先在腳本中導入ArcPy包。這通常是你編寫地理處理腳本的第一行代碼。
Getting readyAryPy是一個Python站點包並作為ArcGIS10版本產品的一部分。ArcPy包全面包含了ArcGIS9.2中的arcgis scriping模塊的功能並作了進一步的擴展。使用ArcPy包,你就可以訪問地理處理工具,擴展,函數和類來處理ESRI支持的GIS數據。ArcPy包為模塊,類和函數提供了代碼補全功能及詳盡文檔。
ArcPy包還可以與其他的Python模塊一起使用來擴展功能的適用範圍。你在使用Python編寫的所有的地理處理腳本前必須首先導入ArcPy包。
按照以下步驟在Python窗體中導入arcpy站點包:
1.在ArcMap中打開c:\ArcpyBook\Ch2\Crime_Ch2.mxd文件。
2.點擊Python窗口按鈕打開shell窗口。
3.在Python窗口中導入arcpy包後按鍵盤上的的回車鍵。你在Python窗體中敲完每條語句後都要按回車鍵。import arcpy語句會出現你編寫的每一個腳本文件中。import arcpy語句允許你訪問ArcPy提供的所有功能。
理論上,在ArcMap Python窗口中沒有必要一定要包含import arcpy語句。這是Python窗口固有的屬性。不過在使用IDLE,PythonWin或其他IDE來編寫獨立腳本時該語句就很有必要了。由於大部分代碼最終是以獨立腳本的形式執行,因此包含import arcpy語句也是一個良好的編程習慣。
4.ArcPy還提供了代碼自動補全功能來使得程式設計師的工作變得簡單些。ArcPy是支持面向對象的程序包,這也就意味著你可以使用點標註符來訪問對象的屬性和方法。第二行代碼敲入了arcpy和點標註符(.)後,注意到點標註符後出現了所有可用元素的下拉列表。下拉列表中的元素都是當前對象可用的工具,函數,類和擴展。所有對象都有自己相關的元素項,因此下拉列表中的內容會因當前選擇的對象不同而不同:
5.上面出現的下拉列表是一個可自動篩選的列表,也就說只要你開始輸入工具,函數,類或者擴展的名稱,列表內容會根據輸入的內容進行篩選過濾。
6.你可以通過滑鼠或鍵盤上的方向鍵來高亮選擇要使用的元素項,然後使用Tab鍵來鍵入命令實現代碼自動補全。代碼自動補全功能能夠讓你成為更高效的程式設計師。這不僅為方便使用,而且還會大大降低代碼中拼寫錯誤。
How it works...ArcPy模塊導入後,你就可以訪問地理處理工具,擴展,函數和類來處理ESRI支持的GIS數據。ArcPy一個最重要的方面就是提供了當前ArcGIS桌面產品許可等級下所有可用的地理處理工具。腳本中可用的工具數量會因當前桌面產品使用的許可等級(包括基礎版,標準版和高級版)的不同而不同。基礎版許可下可用工具數量最少而高級版許可則提供最完整的的工具集。
從腳本中執行工具作為一名ArcGIS用戶,你肯定已經使用過許多ArcToolbox中的工具來完成地理處理任務。比如裁剪(clip),緩衝區(buffer),要素類轉要素類(feature class to feature class),添加欄位(add field)等等。在腳本中你也可以執行ArcToolbox中的所有工具。作為一名程式設計師需要記住能夠使用的工具取決於當前ArcGIS桌面軟體的許可級別。創建一個Python腳本執行ArcToolbox中的工具可實現地理處理任務自動化。
按照以下步驟學習如何在腳本中執行地理處理工具:
1.在ArcMap中打開c:\ArcpyBook\Ch2\TravisCounty.mxd文件。
2.打開Python窗體。
3.導入arcpy包:
4.設置工作空間。我們之前還沒介紹過env類。env類是arcpy中一部分,ArcGIS中的環境設置就是env類的屬性。env類其中的一個屬性就是工作空間(workspace),工作空間定義了數據輸入和輸出的當前工作目錄。在該案例中工作空間則是輸出數據集要寫入的目錄:
arcpy.env.workspace = "c:/ArcpyBook/data/"5.我們接下來使用Analysis Tools(分析工具箱)中的Buffer(緩衝區工具)工具對ArcMap中的當前活動數據框中的Streams圖層執行緩衝操作。如下圖所示,打開ArcToolbox,找到相應工具:
6.雙擊Buffer工具出現下圖的界面。大多數工具需提供一個或多個輸入參數才能執行。不管通過用戶界面還是通過Python腳本執行工具,都需要提供這些必選參數:
7.關閉Buffer工具。
8.在Python窗體中執行Buffer工具。使用Python窗體的代碼自動補全功能以及右側欄中的工具幫助來完成。執行以下代碼會以50米半徑緩衝Srtreams圖層,並創建了一個新的Stream_Buff多邊形圖層:
arcpy.Buffer_analysis("Streams","Stream_Buff","50 Meters")9.使用ArcMap的zoom(縮放工具)和pan(平移)工具來查看輸出要素,如下圖所示:
How it works...腳本中所有可用的地理處理工具都被定義為arcpy對象的動態函數(dynamic function)。腳本中執行的每一個工具都必須遵循特定的語法規則,首先需要定義工具名稱,之後緊跟一個下劃線(_)和工具箱的別名。在我們的示例中,Buffer工具位於Analysis Tools工具箱中,該工具箱的別名為analysis。使用別名是因為可能有多個工具的名稱相同。使用<toolname>_<toolbox_alias>的語句規則實現對每個工具的唯一引用。
ArcGIS桌面軟體中獲取工具箱別名很容易。找到工具所處的工具箱,然後右鍵點擊工具箱名稱。選擇屬性(Properties)。在屬性對話框中找到別名(Alias)文本框。你就會看到在地理處理腳本中要引用的工具箱別名:動態函數除了表示地理處理工具之外,arcpy類中還有許多函數並非地理處理工具。比如創建遊標,列出數據集,描述數據集,設置環境變量,消息等等。本書將會介紹其中大部分內容。
There's more...地理處理工作流程通常需要分多個步驟進行,也就是說需要使用一個或多個地理處理工具。你可以先勾勒出腳本的輪廓框架這樣就可以更為高效地編寫腳本。這些輪廓框架可以幫助你隨時思考你的地理處理任務,了解需要使用的地理處理工具。輪廓框架不需要太複雜,你可以簡單地畫出一個流程圖,然後在此基礎上編寫代碼。關鍵是你真正開始編寫代碼前要做好計劃和準備。
使用ArcGIS桌面軟體幫助系統ArcGIS桌面軟體幫助系統是一個獲取工具相關信息非常優秀的資源。每一個工具都有一個獨立頁面來詳細說明。該幫助系統可通過桌面軟體或在線形式訪問。
Getting ready幫助系統除了包含每個工具的基本描述信息,還包含了Python程式設計師感興趣的信息,比如語法規則以及示例代碼,這些示例代碼展示了在腳本中使用工具的細節信息。在本案例中,你將學習如何使用ArcGIS桌面軟體幫助系統來獲取語法規則信息和示例代碼。
How to do it...按照以下步驟來學習如何使用ArcGIS桌面軟體幫助系統來獲得工具的語法規則及示例代碼。
1.打開ArcMap,選擇主菜單中的幫助(Help)|ArcGIS Desktop幫助(ArcGIS Desktop Help)。
2.選擇目錄(Contents)選項卡。
3.選擇地理處理(Geoprocessing)|地理處理工具參考(Tool Reference)。這裡工具的組織形式跟在ArcToolbox中一致。
4.選擇分析工具箱(Analysis toolbox)下的鄰域分析工具集(Proximity toolset)。
5.點擊緩衝區(Buffer)。你就會看到緩衝區工具的幫助內容。如下圖所示:6.滾動頁面至語法(Syntax)部分,如下圖所示:
7.語法部分定義了在腳本中調用該工具的語法。在本例中,語法規則如下:
Buffer_analysis(in_features,out_feature_class,buffer_distance_or_field,{line_side}, {line_end_type},{dissolve_option}, {dissolve_field})8.滾動頁面至代碼示例(Code Sample)部分,你會找到一個或是多個代碼示例來說明如何在腳本中使用工具。建議在編寫腳本之前應該看一下這些代碼示例。
How it works...每個工具的幫助頁面內容包含了幾個部分,其中包括概況(summary),圖示(illustration),用法(uage),語法(syntax),示例代碼(code example),環境(enviroment),相關主題(related topic)以及許可信息(licensing information)。作為一名程式設計師,主要關注語法和示例代碼部分。查看語法部分會注意到使用工具名後跟下劃線和工具所處工具箱的別名的組合形式來調用工具。我們在本章前面的案例中簡單討論過這個問題。工具通常包含一個或多個參數,這些參數位於工具名稱後面的括號內。參數分為必選參數和可選參數。在本案例中,Buffer工具包含了三個必選參數:輸入要素,輸出要素以及緩衝距離。語法中必選參數會首先列出來且參數前後沒有其他特殊字符。可選參數則在處於必選參數後面且參數被花括號({})括起。Buffer工具包含了幾個可選參數,其中包括側類型(line side),末端類型(line end type),融合類型(dissolve option)以及融合欄位(dissolve field)。注意語法中每一個可選參數都用花括號括起。你在調用工具時候不需要一定包含這些可選參數。
使用變量存儲數據
你應該仔細查看語法部分的信息來確定要傳遞給每個參數的數據類型。比如說,buffer_distance_or_field參數接受的數據類型可以是線性長度單位也可以是欄位名稱。你可以使用一個數值或者使用包含距離信息的欄位傳遞給該參數。
通常情況下,你在使用工具前應該查看工具的語法,這樣可以確保你以正確的順序和適當的數據類型來使用工具。
查看示例代碼部分內容往往會幫助你找到編寫腳本的切入點。你通常會複製示例代碼內容到自己的腳本中去,然後根據需要修改腳本代碼。這將幫助你成為一個更為高效的程式設計師,同時查看其它腳本代碼並逐行檢查代碼來確定腳本的工作流程,從學習的角度來講也是很有幫助的。變量在腳本中是通過給定一個名稱並賦值來創建。這些變量佔據計算機內存中的空間,腳本運行時變量值可以更改。腳本執行完成後,變量佔據的內存空間將被釋放以進行其他操作。
Getting ready使用Python編寫地理處理腳本時,通常需要創建變量來保存一個或多個類型的數據。在腳本中,這些變量保存的數據可以作為工具和函數的輸入參數,也可以作為處理過程的中間數據,比如數據集的路徑等,另外還可以用作其他方面。除此以外,腳本中的許多ArcPy的函數和工具返回的數據也可以保存在變量中以作進一步處理使用。在本案例中,你將了解到創建變量和變量賦值的基本操作。
How to do it...按照以下步驟創建一個包含變量的腳本,變量既有通過硬編碼方式賦值的也有使用函數返回值賦值的:
1.打開IDLE,創建一個新的腳本窗口。
2.腳本保存為c:\ArcpyBook\Ch2\WorkingWithVariables.py文件。
3.導入arcpy包:4.創建一個path變量並賦值:
path = "c:/ArcpyBook/data"5.使用新創建的變量來設置工作空間:
arcpy.env.workspace = path
6.調用ListFields()函數,並將返回值賦值給一個新變量fields:
fields = arcpy.ListFields("Building_Permits.shp")7.使用for循環語句來處理包含在fields變量中每一個欄位對象:
8.列印每一個欄位名稱:
9.完整代碼如下:
import arcpypath = "c:/ArcpyBook/data"arcpy.env.workspace = pathfileds = arcpy.ListFields("Building_Permits.shp")for fld in fields:print fld.name10.保存腳本。
How it works...我們在腳本中使用了三個變量。第一個變量path賦了一個包含路徑內容的硬編碼值。這是一個字面量參數,也就是說字面上的值就是它的參數值。字面量參數與那些參數值能由參數值本身直接決定的參數是有區別的。第二個參數fields是由ListFields()函數的返回值創建的,該參數是一個包含了一個或多個Field對象的Python列表對象。每一個Field對象代表一個要素類或者表數據中的屬性表中的一個欄位。最後一個參數fld是一個動態參數。當for循環語句遍歷ListFields()函數返回的列表內容時,每一個Field對象會依次賦值給fld參數。每一個欄位名稱會列印到屏幕上。
訪問ArcPy中的模塊到目前為止,我們介紹了一些與ArcPy有關的基本概念。除了使用基本的ArcPy站點包,你還可以使用許多其他模塊來獲取特定的功能。使用這些模塊提供的功能之前必須首先明確地在腳本中導入這些模塊。在本案例中你將學習如何導入這些模塊。
Getting readyArcPy包除了提供了工具,函數和類之外,還提供了一些模塊。模塊(Module)是包含了針對特定用途的函數和類的Python庫文件。ArcPy提供的模塊包括製圖模塊(arcpy.mapping),數據訪問模塊(arcpy.da),空間分析模塊(arcpy.sa),地統計模塊(arcpy.ga),網絡分析模塊(arcpy.na)以及時間模塊(arcpy.time)。使用每一個模塊的函數和類之前必須明確地導入相關的庫文件。
How to do it...按照以下步驟來學習如何使用arcpy.mapping模塊中的函數和類:
1.在ArcMap中打開c:\ArcpyBook\Ch2\Crime_Ch2.mxd文件。
2.打開Python窗體。
3.導入arcpy.mapping模塊:import arcpy.mapping as mapping4.獲取當前地圖文檔的引用(Crime_Ch2.mxd):
mxd = mapping.MapDocument("CURRENT")5.調用arcpy.mapping.ListLayers函數:
print mapping.ListLayers(mxd)將會返回地圖文檔文件中的所有圖層列表並列印到shell窗口中:
[<map layer u'All Crimes in 2009'>, <map layer u'Burglaries in 2009'>, <map layer u'streams_buff'>, <map layer u'Crime Density by School District'>,<map layer u'Bexar County Boundary'>, <map layer u'Test Performance by School District'>,<map layer u'Bexar County Boundary'>, <map layer u'Bexar County Boundary'>,<map layer u'Texas Counties'>, <map layer u'School_Districts'>,<map layer u'Crime Surface'>, <map layer u'Bexar County Boundary'>]按照同樣的方式就可以訪問製圖模塊中所有可用的函數和類
How it works...ArcPy的每一個模塊提供的功能針對一個特定的用途。比如說,製圖模塊提供了管理地圖文檔和圖層文件的功能。該模塊中的函數和類都在某種程度上與管理這類文件有關。
作者:muyan
連結:https://www.jianshu.com/p/932e83db7f59
來源:簡書2021年6月19日-6月20日 線上
-
2021年6月24日-6月27日 青島
-
2021年7月9日-7月11日 線上
-
會務組聯繫:13261866021 / 18910582825 (同微信)