2020-07-02 面向ArcGIS的Python腳本編程

1、Python簡介

? ? ? ? ArcGIS for Desktop 支持使用腳本語言實現任務自動化。Python是ArcGIS首選的腳本語言

? ? ? ? Python不是由Esri公司開發的。它是一個開放源碼的編碼語言。因此可以通過第三方發布,包括Esri

? ? ? ? Python相對簡單。它有一個龐大的用戶社區和許多學習資源。此外,Python還提供很多函數庫以實現更多的功能

? ? ? ? Python的一個優點就是它既是一門腳本語言,又是一門程序語言。所以既可以用它編寫簡單的腳本,也可以用它開發高級應用程序。

? ? ? ? ?Python是一門解釋性語言,它不需要編譯,而是直接從源代碼執行。這使得Python與C++和NET.語言比起來更方便,也具有移植性。

? ? ? ? Python腳本可以像常見的地理處理工具一樣,變成一個腳本工具,直接整合到ArcGIS中。

2、ArcGIS的地理處理

? ? ? ? ArcGIS地理處理框架為組織和運行工具提供了強大而靈活的功能。

? ? ? ? ArcGIS有大量的工具,它們組織在ArcToolbox的工具箱和工具集中。這些不同類型的工具包括內置工具、腳本工具、模型工具和自定義工具

? ? ? ? 工具需要設置參數才能運行,這些參數包括輸入和輸出數據,還有其他一些控制工具如何執行的參數。

? ? ? ? 環境設置同樣能控制工具的運行,并可以在不同的級別進行設置。

? ? ? ? 可以用模型和腳本創建自己的工具。一旦創建了自定義工具,它們會和普通工具一樣運行。

? ? ? ? ? ModelBuilder為創建地理處理工作流提供一種可視化程序語言。模型的創建過程看上去像一個流程圖。

? ? ? ? Python為創建地理處理工作流提供一種文本編程語言。Python代碼可以直接在ArcGIS里的Python窗口運行。Python腳本(.py文件)通常由復雜的代碼組成,它能夠以不同的方式執行,如直接在操作系統中運行,用Python編輯器運行,或者是從ArcGIS腳本工具中調用。

? ? ? ? 運行模型和腳本同運行ArcGIS工具的過程是一樣的。模型可以轉換為腳本,但是腳本不能轉換為模型。把模型轉換為腳本是學習編寫Python腳本的一個好方法。

3、Python窗口

? ? ? ? Python窗口中,既可以高效、便捷地運行地理處理工具,也可以通過第三方Python模塊和庫來實現其他功能。對于Python初學者而言,Python窗口是學習Python的最佳方法。

? ? ? ? 可以將Python窗口中的代碼保存成腳本文件,也可以將現有的腳本文件加載到Python窗口中。

4、Python基礎

? ? ? ? Python代碼可以直接在交互式Python解釋器運行。也可以將代碼保存在后綴名為.py的腳本文件中。

? ? ? ? 在Python中可以使用表達式和語句。前者用來表示一個或多個值,后者用來表示一種操作。

? ? ? ? 變量名應該全部小寫,并且可以包含字母、數字以及下劃線。使用賦值語句可以為變量賦值。

? ? ? ? Python包含很多標準的內置函數,它們都可以被調用。如果使用的函數不是內置函數,需要先導入相應的模塊,再使用<module>.<function>的方式調用改函數

? ? ? ? 可以用Python中內置的函數對字符串進行處理,這些函數包括子串查詢,字符串連接、字符串分割、字符串過濾、字符串類型轉換等。

? ? ? ? 列表是一種功能豐富的數據類型。列表中的某個元素可以通過索引值獲取,索引值從0開始,例如mylist[0]。python語言中有許多處理列表的內置函數和方法,其中包括列表排序、列表切片、刪除元素、添加元素、插入元素等等

? ? ? ? 在Python腳本中可以使用循環和分支結構控制工作流。這些結構通過代碼的縮進來構成代碼塊。代碼縮進是Python腳本語言中不可或缺的一部分。

? ? ? ? Python語言在多數情況下是區分大小寫的。

