python笔记之ArcPy简介
第1章?ArcPy簡介
1.1什么是 ArcPy?
ArcPy 是一個以成功的 arcgisscripting 模塊為基礎并繼承了 arcgisscripting 功能進而構建而成的站點包。目的是為以實用高效的方式通過 Python 執行地理數據分析、數據轉換、數據管理和地圖自動化創建基礎。
該包提供了豐富純正的 Python 體驗,具有代碼自動完成功能(輸入關鍵字和點即可獲得該關鍵字所支持的屬性和方法的彈出列表;從中選擇一個屬性或方法即可將其插入),并針對每個函數、模塊和類提供了參考文檔。
在 Python 中使用 ArcPy 的另一個主要原因是,Python 是一種通用的編程語言。Python 是一種支持動態輸入的解釋型語言,適用于交互式操作以及為稱為腳本的一次性程序快速制作原型,同時其具有編寫大型應用程序的強大功能。用 ArcPy 編寫的 ArcGIS 應用程序的優勢在于,可以使用由來自多個不同領域的 GIS 專業人員和程序員組成的眾多 Python 小群體開發的附加模塊。
?
1.2 ArcPy 快速瀏覽
利用 ArcPy 可訪問地理處理工具和其他函數、類和模塊,使用它們可快速輕松地創建簡單或復雜工作流。使用以 ArcPy 編寫的 ArcGIS 應用程序和腳本的優勢在于,可以訪問并使用由來自多個不同領域的 GIS 專業人員和程序員開發的大量 Python 模塊。
一般來說,ArcPy 按工具、環境、函數、類和模塊進行組織。
1、運行工具
以下示例顯示了如何執行緩沖區工具。執行該工具時,消息將默認顯示在幫助部分中 Python 窗口的右側。
?
例1.1 執行緩沖區工具
>>> arcpy.Buffer_analysis("c:/data/Portland.gdb/streets", "c:/data/Portland.gdb/steets_buffer", "500 METERS")
?
以下是另一個運行工具的示例。該示例使用的是數據管理工具箱和轉換工具箱中的工具。向輸入 streets 要素類添加一個字段并計算該字段,然后將要素類加載到 ArcSDE 企業級地理數據庫中。
?
例1.2?執行多個工具
>>> arcpy.AddField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "TEXT")
>>> arcpy.CalculateField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "!shape.length@miles!", "PYTHON_9.3")
>>> arcpy.FeatureClassToFeatureClass_conversion("c:/data/Portland.gdb/streets", "Database Connections/MySDE.sde/PortlandDataset", "streets")
?
執行地理處理工具時,工具的結果會返回到 result 對象中。通常,該對象是由工具生成或更新的輸出數據集的路徑。在其他情況下,它可能會包含其他類型的值,如數值或布爾值。如果工具的輸出是多值參數,則這些值可在列表中以列表的形式返回。
以下代碼示例顯示了如何捕獲返回值以及這些值的具體內容:
返回輸出要素類的路徑,該結果可用作其他函數的輸入;返回要素數目。
?
例1.3?從工具獲取結果
>>> result = arcpy.Buffer_analysis("rivers", "riverBuf", "50 METERS")
>>> print?result
C:\Portland\Portland_OR.gdb\riverBuf
>>> arcpy.Clip_analysis("streets", result, "streets_50m_of_rivers")
>>> result = arcpy.GetCount_management("streets_50m_of_rivers")
>>> print?result.getOutput(0)
54
?
2、使用環境設置
可將地理處理環境設置視為影響工具執行結果的附加參數。這些參數與正常的工具參數不同,因為它們是通過工具單獨進行設置的,并且供工具在運行時查詢和使用。諸如感興趣區域、輸出數據集的坐標系以及新柵格數據集的 像元大小等環境設置均可通過工具進行指定和支持。
可通過 env 類來獲得屬性形式的環境設置。這些屬性可用于檢索和設置當前環境值。下面是如何使用環境值的示例:
?
例1.4 設置工作空間環境
>>> arcpy.env.workspace = "c:/data/Portland.gdb"
>>> arcpy.Buffer_analysis("streets", "streetBuf", "500 METERS")
>>> arcpy.env.spatialGrid1 = arcpy.CalculateDefaultSpatialGridIndex_management("streets").getOutput(0)
>>> if?arcpy.env.cellSize != 30:
????????arcpy.env.cellSize = 30
?
3、使用函數
函數是用于執行某項特定任務并能夠納入更大的程序的已定義功能。除工具之外,ArcPy 還提供了多種函數,用來更好地支持地理處理工作流。函數可用于列出某些數據集、檢索數據集的屬性、檢查數據是否存在、在將表添加到地理數據庫之前驗證表名稱,或執行其他許多有用的腳本任務。
以下示例代碼顯示的是獲得數據的屬性:
?
例1.5 使用函數
import?arcpy
?
# prints True
print?arcpy.Exists("c:/data/Portland.gdb/streets")
?
# prints NAD_1983_StatePlane_Oregon_North_FIPS_3601_Feet
sr = arcpy.Describe("c:/data/Portland.gdb/streets").spatialReference
print?sr.name
?
4、使用類
ArcPy 類,如SpatialReference?和Extent?類,通常用作地理處理工具參數設置的快捷方式,否則的話,這些參數會使用更加復雜的字符串。類的作用類似于建筑設計藍圖。藍圖為如何創建事物提供了一個框架,而類則可用來創建對象,即通常所稱的實例。
?
例1.6 使用類
import?arcpy
?
spatial_ref = arcpy.SpatialReference("Hawaii Albers Equal Area Conic")
?
5、使用模塊
ArcPy 包含涉及其他 ArcGIS 領域的模塊。有一系列模塊支持 ArcPy,包括數據訪問模塊?(arcpy.da)、制圖模塊?(arcpy.mapping)、ArcGIS Spatial Analyst擴展模塊?(arcpy.sa) 和ArcGIS Network Analyst 擴展模塊?(arcpy.na)。
例如,arcpy.sa 模塊中的工具將使用 Spatial Analyst 工具箱中的工具,但被配置為支持“地圖代數”。因此,執行 arcpy.sa.Slope 與執行 Spatial Analyst 工具箱中的坡度工具的作用是相同的。
?
第2章 使用ArcPy準備工作
2.1?導入 ArcPy
在導入 ArcPy 之后,可以運行隨 ArcGIS 安裝的標準工具箱中的所有地理處理工具。
?
例2.1 導入ArcPy
# Importing arcpy
import?arcpy
?
模塊為通常包含函數和類的 Python 文件。有一系列模塊支持 ArcPy,包括制圖模塊(arcpy.mapping)、Spatial Analyst 模塊 (arcpy.sa) 和Geostatistical Analyst 模塊 (arcpy.ga)。
要導入整個模塊,請使用導入模塊:
?
例2.2?導入模塊
# Import only arcpy.mapping
import?arcpy.mapping
?
在很多情況下,用戶可能不想使用整個模塊或無需使用整個模塊。如果只導入某一模塊的一部分,可以使用 from-import 語句。在下例中,將導入 env 類(env 類包含所有地理處理環境)。現在無需以 arcpy.env 的形式訪問環境,而可以將其簡化為 env。
?
例2.3?導入部分模塊
# Import env from arcpy and set the workspace environment
from?arcpy?import?env
env.workspace = "c:/data"
?
遵循相同的思路,有時用戶可能需要注意:如何對模塊或模塊的一部分進行標識以使腳本更具可讀性,以及對于首選項來說默認名稱可能過長。在上述任一情況下,均可以使用 from-import-as 的形式。與先前的示例相同,下面的示例中也將導入 env 類,但會指定 ENV 作為 env 類的名稱:
?
例2.4?使用別名
# Import env from arcpy as ENV and set the workspace environment
from?arcpy?import?env as?ENV
ENV.workspace = "c:/data"
?
模塊的內容將被直接導入到命名空間中,這表示用戶隨后可以直接使用所有這些內容,而無需為它們添加前綴。使用此方法存在一些風險。具有相同名稱的其他對象、變量、模塊等將被覆蓋,另外在使用大型模塊時,命名空間可能會變得異常擁擠和雜亂。此方法可能導致在閱讀腳本時出現不確定或難以閱讀的情況。
但是在某些情況下,from-import-* 可以簡化代碼,例如,在使用 ArcGIS Spatial Analyst 擴展模塊的 sa 模塊的情況下。sa 模塊的優勢之一在于,可以在一行中嵌套多個類和函數以生成輸出柵格對象。
?
例2.5?直接導入
# Import arcpy and the sa module
import?arcpy
from?arcpy?import?sa
?
arcpy.CheckOutExtension("spatial")
?
# Get input parameters
inRaster1 = arcpy.GetParameterAsText(0)
inRaster2 = arcpy.GetParameterAsText(1)
inRaster3 = arcpy.GetParameterAsText(2)
?
outRaster = (sa.Raster(inRaster1) + (sa.Raster(inRaster2) - sa.Raster(inRaster3)))
?
2.2 地理處理環境設置(env)
每個工具都含有一組用于執行操作的參數。其中一些參數在所有工具中通用,如容差或輸出位置。這些參數可從所有工具在運行期間使用的地理處理環境中獲得默認值。執行某一工具時,當前環境設置也可用作全局輸入參數值。諸如感興趣區域、輸出數據集的空間參考以及新柵格數據集的柵格像元大小等設置都可以使用地理處理環境指定。
1、獲取和設置環境設置
環境設置以env?類的屬性的方式公開。這些屬性可用于檢索或設置當前值。每個環境設置都有一個名稱和一個標注。標注顯示在 ArcGIS 中的環境設置對話框上。名稱用在腳本或 ArcGIS 應用程序的命令行中。下面是如何使用環境值的示例:
環境可作為環境類中的讀/寫屬性進行訪問,方法為 arcpy.env.<環境名稱>。還可以利用 Python 的 from-import 語句簡化代碼,而不必為每個環境名稱都添加 arcpy.env 前綴。
?
例2.6 設置環境值
import?arcpy
from?arcpy?import?env
?
# Set the workspace environment setting#
env.workspace = "c:/St_Johns/data.gdb"
?
# Set the XYTolerance environment setting#
env.XYTolerance = 2.5
?
# Calculate the default spatial grid index, divide in half, then
# ??set the spatial grid 1 environment setting#
result = arcpy.CalculateDefaultGridIndex_management("roads")
?
env.spatialGrid1 = float(result.getOutput(0)) / 2
?
# Clip the roads by the urban area feature class#
arcpy.Clip_analysis("roads","urban_area","urban_roads")
?
例2.7 獲取和設置環境值
import?arcpy
from?arcpy?import?env
?
# Check the current raster cell size and make sure it is a certain size
# ??for standard output#
env.workspace = "c:/avalon/data"
?
if?env.cellSize < 10:
????env.cellSize = 10
elif?env.cellSize > 20:
????env.cellSize = 20
????
arcpy.HillShade_3d("island_dem", "island_shade", 300)
?
設置環境值時要注意拼寫和大小寫。將值指定給 arcpy.env.Workspace 與設置 arcpy.env.workspace(注:arcpy.env.workspace 是正確的格式)是不同的。
?
2、使用環境設置處理臨時數據
臨時地理數據庫和 臨時文件夾是提供保證存在的地理數據庫和文件夾位置的只讀環境。這意味著,您可以隨時可靠地使用地理數據庫或文件夾,而不必創建或管理一個。
?
例2.8 處理臨時數據
import?arcpy
?
inputFC = arcpy.GetParameterAsText(0)
clipFC = arcpy.GetParameterAsText(1)
outputFC = arcpy.GetParameterAsText(2)
?
# Use scratchGDB environment to write intermediate data#
tempData = arcpy.CreateScratchName(workspace=arcpy.env.scratchGDB)
?
bufferResult = arcpy.Buffer_analysis(inputFC, tempData, "50 METERS")
arcpy.Clip_analysis(clipFC, bufferResult, outputFC)
?
3、重新設置環境
由于地理處理環境對工具操作和輸出有著很大的影響,因此需要保證能夠追蹤環境設置并在必要時將其重置為默認狀態。
可使用ResetEnvironments?函數恢復默認環境值,或者可以使用ClearEnvironment?函數重置特定環境。
?
例2.9 重新設置環境
# Reset geoprocessing environment settings
arcpy.ResetEnvironments()
?
# Reset a specific environment setting
arcpy.ClearEnvironment("workspace")
?
4、env常用設置
環境設置以 ArcPy env 類的屬性的方式公開。這些屬性可用于檢索或設置當前值。可將地理處理環境設置視為影響工具執行結果的附加參數。
?
表2-1 env常用屬性
| 屬性 | 說明 | 數據類型 |
| cellSize (讀寫) | 支持“像元大小”環境設置的工具可以設置在操作時使用的輸出柵格像元大小或分辨率。默認輸出分辨率由最粗糙的輸入柵格數據集決定。 | String |
| extent (讀寫) | 支持“輸出范圍”環境的工具只會處理落入此設置中所指定范圍內的要素或柵格。 | String |
| mask (讀寫) | 支持“掩膜”環境的工具只會考慮運行過程中落入分析掩膜范圍內的像元。 | String |
| nodata (讀寫) | 支持 NoData 環境設置的工具將僅處理其中 NoData 有效的柵格 | String |
| spatialGrid1 spatialGrid2 spatialGrid3 (讀寫) | 遵循“輸出空間格網 1、2 和 3”環境的工具將創建具有指定空間索引格網的要素類(如果要素類支持空間索引格網)。 | Double |
| tileSize (讀寫) | 支持“分塊大小”環境的工具用于為存儲在數據塊中的柵格設置分塊大小。 | String |
| workspace (讀寫) | 支持“當前工作空間”環境設置的工具將指定的工作空間用作地理處理工具輸入和輸出的默認位置。 | String |
| XYDomain (讀寫) | 支持“輸出 XY 屬性域”環境的工具可為輸出地理數據集的 x,y 屬性域設置特定范圍。 | String |
| XYResolution (讀寫) | 支持此環境的工具可將 x,y 分辨率應用到輸出地理數據集中。 | String |
| XYTolerance (讀寫) | 支持此環境的工具會覆蓋在地理數據庫內創建的地理數據集上的默認 x,y 容差。 | String |
?
2.3 訪問許可和擴展模塊
每當在腳本中執行工具時,都會需要 ArcGIS 許可。此外,運行 ArcGIS 擴展模塊中的工具,如 ArcGIS Spatial Analyst 擴展模塊,也需要針對該模塊的許可。如果無法獲得必要的許可,工具將運行失敗并返回錯誤消息。例如,如果您安裝有 ArcGIS for Desktop Basic 的許可,并試圖運行需要 Standard 或 Advanced 的許可,則工具將運行失敗。
使用 ArcGIS for Desktop Basic 或 Standard 許可時,腳本應將產品設置為 Basic 或 Standard。同樣,使用 Engine 或 EngineGeoDB 許可時,腳本應將產品設置為 Engine 或 EngineGeoDB。如果未明確設置許可,將根據首次訪問 ArcPy 工具、函數或類時的最高可用許可等級初始化許可。
每種工具都將執行檢查以確保具有相應的許可。如果不具有所需的許可,工具將運行失敗。為避免腳本在執行到一半時失敗,可以在腳本開頭執行檢查,以盡早發現失敗。
注意:只有在獨立腳本中才必須設置產品和擴展模塊。如果從 Python 窗口運行工具或者使用腳本工具,產品已在應用程序內進行設置,激活的擴展模塊取決于“擴展模塊”對話框。
1、Desktop、Engine/Server 許可
產品模塊會在導入 arcpy 前導入,以定義腳本使用的 Desktop 許可。CheckProduct?函數可用于檢查 Desktop 許可的可用性,而ProductInfo?函數能報告當前的產品許可。
?
例2.10 檢查ArcGIS for Desktop Advanced 許可。
import?sys
import?arcpy
?
arcpy.env.workspace = "c:/data/world.gdb"
?
if?arcpy.CheckProduct("ArcInfo") == "Available":
????arcpy.PolygonToLine_management("Lakes", "LakeLines")
else:
????msg = 'ArcGIS for Desktop Advanced license not available'
????print(msg)
????sys.exit(msg)
?
2、擴展模塊許可
可以從許可管理器中獲取擴展模塊許可,并在不再需要時將其歸還。CheckExtension?函數用于查看是否存在可為特定類型的擴展模塊檢出的許可,而CheckOutExtension?會真正獲取許可。腳本獲取到擴展模塊許可后,即可執行擴展模塊工具。腳本使用完特定擴展模塊中的工具后,應使用CheckInExtension?函數將許可歸還給許可管理器,以便其他應用程序使用。當腳本完成時,所有檢出的擴展模塊許可和設置的產品許可都將歸還給許可管理器。
下面的示例將執行一些 ArcGIS 3D Analyst 工具,并將 Desktop 產品許可設置為 ArcGIS for Desktop Basic,因為執行擴展模塊中的工具時不需要 ArcGIS for Desktop Advanced 的許可。如果未明確設置 ArcGIS for Desktop Basic 的許可,并且無可用的 ArcGIS for Desktop Advanced 許可,則腳本將失敗,因為運行擴展模塊工具需要 Desktop 許可。
?
例2.11 檢查ArcGIS 3D Analyst 擴展模塊許可
class?LicenseError(Exception):
????pass
?
# Set desktop license used to ArcGIS for Desktop Basic#
import?arcview
import?arcpy
from?arcpy?import?env
?
try:
????if?arcpy.CheckExtension("3D") == "Available":
????????arcpy.CheckOutExtension("3D")
????else:
????????# Raise a custom exception????????#
????????raise?LicenseError
????
????env.workspace = "D:/GrosMorne"
????arcpy.HillShade_3d("WesternBrook", "westbrook_hill", 300)
????arcpy.Aspect_3d("WesternBrook", "westbrook_aspect")
?
except?LicenseError:
????print?"3D Analyst license is unavailable"??
except:
????print?arcpy.GetMessages(2)
finally:
????# Check in the ArcGIS 3D Analyst 擴展模塊????#
????arcpy.CheckInExtension("3D")
?
第3章 Python調用地理處理工具
3.1 地理處理工具
1、地理處理
地理處理適合于各類使用 ArcGIS 的用戶。無論是初學者還是高級用戶,地理處理都可能是日常使用 ArcGIS 的重要組成部分。地理處理的基本目的是提供用于執行分析和管理地理數據的工具和框架。地理處理所提供的建模和分析功能使得 ArcGIS 成為一個完整的地理信息系統。
地理處理提供了大量成套工具,用于執行從簡單的緩沖區和面疊加到復雜的回歸分析和影像分類等各項 GIS 任務。執行自動操作的任務可以是普通任務 - 例如,將大量數據從一種格式轉換為另一種格式。也可以是很有創造性的任務,這些任務使用一序列操作對復雜的空間關系進行建模和分析 - 例如,通過交通網絡計算最佳路徑、預測火勢路徑、分析和尋找犯罪地點的模式、預測哪些地區容易發生山體滑坡或預測暴雨事件造成的洪水影響。
2、常用地理處理工具
可將地理處理視為一種語言,其中名詞是地理數據(例如要素、表和柵格),而工具是動詞(例如復制、裁剪和連接)。與任何語言一樣,需要知道一些名詞和動詞才能進行交流,而本部分(及后續內容)向您介紹這些常見的地理處理動詞(工具)。如果您不熟悉要素類和柵格等名詞,則地理信息元素概述可作為一份很好的入門材料。
最常用的 GIS 工具可自動執行一些以往手動完成的任務,例如,通過在一張地圖上方疊加另一張地圖來編譯新地圖,或者以物理方式將地圖剪切成表示特定研究區域的各個部分,然后更改其投影。在此類手動執行的任務中,有些任務操作起來非常困難和復雜,以至于它們阻礙了地理知識和數據的宣傳普及,而它們也是發明 GIS 的主要動力。
·?疊加分析和鄰域分析
這兩個常用的工具集可以回答兩個最基本的地理問題:什么在什么之上?以及什么在什么附近?
·?表面分析
地理現象不僅僅局限于離散的點、線和面,還包括在地球表面(或正在研究的任何星球或物體)上連續變化的數據,例如,高程、坡度、降雨量和溫度等。這種連續數據稱為表面并用柵格和 TIN 進行建模。
·?空間統計數據和非空間統計數據
地理學中有這樣一條公理:事物的距離越近,其相似程度越高。該公理不僅為用來發現和表征地理模式且功能強大的空間統計工具奠定了基礎,而且還為標準的非空間統計工具(如最小值、最大值、總和、頻率、均值和標準差)奠定了基礎。
·?表管理
ArcGIS 將數據存儲在易于訪問的表中,并且大部分工作流都包括某種表管理操作,例如,添加或刪除字段、創建表間關系或根據包含坐標的列創建要素。
·?選擇和提取
GIS 數據集包含的數據通常遠超出需求,而一組常見的任務可用于從較大且較復雜的數據集中減去數據或提取數據。
?
3、工具和工具箱
地理處理工具用于對地理數據執行一些非常小但非常重要的操作,例如提取和疊加數據、更改地圖投影、向表中添加列、計算屬性值、面疊加和最優路徑等等。您不僅用于數百種工具可供選用,還可通過模型構建器(可視化編程語言)或腳本(文本編程語言)創建您自己的工具。
工具都儲存在工具箱中。ArcGIS 提供了數百種工具,并將它們進行了分類并放到了十余個工具箱中,這些工具功能豐富、涉及領域廣泛。
?
圖3-1 ArcGIS 提供的工具箱
3.2 地理處理工具運行方法
可以使用多種方法來執行工具。最常見的方法是打開工具對話框,填入工具參數,然后單擊確定執行工具。對于系統工具,工具執行操作在后臺進行,這意味著在工具執行的同時也可繼續在 ArcMap 中工作。工具執行完成時,將收到一條通知消息,可以在結果 窗口中查看有關工具執行情況的信息。通常,工具創建的輸出會自動添加到 ArcMap 內容列表。
要執行工具,首先必須找到該工具,方法是在搜索 窗口中搜索該工具或在目錄 窗口中瀏覽到該工具。
1、使用工具對話框執行工具
要從搜索 窗口中打開工具對話框,請單擊該工具名稱。
?
圖3-2 搜索工具
?
要從目錄 窗口或 ArcToolbox 窗口中打開工具對話框,請雙擊該工具,或右鍵單擊并選擇打開。
?
圖3-3 打開工具
?
工具對話框打開后,填入工具的參數。各工具自己都有唯一一組參數。有些參數為必需參數,只有填入這些參數(即,它們必須具有值)后工具才可執行。其他參數為可選參數,也就是說,可以將這些參數留空或接受其默認值。工具具有輸入和輸出參數。輸入參數通常是現有數據集或選項,它們控制著工具的功能。輸出參數通常是工具創建的新數據集。對于輸出數據集參數,在您輸入一個或多個輸入參數后,將自動創建輸出數據集名稱和位置。
2、使用模型構建器執行工具
模型構建器是一款功能強大的應用程序,通過它可將一系列工具串聯在一起,一個工具的輸出用作另一個工具的輸入,如下所示。
?
圖3-4 模型構建器
?
在模型構建器中,添加工具,打開其對話框,填入參數,然后單擊確定按鈕。如果單擊確定后,工具并未執行,那么必須運行模型,該工具才能執行。這樣可將多個工具串聯在一起,可以一次性執行所有相關工具。
模型是自動處理工作的方式。創建模型時,保留可以使用不同輸入數據多次執行的數據處理工作流。使用模型可自動處理無數的任務。
3、通過 Python 窗口執行工具
還可使用基于文本的編程語言(如 Python)來執行工具。由于 Python 是基于文本的編程語言(而不是像模型構建器那樣的可視化編程語言),因此要依次輸入工具名稱及其參數。在下圖所示的 Python 窗口中,您可以輸入 Python 代碼并立即執行該代碼。
?
圖3-6 Python窗口
?
雖然與使用工具對話框相比,該工作顯得有些多余(誰也不愿意輸入成批的代碼),但使用 Python 和 Python 窗口具有很多優勢:
·?可以使用邏輯語句(如 if-then-else)進行條件執行或使用 for 循環遍歷數據集,也可訪問 Python 數據結構(如字典和列表)。
·?可以訪問標準 Python 模塊中的功能來對字符串、數學或文件和文件夾進行操作。下圖中,glob 模塊被用于瀏覽系統文件夾中的所有文件。
·?Python 具有豐富的可用于操縱和變換數據的第三方模塊。
·?加載 ArcPy 站點包(在下圖中通過 import 語句進行加載)時,可以訪問所有地理處理工具以及許多用于逐行讀取要素、描述數據或與 ArcMap 交互的其他函數。例如,在下圖中,使用 ArcPy mapping模塊向當前地圖中添加圖層。
?
圖3-7 代碼示例
?
4、通過 Python 腳本執行工具
可在 Python 窗口中輸入代碼并立即將其進行執行。但您也可使用文本編輯器或集成開發環境 (IDE)(例如 PythonWin)在磁盤中創建 Python 文件(帶有 .py 擴展名的文件)。這些文件(稱為腳本)是可從操作系統提示符或通過創建執行腳本的腳本工具執行的程序。腳本工具與所有其他地理處理工具一樣,可以在模型、Python 窗口或 Python 腳本中,通過其對話框來執行腳本工具。
?
3.3 通過 Python 使用工具
1、工具參數與調用
每個地理處理工具都具有一組固定的參數,這些參數為工具提供執行所需的信息。工具通常包含多個輸入參數以定義一個或多個數據集,這些數據集一般用于生成新的輸出數據。參數具有幾個重要屬性:
·?每個參數具有一種或多種特定的數據類型,如要素類、整型、字符串或柵格。
·?參數為輸入值或輸出值。
·?參數需有值,或為可選。
·?各個工具參數都具有唯一的名稱。
?
在 Python 中使用工具時,必須正確設置工具的參數值,以便在腳本運行時工具可以執行。一旦提供了一組有效的參數值,工具即準備好執行。參數將被指定為字符串或對象。
字符串是唯一標識參數值的簡單文本,如數據集的路徑或關鍵字。在下面的代碼示例中,為緩沖區工具定義了輸入和輸出參數。請注意,工具名稱要追加其工具箱的別名。在該示例中,兩個字符串變量用于定義輸入和輸出參數,以便對工具的調用更容易閱讀。
?
例3-1 使用字符串作為參數
import?arcpy
?
roads = "c:/base/data.gdb/roads"
output = "c:/base/data.gdb/roads_Buffer"
?
# Run Buffer using the variables set above and pass the remaining
# parameters in as strings
arcpy.Buffer_analysis(roads, output, "distance", "FULL", "ROUND", "NONE")
?
對于部分參數(如空間參考),還可以指定對象。在下面的代碼示例中,使用其可選“坐標系”參數的SpatialReference?對象執行 創建要素類工具。
?
例3-2 ?使用對象作為參數
import?arcpy
?
in_workspace = "c:/temp"
output_name = "rivers.shp"
?
# Create a spatial reference object
spatial_ref = arcpy.SpatialReference('North America Equidistant Conic')
?
# Run CreateFeatureclass using the spatial reference object
arcpy.CreateFeatureclass_management(
????in_workspace, output_name, spatial_reference=spatial_ref)
?
大部分地理處理工具同時包含必選參數和可選參數。通常,在許多情況下都存在多個不需要進行指定的可選參數。有兩種方法可以處理這些未使用的參數。一個方法是保持所有可選參數有序,然后將您不需要的參數引用為空字符串 ""、井號 "#" 或類型為 None 的參數。另一種方法是使用關鍵字參數,并使用參數名稱來分配值。使用關鍵字參數可以跳過未使用的可選參數或以不同的順序指定它們。
?
例3-3 ?使用空字符串跳過可選參數
import?arcpy
?
arcpy.AddField_management("schools", "school_id", "LONG", "", "", "", "", "NON_NULLABLE")
?
?
?
例3-4 ?使用關鍵字參數跳過可選參數
import?arcpy
?
arcpy.AddField_management("schools", "school_id", "LONG", field_is_nullable="NON_NULLABLE")
?
2、工具輸出
當作為Result?對象執行時,ArcPy 會返回工具的輸出值。結果對象的優點是可以保留工具執行的相關信息,包括消息、參數和輸出。即使在運行了多個其他工具后仍可保留這些結果。
下面的示例說明了如何在執行地理處理工具后獲取結果對象的輸出。
?
例3-5 ?獲取結果對象的輸出
import?arcpy
?
arcpy.env.workspace = "c:/city/data.gdb"
?
# Geoprocessing tools return a result object of the derived
# output dataset.
result = arcpy.CopyFeatures_management("roads", "urban_roads")
?
# A print statement will display the string
# representation of the output.
print?result
?
# A result object can be indexed to get the output value.
# Note: a result object also has a getOutput() method that
# can be used for the same purpose.
result_value = result[0]
?
如果為結果對象建立索引或使用其 getOutput() 方法,那么返回值為 Unicode 字符串。當使用派生輸出參數運行諸如獲取計數(提供表中的記錄數)或計算默認拓撲容差(提供拓撲容差值)之類的工具時,需要重點考慮這一點。要將 Unicode 字符串轉換為所需類型,可使用 int() 或 float() 等內置 Python 函數。
注:派生參數不需要用戶的交互,并且不會在工具對話框上或作為 Python 中的工具的參數出現。輸出參數通常是“派生”類型。
?
例3-6 ?派生輸出參數
import?arcpy
import?types
?
arcpy.env.workspace = "c:/base/data.gdb"
?
# Many geoprocessing tools return a result object of the derived
# output dataset.
result = arcpy.GetCount_management("roads")
result_value = result[0]
?
# The result object's getOutput method returns values as a
# unicode string. ?To convert to a different Python type, use
# built-in Python functions: str(), int(), long(), float()
count = int(result_value)
print?count
print?types.TypeType(count)
?
?
如果創建的輸出僅為大型工作流的一個中間階段,那么輸出參數可以省略,以便工具為輸出創建唯一路徑和名稱。可以通過將輸出設置為“#”或“None”來完成此操作,或如果輸出是所使用的最后一個參數,則可以完全跳過此操作。在每種情況中,返回值都是新數據源的完整路徑。
?
例3-7 ?輸出參數的省略
import?arcpy
arcpy.env.workspace = "c:/city/data.gdb"
?
result = arcpy.CopyFeatures_management("roads", "#")
result = arcpy.CopyFeatures_management("roads", "")
result = arcpy.CopyFeatures_management("roads")
?
3、ArcPy 中的工具組織
地理處理工具以兩種不同的方法進行組織。所有工具均以 ArcPy 函數的形式提供,但也可以通過匹配工具箱別名的模塊調用。盡管幫助中的大多數示例都以 ArcPy 函數的形式顯示工具,但兩種方法同樣有效。使用哪一種方法具體取決于個人喜好和編碼習慣。在下面的示例中,使用兩種方法顯示獲取計數工具。
?
例3-8 ?工具調用方式
import?arcpy
?
in_features = "c:/temp/rivers.shp"
?
# Tools can be accessed as functions on the arcpy module
arcpy.GetCount_management(in_features)
?
# Or from modules matching the toolbox name
arcpy.management.GetCount(in_features)
?
通過模塊使用工具時,有時可能要注意標識模塊的方式,以便腳本具有更好的可讀性。在這種情況下,可以使用格式 from - import - as。
?
?
例3-9 ?標識模塊的方式
# Clean up street centerlines that were digitized without
# having set proper snapping environments
import?arcpy
from?arcpy?import?edit as?EDIT
from?arcpy?import?management as?DM
?
streets = "c:/data/streets.gdb/majorrds"
streets_copy = "c:/output/Output.gdb/streetsBackup"
?
DM.CopyFeatures(streets, streets_copy)
EDIT.TrimLine(streets, "10 Feet", "KEEP_SHORT")
EDIT.ExtendLine(streets, "15 Feet", "EXTENSION")
?
3.4 示例:如何按照字段列表創建FeatureClass ?
1、創建Workspace
“工作空間”工具集包含一系列可創建 ArcGIS 所使用的數據存儲結構的工具。這些結構包括工作空間、文件、兩種類型的地理數據庫、要素數據集和一個 ArcSDE 連接文件。
Shapefiles是文件類型的空間數據存儲格式,從而在“工作空間”工具集中選用“CreateFolder”工具來完成這一目標。
CreateFolder_management (out_folder_path, out_name)
n?out_folder_path:要創建文件夾的磁盤位置。數據類型為Folder
n?out_name:?要創建的文件夾。數據類型為String
?
例3-10 ?CreateFolder
# Import system modules
import?arcpy
from?arcpy?import?env
?
# Set workspace
env.workspace = "C:/data"
?
# Set local variables
out_folder_path = "C:/output"?
out_name = "folder1"
?
# Execute CreateFolder
arcpy.CreateFolder_management(out_folder_path, out_name)
?
如果想創建文件地理數據庫,則需調用“CreateFileGDB”工具。
CreateFileGDB_management (out_folder_path, out_name, {out_version})
n?out_folder_path:將創建文件地理數據庫的位置(文件夾)。數據類型為Folder
n?out_name:要創建的文件地理數據庫的名稱。數據類型為String?
例3-11 ?CreateFileGDB
# Import system modules
import?arcpy
?
# Set local variables
out_folder_path = "C:/output"?
out_name = "fGDB.gdb"
?
# Execute CreateFileGDB
arcpy.CreateFileGDB_management(out_folder_path, out_name)
?
2、創建FeatureClass
“要素類”工具集提供了一組專用于執行基本要素類管理(包括創建、追加、整合和更新多個要素類)的工具。
要素類是具有相同幾何類型的要素的集合:點、線、多邊形或注記。 要素類可與其他要素類一起存儲在地理數據庫中的要素數據集內,也可作為獨立要素類存儲在地理數據庫中。此外,要素類還可存儲在 shapefile 中,或者與具有不同幾何的其他要素類一起存儲在 coverage 中。
要想在 ArcSDE 地理數據庫、文件地理數據庫或個人地理數據庫中創建空要素類;在文件夾中此工具將創建 shapefile。要使用“CreateFeatureclass”工具。
CreateFeatureclass_management (out_path, out_name, {geometry_type}, {template}, {has_m}, {has_z}, {spatial_reference}, {config_keyword}, {spatial_grid_1}, {spatial_grid_2}, {spatial_grid_3})
n?out_path:創建輸出要素類所在的 ArcSDE 地理數據庫、文件地理數據庫、個人地理數據庫或文件夾。此工作空間必須已經存在。數據類型為:Workspace;Feature Dataset
n?out_name:要創建的要素類的名稱。數據類型為String
n?geometry_type:要素類的幾何類型,可設置為“POINT”、“MULTIPOINT”、“POLYGON”、 “POLYLINE”。數據類型為String
?
例3-12 ?CreateFeatureclass
# Name: CreateFeatureclass_Example2.py
# Description: Create a feature class to store the gnatcatcher habitat zones
?
# Import system modules
import?arcpy
from?arcpy?import?env
?
# Set workspace
env.workspace = "C:/data"
?
# Set local variables
out_path = "C:/output"
out_name = "habitatareas.shp"
geometry_type = "POLYGON"
template = "study_quads.shp"
has_m = "DISABLED"
has_z = "DISABLED"
?
# Use Describe to get a SpatialReference object
spatial_reference = arcpy.Describe("C:/workspace/studyarea.shp").spatialReference
?
# Execute CreateFeatureclass
arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, template, has_m, has_z, spatial_reference)
?
3、添加Field
“字段”工具集包含一組用于向要素類表添加字段或對該表中的字段進行更改的工具。字段是表中的列;每個字段包含一個屬性的多個值。表中可包含任意數量的字段。可指定字段設置,如字段類型和可存儲在字段中的最大數據量。
添加字段是指向表或要素類表、要素圖層、柵格目錄和/或帶屬性表的柵格添加新字段。“AddField”工具。
AddField_management (in_table, field_name, field_type, {field_precision}, {field_scale}, {field_length}, {field_alias}, {field_is_nullable}, {field_is_required}, {field_domain})
n?in_table:要添加指定字段的輸入表。該字段將被添加到現有輸入表,并且不會創建新的輸出表。可將字段添加到 ArcSDE 的要素類、文件或個人地理數據庫的要素類、coverage、shapefile、柵格目錄、獨立表、帶屬性表的柵格和/或圖層。
n?field_name:要添加到輸入表的字段的名稱。
n?field_type:在創建新字段時所使用的字段類型。
??TEXT —名稱或其他文本特性。
??FLOAT —特定范圍內含小數值的數值。
??DOUBLE —特定范圍內含小數值的數值。
??SHORT —特定范圍內不含小數值的數值;編碼值。
??LONG —特定范圍內不含小數值的數值。
??DATE —日期和/或時間。
??BLOB —影像或其他多媒體。
??RASTER —柵格影像。
??GUID —GUID 值
?
例3-12 ?AddField
# Name: AddField_Example2.py
# Description: Add a pair of new fields to a table
?
# Import system modules
import?arcpy
from?arcpy?import?env
?
# Set environment settings
env.workspace = "C:/data/airport.gdb"
?
# Set local variables
inFeatures = "schools"
fieldName1 = "ref_ID"
fieldPrecision = 9
fieldAlias = "refcode"
fieldName2 = "status"
fieldLength = 10
?
# Execute AddField twice for two new fields
arcpy.AddField_management(inFeatures, fieldName1, "LONG", fieldPrecision, "", "",
??????????????????????????fieldAlias, "NULLABLE")
arcpy.AddField_management(inFeatures, fieldName2, "TEXT", "", "", fieldLength)
?
?
4、完整程序
?
?
?
第4章 ArcPy中的函數和類
在 ArcPy 中,所有地理處理工具均以函數形式提供,但并非所有函數都是地理處理工具。除工具之外,ArcPy 還提供多個函數以更好地支持使用 Python 的地理處理工作流。函數可用于列出某些數據集、檢索數據集的屬性、在將表添加到地理數據庫之前驗證表名稱或執行其他許多有用的地理處理任務。這些函數只能從 ArcPy 獲得,而不能作為 ArcGIS 應用程序中的工具,因為它們專為 Python 工作流所設計。
函數的一般形式與工具類似;它接受參數(可能需要也可能不需要)并返回某些結果。非工具函數的返回值可以為各種類型 - 從字符串到地理處理對象。工具函數會始終返回結果對象,并提供地理處理消息支持。
工具參數通常使用簡單文本字符串來定義。數據集名稱、路徑、關鍵字、字段名稱、容差、域名可通過帶引號的字符串指定。對于需要多個屬性的較復雜參數,難以使用簡單字符串對其進行定義。這種情況下可使用類(例如,SpatialReference、ValueTable 和 Point 類)來定義這些字符串,而不必輸入復雜的長文本字符串。
?
4.1 列出數據并描述數據
1、ListWorkspaces
列出所設置的工作空間中的所有工作空間。可以為工作空間名稱和工作空間類型指定搜索條件,從而限制所返回的列表。 必須先設置工作空間環境,之后才能使用多個列表函數。
ListWorkspaces ({wild_card}, {workspace_type})
n?wild_card :通配符,可限制返回的結果。如果未指定任何通配符,則會返回所有值。
n?workspace_type :工作空間類型,有六種可能。?
??Access —Only personal geodatabases will be selected.
??Coverage —Only coverage workspaces will be selected.
??FileGDB —Only file geodatabases will be selected.
??Folder —Only shapefile workspaces will be selected.
??SDE —Only ArcSDE databases will be selected.
??All —All workspaces will be selected. (默認值為 All)
?
import arcpy
?
arcpy.env.workspace = "c:/data"
?
# List all file geodatabases in the current workspace
workspaces = arcpy.ListWorkspaces("*", "FileGDB")
?
for workspace in workspaces:
????# Compact each geodatabase
????arcpy.Compact_management(workspace)
?
4.2 使用Cursor
(對FeatureClass進行遍歷、增、刪改)
4.3 Geometry及其構建
(Point及Geometry、PointGeometry、Multipoint、Polyline 或 Polygon)
?
4.4 消息和錯誤處理
?
4.5 示例:添加Feature至FeatureClass
?
?
?
第5章 數據訪問模塊
數據訪問模塊 (arcpy.da) 是一個用于處理數據的 Python 模塊。通過它可控制編輯會話、編輯操作、改進的游標支持(包括更快的性能)、表和要素類與 NumPy 數組之間相互轉換的函數以及對版本化、復本、屬性域和子類型工作流的支持。
?
5.1 NumPy 數組
Numerical Python (NumPy) 是一個用于在 Python 中進行科學計算(包括支持功能強大的多維數組對象)的基礎包。NumPy 為用戶提供了執行復雜數學運算的途徑,而且在 9.2 版本之后已作為 ArcGIS 軟件安裝過程的一部分。Python NumPy 數組專用于處理大型數組。很多現有 Python 函數都是為了處理 NumPy 數組而創建,而 NumPy 數組是包含在 Python 的 SciPy 科學計算包中的最著名數組。
要將 NumPy 數組轉換為表和要素類,數組必須為結構化數組。結構化數組包括用來在 ArcGIS 表和要素類中將數據映射至字段的多個字段(或結構體)。
import?numpy
?
array = numpy.array([(471316.383, 5000448.782), (470402.493, 5000049.216)], numpy.dtype([('X', '>f8'),('Y', '>f8')]))
一經創建,結構化 NumPy 數組即可轉換為要素類或表。
創建數組的 dtype 取決于輸入表的字段類型或要素類。
| 字段類型 | NumPy dtype |
| 單精度 | numpy.float32 |
| 雙精度 | numpy.float64 |
| SmallInteger | numpy.int32 |
| 整型 | numpy.int32 |
| OID | numpy.int32 |
| GUID | <U64 |
| 字符串 | <u1、<u10 等 |
?
numpy提供了loadtxt函數進行文本文件加載,該功能不僅能實現數據加載,而且能按照dtype將數據按照要求進行標準化,如dtype為結構化數據類型,則加載后的數據直接為結構化數組。
?
numpy.loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)
loadtxt函數要求文本文件每一行必須包含同樣數量的值。
?
fname?: 文件或字符串
將要讀取的文本文件,或者該文件的文件名
dtype?: 數據類型, 可選參數
結果數組的數據類型,缺省情況下為float。若其為結構化數據,結果數組將是1維數組,文本文件中的每一行將成為該數據中的一個元素。此時,文本文件中數據的列數必須與數據類型中的字段數相同。
comments?: 字符串, 可選參數
用于標識注釋文字的字符,缺省值為‘#’。
delimiter?: 字符串, 可選參數
用于分隔文本文件數值的分隔符,缺省情況下為空格,根據文本文件中數據格式,可以設置為諸如‘,’等。
skiprows?: 整數, 可選參數
讀取文件時跳過文件頭上的skiprows?行,缺省值為 0。
usecols?: 數值序列, 可選參數
Which columns to read, with 0 being the first. For example, usecols = (1,4,5)?will extract the 2nd, 5th and 6th columns. The default, None, results in all columns being read.
?
NumPyArrayToFeatureClass將?NumPy 結構化數組轉換為點要素類。
NumPyArrayToFeatureClass (in_array, out_table, shape_fields, {spatial_reference})
?
?
| 參數 | 說明 | 數據類型 |
| in_array | NumPy 結構化數組。 數組必須包含字段名稱和?numpy dtype。 | NumPyArray |
| out_table | The output point feature class to which the records from the NumPy array will be written. | String |
| shape_fields [shape_fields,...] | A list (or tuple) of field names used to create the feature class' geometry. Coordinates are specified in the order of x, y, z, and m. z-coordinate and m-value fields are optional. Assuming field names of x, y, z, and m in a numpy array, feature classes could be constructed as below. ? | String |
| spatial_reference | 要素類的空間參考。可以使用SpatialReference?對象或等效字符串來指定。 (默認值為?None) | SpatialReference |
?
shape_fields使用示例:
?
import arcpy
?
# Create a feature class with x,y fields
arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y"))
?
# Create a feature class with x,y,z fields
arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "z"))
?
# Create a feature class with x,y,m fields
arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "", "m"))
?
# Create a feature class with x,y,z,m fields
arcpy.da.NumPyArrayToFeatureClass(array, fc, ("x", "y", "z", "m"))
5.2 da中的Cursor
?
5.3 編輯會話與事務
?
5.4 示例:將包含點的坐標信息的數據文件轉換為FeatureClass
(在ArcMap中,能夠調用File->add x,y data完成該項功能)
數據文件內容為:
0.000,0.500
1.000,1.500
2.000,2.500
3.000,3.500
4.000,4.500
5.000,5.500
6.000,6.500
7.000,7.500
8.000,8.500
9.000,9.500
10.000,10.500
11.000,11.500
?
使用Python編寫以下程序:
import numpy
import arcpy
dtype=[('x', '>f8'), ('y', '>f8')]
coords=numpy.loadtxt("d:\\coords.txt",dtype,delimiter=",")
?
此時,coords是讀入數據文件的內容,即按照dtype的樣式,將數據文件的數據描述為形式為x,y的坐標對。
array([(0.0, 0.5), (1.0, 1.5), (2.0, 2.5), (3.0, 3.5), (4.0, 4.5),
???????(5.0, 5.5), (6.0, 6.5), (7.0, 7.5), (8.0, 8.5), (9.0, 9.5),
???????(10.0, 10.5), (11.0, 11.5)],
??????dtype=[('x', '<f8'), ('y', '<f8')])
?
out = "d:\\out.shp"
arcpy.da.NumPyArrayToFeatureClass(coords,out,("x","y"))
?
按照x,y坐標對,將coords輸出為d:\\out.shp。將其加載到ArcMap窗口,即可顯示坐標內容。
記住,loadtxt中要將dtype設置為正確的形式才能將數據正確讀入。上述數據在numpy中輸出方式如下:
numpy.savetxt("d:\\out.txt", coords, fmt="%.3f", delimiter=",")
?
若數據文件中包含有除x,y之外的信息,則需要重新構造dtype以適應數據文件中的記錄內容。
?
第6章 制圖模塊(arcpy.mapping)
6.1 arcpy.mapping 簡介
1、什么是 arcpy.mapping?
Arcpy.mapping 是作為 ArcPy 站點包一部分的一個 Python 腳本模塊。隨 ArcGIS for Desktop 一同安裝,并對所有許可均可用。其設計初衷主要是用于操作現有地圖文檔 (.mxd) 和圖層文件 (.lyr) 的內容。此外,還提供自動執行導出和打印的函數。Arcpy.mapping 可用于自動執行地圖生產;它擴展了數據驅動頁面的功能,同時,因其包含導出至 PDF 文檔、創建和管理 PDF 文檔的函數,而為構建完整地圖冊所必需。最后,可將 arcpy.mapping 腳本發布為地理處理服務,并將腳本功能提供給 Web 應用程序。
通過描述 arcpy.mapping 執行的一些方案來了解其功能將會更容易些。以下是 arcpy.mapping 腳本可完成的眾多方案中的一小部分:
n?創建有關地圖文檔中所含信息(如數據框坐標系、圖層數據源、數據源損壞的圖層或布局元素位置)的報告。
n?更新、修復或替換地圖文檔或圖層文件中的圖層數據源。
n?更新圖層符號系統而無需實際打開地圖文檔。
n?查找并替換文件夾內所有地圖文檔中的文本字符串。
n?將地圖文檔保存至之前的 ArcGIS 版本以便分發。
n?更新地圖文檔元數據(例如,關鍵字、摘要和描述)。
n?使用地圖導出命令批量創建地理數據,例如由數據框中要素列表驅動的一系列 GeoTIFF 圖像。
n?自動創建和管理要通過 ArcGIS for Server 發布的地圖服務。
n?構建多種 PDF 地圖冊:
??含標題頁、多個地圖頁面以及任意數量含輔助內容(如表格式報表和聯系人列表)的附加頁面的專題或時態地圖冊。
??基于數據驅動頁面輸出的參考地圖冊。
2、構建 arcpy.mapping 的初衷
Arcpy.mapping 專門面向專業的 GIS 分析人員(以及開發人員)而構建。以前,以上列出的方案必須使用 ArcObjects 來完成,然而事實多次證明,對于普通 GIS 專業人員而言,該編程環境非常難學。Arcpy.mapping 是一種粗粒度對象模型,也即函數的設計原則是單個 arcpy.mapping 函數可代替多行 ArcObjects 代碼。以下這個簡單示例顯示了如何使用 arcpy.mapping 通過僅僅兩行代碼引用現有地圖文檔并將其導出至 PDF 文檔。
>>> mxd = arcpy.mapping.MapDocument("C:/Project/Watersheds.mxd")
>>> arcpy.mapping.ExportToPDF(mxd, "C:/Project/Output/Watersheds.pdf")
?
Arcpy.mapping 不是 ArcObjects 的替代品,而是作為其支持的不同情景的一種備選方案。對于細粒度開發和應用程序自定義來說,ArcObjects 仍是必不可少的,而 arcpy.mapping 主要用于自動處理現有地圖文檔和圖層文件的內容。
6.2 在ArcMap環境中使用arcpy.mapping
1、Python 窗口
要學習 arcpy.mapping,首先應從 Python 窗口著手。Python 窗口是 ArcMap 框架的一部分,它所提供的自動完成功能使您能夠輕松讀取函數參數的名稱和順序。以下步驟顯示了如何設置 Python 窗口,以實現令人滿意的最終用戶體驗并使其與本文檔中的屏幕截圖一致。
步驟:
n?在 ArcMap 中打開一個新的空地圖文檔。
n?單擊地理處理 > Python。
n?在 Python 窗口的代碼窗格(具有 >>> 字符)中單擊。會有一些幫助文本出現在右側的幫助窗格中。
n?右鍵單擊代碼窗格并選擇幫助放置 > 底部。幫助即會出現在代碼窗格的下方。
n?現在輸入以下語句(請注意,Python 區分大小寫):
>>> arcpy.mapping.ExportToPDF(
?
Python 窗口應如下圖所示。第一個必需參數稱為 map_document,處于高亮顯示狀態。如果輸入一個逗號,則第二個參數會變為高亮顯示。只有兩個必需參數:map_document 和 out_pdf。可選參數使用大括號 {} 括起。
n?右鍵單擊代碼窗格,然后單擊全部清除以清除代碼窗格。
2、引用現有地圖文檔
通常,通過 arcpy.mapping 腳本執行的首要操作之一即引用要處理的現有地圖文檔 (.mxd) 或圖層文件 (.lyr)。
引用地圖文檔的方法有兩種。第一種方法是通過提供 .mxd 文件的路徑在磁盤上進行引用。如果要構建將在 ArcGIS 環境外部運行的腳本,則必須使用地圖文檔的路徑對其進行引用。第二種方法是引用當前加載至 ArcMap 應用程序中的地圖文檔(在這種情況下,指的是 untitled.mxd)。在 ArcMap 內的 Python 窗口中進行操作時,引用當前加載的地圖文檔十分方便,因為在應用程序中可直接看到對地圖文檔執行的更改。以下步驟將介紹如何引用當前加載至 ArcMap 中的地圖文檔。
步驟:
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER:
>>> mxd = arcpy.mapping.MapDocument("CURRENT")
?
MapDocument 函數為稱為 mxd 的變量返回一個 MapDocument 對象參考。字符串 CURRENT 是用于引用當前已加載地圖文檔的關鍵字。也可以在此處提供地圖文檔的路徑來代替 CURRENT。
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER:
>>> mxd.author = "YOUR NAME GOES HERE"
?
將打開 MapDocument 對象具有一個稱為 author 的屬性。只需將其值設置為字符串即可。
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER:
>>> mxd.save()
?
由于該地圖文檔未保存,因此會出現一個對話框提示您提供路徑和文件名。save() 方法不具有任何參數,但由于它是一個方法,因此仍必須加上左、右括號。事實上,如果要處理的是已經存在的地圖文檔,并不需要處理彈出的保存對話框。要驗證地圖文檔的保存位置,請嘗試以下操作:
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER:
>>> print mxd.filePath
?
代碼窗格中會打印出路徑:
3、將圖層文件添加到地圖文檔中
接下來要做的是向地圖文檔中添加圖層文件 (.lyr)。此操作可通過 arcpy.mapping AddLayer 函數完成。步驟如下:
在 Python 窗口中,輸入以下內容:
>>> arcpy.mapping.AddLayer(
?
自動完成功能顯示有兩個必需參數。第一個參數是對地圖文檔中數據框的引用。第二個參數是對要添加的圖層的引用。該圖層可以是地圖文檔或圖層文件中的圖層。第三個參數是可選參數,用于控制內容列表中圖層的放置。由于這是第一個也是僅有的一個圖層,可以忽略第三個參數并使用其默認值。
添加該圖層之前,需要引用相應的對象。首先將引用數據框。
在 Python 窗口中,輸入以下內容,完成輸入后按 ENTER:
>>> df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
?
ListDataFrames 函數需要引用地圖文檔和通配符過濾器(可選)。可以提供數據框的全名以進行搜索。還可以輸入類似 "lay*" 的內容。
所有 ArcPy 列表函數將返回 Python 列表對象。在列表中返回的這些項目從零開始,這表示列表中的第一個項目的索引值為 0,第二個項目為 1,依此類推,一直到 n-1。由于要讓 df 變量引用 DataFrame 對象而不是 Python 列表對象,因此必須在函數后追加索引號。在函數末尾追加 [0] 會返回列表中的第一個數據框。在這里,將返回列表中僅有的數據框。如果在地圖文檔中對數據框進行唯一命名并使用相應的通配符值分隔項目,應始終返回僅有一個項目的列表,而索引 [0] 將會起到作用。如果在地圖文檔中有兩個數據框,并且不想通過 wildcard 值引用第二個數據框,則需要在函數末尾加上 [1],例如,df2 = arcpy.mapping.ListDataFrames(mxd)[1]。
接下來,在使用 AddLayer 函數之前需要引用圖層文件。引用圖層文件的過程與通過提供 .mxd 完整路徑引用圖層文檔的過程相同,所不同的是需使用 Layer 函數而非 MapDocument 函數。
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER。注意:路徑很可能與以下示例不同。
>>> lyrFile = arcpy.mapping.Layer(r"C:\Project\data\Rivers.lyr")
?
在以上步驟中,創建了對現有圖層文件的引用,該引用存儲在名為 lyrFile 的變量中。
請注意,路徑字符串的前面有一個小寫 r。這是 Python 中的特殊字符,代表 raw。這表示要按原樣解釋該字符串并忽略字符串中的其他任何特殊字符。
所有必需的變量參考即已創建完畢。接下來將使用 AddLayer 函數將圖層文件添加至當前地圖文檔。
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER:
>>> arcpy.mapping.AddLayer(df, lyrFile)
?
該圖層應已添加到內容表和數據視圖中,Python 窗口應如下圖所示:
4、將地圖文檔導出至 PDF
將地圖文檔導出至 PDF 極其容易,僅需要單行代碼。在教程開始處已看過 ExportToPDF 函數的語法。現在將完成該語法。步驟如下:
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER。路徑很可能與以下示例不同。
>>> arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Doc1.pdf")
?
有很多參數與 ArcMap 中的設置一致。僅有兩個必需參數:map_document 和 out_pdf。
已在指定位置創建了 PDF 文檔,Python 窗口應如下圖所示:
?
5、使用 ListLayers 函數引用圖層,并更改圖層屬性
有許多屬性和方法可用于處理地圖文檔中的圖層。之前已將圖層文件中的圖層添加至地圖文檔。創建的名為 lyrFile 的變量即引用添加至地圖文檔的圖層。使用此變量,可修改已添加圖層的某些屬性。步驟如下:
在 Python 窗口中,輸入以下內容:
>>> lyrFile.
?
輸入點之后,請注意 Layer 對象上的所有不同屬性和方法。使用 lyrFile 變量,可更改地圖文檔中的這些屬性,在調用 save() 方法時,會將這些更改保存至磁盤上的圖層文件 (.lyr)。
并非所有可能的圖層屬性都可用于 Layer 對象,只有那些對于地圖自動化情景最常見的圖層屬性才可用。可通過創作圖層文件中的屬性以及使用 arcpy.mapping UpdateLayer 函數來修改更多屬性。
大多數情況下,地圖文檔中已經具有圖層。在以下這些步驟中,將假定圖層已在地圖文檔中,再次對其進行引用。在地圖文檔中引用圖層與引用數據框非常相似。
在 Python 窗口中,按 Backspace 刪除當前文本,輸入以下內容,然后按 ENTER:
>>> lyr = arcpy.mapping.ListLayers(mxd)[0]
?
ListLayers 函數需要提供地圖文檔參考。該函數有兩個附加參數:一個用于執行通配符搜索,另一個用于指定數據框。由于只有一個圖層和一個數據框,因此不必提供其他參數。同樣,語句結尾仍需要加上 [0] 索引值,以便返回 Layer 對象而不是 Python 列表對象。
使用新的 lyr 變量,可更新某些圖層屬性。
在 Python 窗口中輸入以下兩行,在每行后面按 ENTER:
>>> lyr.name = "Some New Name"
>>> lyr.visible = False
?
運行后不會立即看到更改。不是所有的屬性更改或方法都會自動更新應用程序。這是有意設計成這樣的,目的在于避免應用程序經常刷新。使用 CURRENT 引用 ArcMap 中當前加載的地圖文檔時,有時需要刷新內容列表或活動視圖(數據視圖或布局視圖)。
在 Python 窗口中輸入以下兩行,在每行后面按 ENTER:
>>> arcpy.RefreshTOC()
>>> arcpy.RefreshActiveView()
?
內容列表和數據視圖將刷新。注:如果在 ArcMap 外部運行獨立腳本,則不需要這些附加函數。
Python 窗口應如下圖所示:
?
6、更改數據框范圍
在本節中,將更改數據框范圍以使其與所選要素的范圍相符。在腳本中,通常使用類似 SelectlayerByAttribute 的函數來完成此操作。為了簡化操作,您將以圖形的方式選擇一些要素。首先需要使用 Python 再次開啟圖層可見性。步驟如下:
在 Python 窗口中輸入以下三行,在每行后面按 ENTER:
>>> lyr.visible = True
>>> arcpy.RefreshTOC()
>>> arcpy.RefreshActiveView()
?
在 ArcMap 中,以圖形方式選擇圖層中的一個或多個要素。然后,創建存儲所選要素范圍的變量,并將該范圍應用于所引用的 DataFrame 對象的 extent 參數。
在 Python 窗口中輸入以下兩行,在每行后面按 ENTER:
>>> lyrExtent = lyr.getSelectedExtent()
>>> df.extent = lyrExtent
?
Python 窗口應如下圖所示:
?
7、將地圖文檔(再次)導出至 PDF
將再次導出至 PDF。這次將另外創建一個 PDF 文檔,該文檔最終將與第一個文檔一起追加到新文檔中。步驟如下:
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER。提供的路徑很可能與以下示例不同。
>>> arcpy.mapping.ExportToPDF(mxd, r"C:\Project\Doc2.pdf")
?
Python 窗口應如下圖所示:
?
新建 PDF 文檔并追加兩頁
arcpy.mapping 模塊包含一些 PDF 文檔管理函數,這對于創建多頁文檔十分理想。例如,完整的地圖冊除包含數據驅動頁面生成的標準參考地圖頁面以外,往往還包含一些其他頁面。arcpy.mapping 的使用對于構建完整地圖冊來說是必要的步驟。
?
教程本部分將模擬多頁報告的創建過程。首先要新建一個 PDF 文檔,然后追加在先前步驟中創建的 PDF。假設這些 PDF 文檔只是構成地圖冊的單個文檔。例如,Doc1.pdf 可以是表示標題頁和內容列表等的多頁 PDF。第二個 PDF 文檔可以是將所有數據驅動頁面地圖頁面導出至單個多頁 PDF 的結果。
?
第一步是新建 PDF 文檔。
在 Python 窗口中輸入以下內容,完成輸入后按 ENTER:
>>> PDFdoc = arcpy.mapping.PDFDocumentCreate(r"C:\Project\Final.pdf")
?
稱為 PDFdoc 的變量引用內存中的 PDFDocument 對象。只有在保存并關閉文檔后,該變量才會存在于磁盤中。
在 Python 窗口中輸入以下三行,在每行后面按 ENTER:
>>> PDFdoc.appendPages(r"C:\Project\Doc1.pdf")
>>> PDFdoc.appendPages(r"C:\Project\Doc2.pdf")
>>> PDFdoc.saveAndClose()
?
前兩行分別將每個 PDF 追加至新建的 PDF 文檔中。最后一行是提交更改并在磁盤上創建最終 PDF。
已在指定位置創建了 PDF 文檔,Python 窗口應如下圖所示:
?
6.3 arcpy.mapping 指導原則
本節重點介紹了 arcpy.mapping 模塊的一些重要使用原則。還針對 arcpy.mapping API 設計提出了一些見解,并就不同情景給出了策略建議。
1、必須處理現有地圖文檔或圖層文件
arcpy.mapping 模塊的設計初衷是用于修改已存在的地圖文檔 (.mxd) 或圖層文件 (.lyr) 中的現有元素。也就是說,它旨在幫助實現現有要素處理的自動化,但不可用于創作新對象。設計的出發點并非想讓其成為 ArcObjects 的完全替代品,也不會將其用于為 ArcMap 界面中的所有按鈕、對話框、菜單選項或快捷菜單項創建函數、方法或屬性(這些功能由 ArcObjects 提供)。必須預先在 ArcMap 中認真創作一個含所有相應元素的地圖文檔或圖層文件,然后使用 arcpy.mapping 操作其內容。
以下提供一些 arcpy.mapping 應用的簡單示例:
n?替換圖層的數據源。
n?遍歷一系列數據框范圍,查找并替換文本值,然后將頁面布局導出至 PDF。
n?通過將 PDF 文檔追加到最終產品的方式構建完整的地圖冊。
注:可對現有地圖文檔或圖層文件執行更改,然后使用 MapDocument 或 Layer 對象上的 saveACopy 方法將這些更改保存至一個新文件。
2、添加圖層并處理模板地圖文檔
arcpy.mapping 不允許創作全新的地圖文檔。按照設計,它也不提供更改現有地圖文檔的頁面大小或方向的功能。解決方案很簡單。預先創作含各種相應元素、頁面大小、方向等內容的模板地圖文檔,然后使用 arcpy.mapping 操作其內容。
常見的一種情景是創作一個不含圖層的模板地圖文檔,然后使用 arcpy.mapping AddLayer、AddLayerToGroup 或 InsertLayer 函數向地圖文檔添加圖層。如果圖例元素已事先創作為自動將新項目添加到圖例,則會自動出現圖例項。
另一種常見情景涉及含對開頁面的地圖冊。左側和右側頁面各偏移一定的距離,以便為裝訂留出空間。該情景需要有兩個地圖文檔:一個是左側頁面,另一個是右側頁面。使用 Arcpy.mapping 腳本邏輯將所有單個頁面合到一起,形成最終的多頁 PDF 輸出。請參閱創建包含對開頁面的地圖冊,該文檔詳細介紹了此情景并提供了 arcpy.mapping 代碼示例。
3、創作任何對象時均使用唯一名稱
為便于引用地圖元素(例如,數據框、圖層、布局元素或表)以對其訪問和修改,地圖元素必須具有唯一名稱。許多 arcpy.mapping 列表函數(例如 ListDataFrames、ListLayers、ListLayoutElements 和 ListTableViews)都含有通配符參數,允許您對名稱屬性進行過濾。這些列表函數始終會返回一個 Python 列表對象。為引用 Python 列表中的地圖元素,您可以通過循環遍歷列表,也可以在函數末尾追加一個索引號。如果使用通配符并指定唯一名稱,則返回的 Python 列表將始終包含一個項目,并可使用索引值 0 對其進行引用。
?
mxd = arcpy.mapping.MapDocument("CURRENT")
riverLyr = arcpy.mapping.ListLayers(mxd, "Rivers")[0]
titleTxt = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT", "title")[0]
?
頁面布局元素有一個獨立屬性,稱為元素名稱。可在元素的屬性 對話框內的大小和位置 選項卡中對其進行設置。
?
數據框、圖層和表不像頁面布局元素那樣具有獨立的名稱屬性。它們的名稱基于內容列表中顯示的標注。理想情況下,將為同一地圖文檔內的所有數據框、圖層和表給定唯一名稱。如果出現需要有重復名稱又不能將二者混淆的情況,那么您需要創作地圖文檔以使用其他屬性進行區分。
以下代碼顯示了如何使用 Layer 對象的 description 屬性對數據框“County Maps”中具有相同名稱“Streets”的圖層進行區分的示例。
?
mxd = arcpy.mapping.MapDocument("C:/Project/Project.mxd")
df = arcpy.mapping.ListDataFrames(mxd, "County Maps")[0]
for lyr in arcpy.mapping.ListLayers(mxd):
??if lyr.name == "Streets":
?????if lyr.description == "1:10000":
????????lyr.visible = True
?????if lyr.description == "1:100000":
????????lyr.visible = False
?
4、創作額外布局元素并視需要將其移入和移出頁面布局
有時可能會遇到這種情況,您在創建地圖系列時,其中某些頁面具有附加地圖元素,例如,額外的數據框、附加圖片或文本元素等。這種情況下,您可以創作一個含所有可能布局元素的地圖文檔,然后根據需要使用 arcpy.mapping 腳本邏輯將這些元素移入和移出頁面,而不必專門針對這些情景創作獨立的地圖文檔。如果某個元素被移到頁面布局邊界以外,則不會將其打印或導出。
在以下示例中,結果布局將基于當前數據框比例顯示不同樣式的比例尺。如果比例大于 1:25,000,則比例尺單位將以米計。如果比例大于或等于 1:25,000,則比例尺單位將以千米計。
mxd = arcpy.mapping.MapDocument("C:/Project/Project.mxd")
m_scale = arcpy.mapping.ListLayoutElements(mxd, "MAPSURROUND_ELEMENT", "m scale bar")[0]
km_scale = arcpy.mapping.ListLayoutElements(mxd, "MAPSURROUND_ELEMENT", "km scale bar")[0]
df = arcpy.mapping.ListDataFrames(mxd, "Main DF")[0]
if df.scale < 25000:
??m_scale.elementPositionX = 5 #on the page
??km_scale.elementPostitionX = 15 #off the page
else:
??m_scale.elementPositionX = 15 #off the page
??km_scale.elementPostitionX = 5 #on the page
?
?
?
?
?
總結
以上是生活随笔為你收集整理的python笔记之ArcPy简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php在线模拟高考志愿,高考志愿模拟填报
- 下一篇: break在matlab中的用法,求助这