5、使用Python進行地理處理

? ? ? ? ArcGIS 10引入了ArcPy站點包,該站點包為Python提供了訪問地理處理功能的接口。

它是早起ArcGIsscripting模塊的升級版,主要由模塊、函數和類構成。

? ??????ArcGIS中所有的地理處理工具都是以函數的形式提供。當ArcPy導入到Python腳本中時,就可以使用ArcGIS標準工具箱中的所有地理處理工具。運行工具的語法是:arcpy.<toolname_toolboxalias>(<parameters>)。此外,非工具函數可以用來輔助完成地理處理任務。

? ? ? ? ArcPy中的類是用來創建對象的。常用的類由enc類和SptialReference類。設置類屬性代碼為:arcpy.<classname>.<property> = <value>

? ? ? ? 可以使用消息函數查閱工具運行期間產生的消息。消息函數主要包括GetMessages、GetMessages以及GetMaxServerity。消息可以是消息性消息、警告消息以及錯誤消息。

? ? ? ? 在ArcPy中,可以通過相關函數檢查、獲取以及返回軟件及其擴展模塊的許可。

6、訪問空間數據

? ? ? ? Exists函數可以用來確定某個數據集是否存在。Describe函數可以用來描述數據集的屬性。這些函數經常用于確認腳本中的輸入數據是否符合要求。

? ? ? ? 處理列表的函數可以用來實現批處理。列表創建成功后,就可以編寫腳本來遍歷并處理列表中的每一個元素。例如,ListFeatureClasses函數可以將某個工作空間內的要素類創建成一個要素類列表,然后使用for循環遍歷列表中所有的要素,并對每一個要素進行相同的操作。列表是一種常見的Python數據類型。列表函數可以出來不同類型的元素,包括工作空間、字段、數據集、元素類、文件、柵格、屬性表等。

? ? ? ? 在Python中,元組和字典是兩種很重要的數據結構。元組是一組元素序列,它類似于列表,但是元祖中的元素是不可變的。字典是由多對關鍵字及其對應的值組成。字典的功能類似于查找表

7、處理空間數據

? ? ? ? ArcPy中的數據訪問模塊arcpy.da支持編輯操作和游標操作。

? ? ? ? 游標可以用來遍歷屬性表中的行,for循環或with語句可以實現迭代操作。

? ? ? ? 搜索游標可以用來檢索行,更新游標可用于根據位置更新和刪除行,而插入游標可用于向表或要素類中插入行

? ? ? ? 在Python中使用搜索游標可以執行SQL查詢語句,使用AddFieldDelimiters函數可以確保語法的正確。

? ? ? ? 可以使用VilidateTableName函數和ValidateFieldName函數分別驗證表名和字段名。這些函數可以把無效字符轉化為下劃線(_)。CreateUniqueName函數通過在輸入名稱后追加數字的方式在指定工作空間中創建唯一名稱。

? ? ? ? 使用ArcPy的解析函數可以把表名和字段名分割成幾個組成部分。

? ? ? ? Python可以對文本文件中的內容進行操作。open函數可以創建一個文件對象,該對象支持一系列文件讀寫的方法,例如read、readline、readlines、write和writelines。最常見的一種文件操作是以相同的處理方式遍歷文件中的內容,例如字符串查找和替換。

8、處理幾何圖形

? ? ? ? 幾何對象有多個屬性,包括長度和面積。通過相關幾何短語可以非常方便獲取幾何屬性。

????????幾何對象中的折點存儲在點對象的數組中(多部分要素時,一個數組中會包含多個點對象數組)。

? ? ? ? 使用插入和更新游標,可以創建或者更新現有要素。腳本可以通過創建點對象、設置點對象屬性,并將其放入數組中來定義要素。這些數據隨后既可用于創建幾何要素。

? ? ? ? 如果幾何對象的坐標系和要素類坐標系不同,則可以通過在游標上設置空間參考的方式來訪問這個幾何對象。

? ? ? ? 可以用幾何對象代替要素類作為地理處理工具的輸入和輸出,這樣會使腳本更便捷

9、使用柵格數據?

? ? ? ? ListRasters函數用來列出工作空間內的柵格數據。Describe函數用來描述柵格數據集和柵格波段。Describe函數返回的對象的屬性是動態的,它取決于數據的類型。

? ? ? ? arcpy.sa模塊已經將“地圖代數”整合到Python環境中。arcpy.sa模塊除了可以提供訪問Spatail Analyst工具的接口,還提供了一系列用于運行地圖代數的運算符。這些運算符提高了腳本處理柵格數據的效率。

? ? ? ? arcpy.sa模塊中包含了許多類,這些類主要用于定義柵格工具的參數

? ? ? ? 轉換函數可以將柵格數據輸入到NumPy數組中,從而可以使用Python其他類庫(例如SciPy)中的函數處理這些數據

10、制圖腳本

? ? ? ? arcpy.mapping模塊可以實現制圖自動化。改模塊中有十分豐富的用于制圖的類和函數,這些類和函數可以處理地圖文檔,數據庫,圖層和頁面布局。

? ? ? ? arcpy.mapping模塊的各種功能對應著在ArcGIS下進行制圖的各種流程。其中一些流程并不是arcpy.mapping模塊可以自動化完成某些重復性的操作,例如更新各種圖層中的數據源或者是替換各種地圖文檔中的文本。

? ? ? ? 打開地圖文檔既可以通過直接引用存儲在磁盤中的.mxd文件來實現,也可以通過調用ArcMap中已經打開的當前地圖文檔來實現。地圖文檔的屬性可以被訪問、修改和保存。arcpy.mapping模塊不能創建新的地圖文檔。

? ? ? ? ? 地圖文檔中的數據庫可以通過ListdataFrames函數訪問,數據框的屬性可以被訪問、修改和保存

? ? ? ? ? ? 數據框中的圖層可以通過Layer或者ListLayers函數訪問,圖層的屬性可以被訪問、修改和保存

? ? ? ? ? ? 地圖文檔中斷開的數據源可以通過ListBrokenDataSources函數進行識別。有多種方法用于修復斷開的地圖文檔、圖層以及屬性表。這些方法可以尋找并且替換工作空間、工作空間路徑和數據源。

? ? ? ? ? ? 頁面布局的每一個元素都可以被訪問和修改。

? ? ? ? ? ? 地圖可以輸出為各種格式,例如PDF、JPEG和TIFF格式。地圖同樣可以通過本地打印機打印出來或打印成PDF文件。當Data Driven Pages可用時,通過腳本可以新建PDF格式的地圖冊? ? ? ??

11、程序調試與錯誤處理

? ? ? ? ? ? 地理處理腳本中經常會出現錯誤。雖然語法錯誤容易被發現,但是腳本中可能會存在其他讓腳本無法正確運行的錯誤。含有錯誤處理語句的腳本更健壯。

? ? ? ? ? ? 有各種各樣的調試方法,相對簡單的辦法包括仔細分析錯誤消息,在腳本中添加Print語句,選擇性的注釋掉部分代碼,如果這些方法都不足以辨認和修復錯誤,可以使用調試器。調試器允許一步步執行每一行代碼,并監視變量的狀態。添加斷點可以用來檢查具有大量代碼的代碼塊。

? ? ? ? 任何調試方法都可以辨認出發送錯誤的位置,但是不能正確的指出為什么發生錯誤,所以需要熟知一些常見的錯誤,包含Python代碼錯誤和ArcGIS地理處理錯誤。

? ? ? ? 基本錯誤處理過程包含檢查數據是否存在,確定輸入數據的類型是否正確,檢查軟件和擴展模塊的許可,驗證表名和字段名。通常情況下,需要結合if語句來實現上述錯誤處理步驟。

? ? ? ? 預測出每一種類型的錯誤幾乎是不可能的,而且編寫這些錯誤檢查代碼也十分繁瑣。腳本在運行時只要一次出錯,就會出現異常。這些異常可以用try-except來捕捉,該語句可以識別出錯誤的類型。可以根據錯誤的類型自定義錯誤的處理程序。此外,還有一些語句,例如else和finally,它們可以添加到try-except語句中以確保可以高效地捕捉到異常。

? ? ? ? 錯誤信息有助于確認錯誤的性質,并且有助于修改腳本代碼。錯誤信息包括一般Python信息和來自于ArcPy ExecuteError類的錯誤信息。

12、創建Python類和函數

? ? ? 自定義函數可以使用def語句來定義。def語句后面的代碼塊定義了函數具體的功能。自定義函數可以包含參數,這些參數可以是必選參數,也可以是可選參數。

? ? ? ? 自定義函數可以從本地腳本或者從其他腳本調用。當從其他腳本調用函數的時候,需要將包含自定義函數的腳本作為一個模塊導入。因此,一個自定義模塊就是一個.py文件,該文件中至少包含一個函數。

? ? ? ? 可以使用if __name__ == “__main__” :語句來分辨自定義函數時從自身腳本運行還是從其他腳本中導入為模塊。

????不可以通過模塊的路徑導入模塊。模塊(腳本)文件的位置應該與使用該模塊的腳本文件的文件夾一樣,或者是PYTHONPATH環境變量中定義過的。如果需要,可以在程序包中使用.pth文件永久地添加路徑或者是在腳本中使用sys.path.append添加臨時路徑。

? ? 自定義類可以方便地將函數和變量組合在一起。類可以從腳本自身或者從其他腳本中調用。

? ? 隨著自定義函數和類的個數越來越多,就需要考慮將他們打包,類似于ArcPy站點包。

13、創建自定義工具

? ? 盡管Python腳本可以作為獨立腳本而脫離ArcGIS運行,但是將腳本作為腳本工具卻有很多優勢。腳本工具可以將腳本文件整合到地理處理框架中。例如,腳本工具可以和其他系統工具一樣在ModelBuilder中使用。

? ? 在任意的自定義工具箱中都可以新建腳本工具。腳本工具需要關聯一個腳本文件,當工具運行時,就會調用該腳本文件。

? ? 腳本工具需要有參數。設置參數的過程包括設置參數屬性、編寫接收參數值的代碼等。腳本工具對話框的外觀根據腳本工具的參數而定。

? ? 腳本工具的每一個參數都有一個種數據類型,例如要素類、類、表、值、字段等。參數的屬性可以控制參數的輸入值。它可以確保輸入的參數值符合要求。

? ? 所有的腳本工具都需要有輸出,這樣它們就能在ModelBuilder中使用。為了實現這一目標,有時候只能使用派生參數,這種類型的參數不會出現在工具對話框中。

? ? 可以通過ToolValidator類進一步定制工具行為

? ? 可以使用各種消息函數在進度對話框和Results窗口中輸出運行信息。進度對話框的外觀可以通過相關函數進行更改。??

? ? 為了提高運行效率,建議在進程中運行腳本工具

14、共享腳本工具??

? ? 構建地理處理框架的目的之一是為了共享工具。自定義工具箱可以添加到ArcToolBox中,并整合到地理處理工作流中,工具箱中可以添加任意數量的工具,包括模型工具和腳本工具。因此,腳本工具可以通過一個包含腳本文件(.py)以及其他相關資源的工具箱文件(.tbx進行共享)

? ? 為了確保自定義工具可以正常運行,工具運行所必需的資源應該存放在一個具有標準結構的文件夾目錄下。該目錄包括腳本文件夾、數據文件夾以及文檔文件夾

? ? 只有在不移動或不重名文件夾的時候才能使用絕對路徑。為了共享工具,需要采用相對路徑。相對路徑是相對于當前文件夾的、對腳本文件來說就是工具箱所在的文件夾。相對路徑不能跨越多個驅動器。

? ? 地理處理包也可以用于共享腳本工具。地理處理包是一個后綴名為.gpk的壓縮文件。它包含了執行地理處理工作流所需要的所有的文件,包括自定義工具、輸入數據集,以及其他一些支持文件。

? ? 共享工具的文檔有多種編寫方式,包括在ArcCatalog中編輯描述頁面,使用樣式表,以及引用經過編譯的幫助文件。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。