arcpy使用教程
arcpy使用教程
地理處理框架與arcpy
arcgis地理處理包括了查找工具、工具箱、地理處理環境、模型、python腳本、arcpy等一系列自動執行地理任務的框架。
arcpy是esri針對arcgis系列產品做的一個python站點包,它像膠水一樣黏貼了多個與arcgis應用程序相關的arc objects函數對象,我們甚至可以從幫助里找到toolbox每個工具箱的代碼原型。arcpy涉及地理數據分析、數據轉換、數據管理和地圖自動化等地理處理業務。使用python和arcpy的好處在于能夠將多個地理處理工具組織一起,匯聚成一個工作流,解決一些復雜的地理處理工作。并可以將工作流打包成地理處理包或者創建地理處理服務,與他人共享使用。
Python語言
Python語言包含了數字、字符串、語句、表達式、控制語句(條件語句、分支語句、循環語句)、對象、函數等基本要素以及編寫python語句的基本語法和范式。但是這些東西也沒必要面面俱到,因為光是《python library reference》,就有1000多頁,你得翻到什么時候。了解Python基本組成部分如字符串處理、路徑、控制語句、模塊、對象、函數和常用的編碼規范即可,邊用邊學。
本文按照arcpy編寫環境、站點包引入、地理處理工具函數和非工具函數、空間數據訪問和處理、創建地理處理工具、構建地理處理模型、共享地理處理服務講述arcpy使用的全過程。arcpy編寫環境、站點包引入、地理處理工具函數和非工具函數、空間數據訪問和處理是編寫arcpy腳本過程;創建地理處理工具、構建地理處理模型是制作腳本工具過程;共享地理處理服務是將腳本工具發布為地理處理服務過程。其中,地理處理函數和非工具函數涉及內容重復性過多,不能一一列舉,但它也是arcpy最豐富、最出彩的地方,之所以把地理處理工具函數和非工具函數放在數據訪問前面,也是因為如此。很多時候,地理處理函數,甚至都看不到專有數據驅動,就直接處理數據了。由于大部分地理處理過程需要用到python中的數據類型、函數、控制語句、類型等來連貫地理處理函數及數據處理過程,python相關內容也需補充的。
一、制作地理處理腳本
地理處理:arcpy編寫環境
在安裝arcgis的過程中,一般都會提示你安裝python2.7。這個其實就是在讓我們給arcpy安裝一個自帶的語言編寫環境。
以上是在arcgis安裝完成后,python2.7自帶的站點包,里面包含了諸如osgeo、numpy、pandas、pil等遙感影像處理常用的開源站點包。還有如pip這樣的Python 包管理工具,用于站點包的查找、下載、安裝、卸載等。arcpy工具包放在另外一個位置,該工具包從文件表現形式上有,arengine\acrserver\arceditor等等,arcpy工具包如下:
我們先來看一下python2.7的IDE工具,也就是用于引用arcpy的編寫工具:
倒數第二個圖標就是python的IDE,可以打開來看一下。
這個IDE以命令行的方式呈現,我們可以按照python語法鍵入一條語句。
import this?
python在引入包(python中特定的工具集)的時候,需要使用關鍵字import?引入,如下:
也可以打開arccatalog或者arcmap,交互式進入命令行窗口:
一般而言,如果使用命令行的方式,是我們寫一條語句,回車,程序執行一條語句,再寫一句,再回車,程序再執行一條語句。實際情況是我們總希望把一個完整的業務邏輯全部寫下來,讓程序一次性執行完畢,這時候我們就需要腳本。幾乎所有帶有.py的文件都可以是python的腳本 。我們可以使用記事本、notepad、python gui、pycharm、vs等工具編寫python語句,最后保存為.py的文件,然后使用編譯器python.exe解釋,在cmd中鍵入python xx.py后回車確認,得到運行結果。
前提你把python.exe路徑加入系統變量了
? ??
或者在IDE中,在new file 按鈕上新建文件,鍵入print("hellow the world")
一個簡單完整的地理處理腳本編寫過程如下:
地理處理:arcpy站點包引入
導入arcpy站點包語句為(imprt是python中導入站點包、函數、模塊的關鍵字,一般需要設置系統訪問路徑):
import arcpyarcpy以地理處理工具包、函數集、模塊、類等組織在一起,結構如下:
arcpy組成部分描述如下:
| ArcPy | ArcPy(通常稱為 ArcPy 站點包),為用戶提供了使用 Python 語言操作所有地理處理工具(包括擴展模塊)的接口,并提供了多種有用的函數和類,以用于處理和詢問 GIS 數據。使用 Python 和 ArcPy,可以開發出大量的用于處理地理數據的實用程序。 |
| ArcPy 模塊 | 模塊通常是一個包含函數和類的 Python 文件。ArcPy 由一系列模塊支持,包括數據訪問模塊?(arcpy.da)、制圖模塊?(arcpy.mapping)、ArcGIS Spatial Analyst 擴展模塊 模塊?(arcpy.sa) 以及?ArcGIS Network Analyst 擴展模塊 模塊?(arcpy.na)。 |
| ArcPy 類 | 類的作用類似于建筑設計藍圖。藍圖為如何創建事物提供了一個框架,類可用于創建對象,即通常所說的實例。ArcPy 類,如?SpatialReference?和?Extent類,通常用作地理處理工具參數設置的快捷方式,否則的話,這些參數會使用更加復雜的字符串。 |
| ArcPy 函數 | 函數是用于執行某項特定任務并能夠納入更大的程序的已定義功能。 在 ArcPy 中,所有地理處理工具均以函數形式提供,但并非所有函數都是地理處理工具。除工具之外,ArcPy 還提供多種函數來更好地支持 Python 地理處理工作流。函數(通常稱為方法)可用于列出某些數據集、檢索數據集的屬性、在將表添加到地理數據庫之前驗證表名稱,或執行其他許多有用的腳本任務。 |
如果需要用到包里的一部分類、對象、或者函數,可以寫為:
from arcpy import env
也可將類、對象、模塊進行標識(取名):
from arcpy import env? as myenv
myenv.workspace="c:/data"
arcpy站點包還包含了許多模塊,如自動化制圖模塊(arcpy.mapping) 和數據訪問模塊(arcpy.da),導入方式如下:
import arcpy.mapping
編寫python腳本前,需設置當前工作空間,如:
import arcpy?
arcpy.env.workspace="c:/data"
注:路徑表達方式一般有三種
斜杠:
"c:/data"
反斜杠:
"c:\\data"
特殊字符r:
r"c:\data"
“\”在編碼中需轉義,前面加r,直接按照原文意思輸出。
地理處理:地理處理工具函數和非工具函數
工具
地理處理工具是指arcgis軟件工具箱中工具的統稱,每個工具都會給出相應的圖形界面、使用幫助和arcpy語法和使用方式,比如矢量裁剪工具:
打開空間分析的裁剪工具圖形界面:
打開裁剪工具幫助:
裁剪工具語法結構:
Clip_analysis (in_features, clip_features, out_feature_class, {cluster_tolerance})
| 參數 | 說明 | 數據類型 |
| in_features | 要裁剪的要素。 | Feature Layer |
| clip_features | 用于裁剪輸入要素的要素。 | Feature Layer |
| out_feature_class | 待創建的要素類。 | Feature Class |
| cluster_tolerance (可選) | 所有要素坐標之間的最小距離以及坐標可以沿 X 和/或 Y 方向移動的距離。如果此值設置得較高,則數據的坐標精度將會較低;如果此值設置得較低,則數據的坐標精度將會較高。 | Linear unit |
裁剪工具腳本代碼:
地理處理工具以錘子狀的圖標形式呈現,有相關的圖形界面和代碼表現方式(如裁剪工具:arcpy.Clip_analysis()),我們在使用arcgis過程中經常用到工具箱,此處不詳細說,我們側重描述arcpy代碼部分。
確切的說,arcpy地理處理工具是一個python腳本函數,該類函數可以直接調用并進行相關地理處理。
一個完整的地理處理腳本包含函數名和調用參數。調用參數一般有輸入參數、輸出參數和附加參數。附加參數常常指處理過程中的設置條件,如上述的裁剪函數的附加參數是容差{cluster_tolerance}。在裁剪時,我們有可能需要設置裁剪的容差。很多時候,設置條件是默認選項,不需要進行設置。
地理處理工具腳本按照地理處理功能分類,有數據管理、數據轉換、地理編碼、地理分析、地理統計、服務器工具等大類和幾百個工具函數,應當在具體應用是細細體會。
地理處理工具腳本具體調用方式有兩種。
(1)按照命名方式逐層展開調用,工具箱和函數以點號隔開,如:
? ? ? ? ?arcpy.analysis.Clip()
(2)按照函數直接調用,函數和工具箱用_隔開,如:
? ? ? ? arcpy.Clip_analysis()
其中,analysis是Analysis Tools(分析工具)別名。很多時候我們記不住他們的名字,可以對著工具箱屬性查閱。。
非工具函數
正如官方描述所述:在 ArcPy 中,所有地理處理工具均以函數形式提供,但并非所有函數都是地理處理工具。除工具之外,ArcPy 還提供多種函數來更好地支持 Python 地理處理工作流。函數(通常稱為方法)可用于列出某些數據集、檢索數據集的屬性、在將表添加到地理數據庫之前驗證表名稱,或執行其他許多有用的腳本任務。函數比較多,具體用用時查詢。
| AcceptConnections | 地理數據庫管理 |
| AddDataStoreItem | 數據存儲 |
| AddError | 消息和錯誤處理 |
| AddFieldDelimiters | 字段 |
| AddIDMessage | 消息和錯誤處理 |
| AddMessage | 消息和錯誤處理 |
| AddReturnMessage | 消息和錯誤處理 |
| AddToolbox | 工具和工具箱 |
| AddWarning | 消息和錯誤處理 |
| AlterAliasName | 常規 |
| AsShape | 幾何 |
| CheckExtension | 許可授予和安裝 |
| CheckInExtension | 許可授予和安裝 |
| CheckOutExtension | 許可授予和安裝 |
| CheckProduct | 許可授予和安裝 |
| ClearEnvironment | 環境和設置 |
| Command | 常規 |
| CopyParameter | 獲取和設置參數 |
| CreateObject | 常規 |
| CreateGeocodeSDDraft | 發布 |
| CreateGPSDDraft | 發布 |
| CreateImageSDDraft | 發布 |
| CreateRandomValueGenerator | 常規 |
| CreateScratchName | 常規數據函數 |
| CreateSQLiteDatabase | 工作空間 |
| CreateUniqueName | 常規數據函數 |
| DecryptPYT | 工具和工具箱 |
| 描述 | 描述數據 |
| DisconnectUser | 地理數據庫管理 |
| EncryptPYT | 工具和工具箱 |
| Exists | 常規數據函數 |
| FromWKB | 幾何 |
| FromWKT | 幾何 |
| GetActivePortalURL | ArcGIS Online/Portal |
| GetArgumentCount | 獲取和設置參數 |
| GetIDMessage | 消息和錯誤處理 |
| GetImageEXIFProperties | 柵格 |
| GetInstallInfo | 許可授予和安裝 |
| GetLogHistory | 日志歷史 |
| GetMaxSeverity | 消息和錯誤處理 |
| GetMessage | 消息和錯誤處理 |
| GetMessageCount | 消息和錯誤處理 |
| GetMessages | 消息和錯誤處理 |
| GetPackageInfo | 打包 |
| GetParameter | 獲取和設置參數 |
| GetParameterAsText | 獲取和設置參數 |
| GetParameterCount | 獲取和設置參數 |
| GetParameterInfo | 獲取和設置參數 |
| GetParameterValue | 獲取和設置參數 |
| GetReturnCode | 消息和錯誤處理 |
| GetSeverity | 消息和錯誤處理 |
| GetSeverityLevel | 消息和錯誤處理 |
| GetSigninToken | ArcGIS Online/Portal |
| GetSystemEnvironment | 環境和設置 |
| GetUTMFromLocation | 空間參考和變換 |
| ImportToolbox | 工具和工具箱 |
| InsertCursor | 游標 |
| IsSynchronous | 工具和工具箱 |
| ListDatasets | 列出數據 |
| ListDataStoreItems | 數據存儲 |
| ListEnvironments | 環境和設置 |
| ListFeatureClasses | 列出數據 |
| ListFields | 列出數據 |
| ListFiles | 列出數據 |
| ListIndexes | 列出數據 |
| ListInstallations | 許可授予和安裝 |
| ListPortalURLs | ArcGIS Online/Portal |
| ListPrinterNames | 常規 |
| ListRasters | 列出數據 |
| ListSpatialReferences | 空間參考和變換 |
| ListTables | 列出數據 |
| ListToolboxes | 工具和工具箱 |
| ListTools | 工具和工具箱 |
| ListTransformations | 空間參考和變換 |
| ListUsers | 地理數據庫管理 |
| ListVersions | 列出數據 |
| ListWorkspaces | 列出數據 |
| LoadSettings | 環境和設置 |
| NumpyArrayToRaster | 柵格 |
| ParseFieldName | 字段 |
| ParseTableName | 常規數據函數 |
| ProductInfo | 許可授予和安裝 |
| RasterToNumPyArray | 柵格 |
| RefreshActiveView | 常規 |
| RefreshCatalog | 常規 |
| RefreshTOC | 常規 |
| RemoveDataStoreItem | 數據存儲 |
| RemoveToolbox | 工具和工具箱 |
| ResetEnvironments | 環境和設置 |
| ResetProgressor | 進度對話框 |
| SaveSettings | 環境和設置 |
| SearchCursor | 游標 |
| SetLogHistory | 日志歷史 |
| SetParameter | 獲取和設置參數 |
| SetParameterAsText | 獲取和設置參數 |
| SetProduct | 許可授予和安裝 |
| SetProgressor | 進度對話框 |
| SetProgressorLabel | 進度對話框 |
| SetProgressorPosition | 進度對話框 |
| SetSeverityLevel | 消息和錯誤處理 |
| TestSchemaLock | 常規數據函數 |
| UpdateCursor | 游標 |
| Usage | 常規 |
| ValidateDataStoreItem | 數據存儲 |
| ValidateFieldName | 字段 |
| ValidateTableName | 常規數據函數 |
地理處理:空間數據的訪問
通用性訪問
無論我們使用什么樣的工具,首先第一步就是訪問數據。空間數據的訪問既可以是軟件訪問,也可以是代碼方式訪問。在軟件方面,有如:arcgisd,mapinfo、QGIS、GRASS GIS uDig等,代碼庫方式訪問有arcpy、GDAL/OGR、Spectral Python、GeoPandas、GEOS等等。當然編碼語言本身也能訪問空間數據,但是我們需要很清楚地知道數據本身的結構(如python 中的open\read\write函數)。
按照存儲模型的不同,一般將空間數據分為矢量數據和柵格數據(你也可以按照維度把數據分為二維數據或者三維數據),兩種類型的數據(柵格數據包含影像數據)有著不同的訪問方式,即便是矢量數據或者柵格數據,也因為廠商或者標準的不一樣,也有著不同的訪問方式。如影像:tif,img,bmp,HDF等格式。相對而言,影像比較容易訪問,影像內部存儲順序一般比較規律:BSQ 、BIL、BIP,只要知道行列號,波段數目、像元深度,即可方便地訪問每個像元值,而矢量數據的關鍵性信息不僅有行列號、字段值,還需知道字段的數據類型、長度等等,需使用游標或者更加準確的說,使用sql語句進行訪問才行。慶幸的是制作arcpy代碼庫或者函數庫的編寫者們會考慮到單個函數使用的通用性,即便是不同的數據類型也希望封裝成一個函數進行訪問,我們在外部幾乎看不出數據類型的不同導致的訪問函數不一樣。
arcgis將各類數據看作是數據集,無論是矢量的、柵格的、數據庫、抑或是文件型的(文件夾)。其訪問方式全部封裝在列表函數中---list()。列表系列的函數有:
ListFiles--文件列表、
ListWorkspaces--工作空間列表、
ListDatasets--數據集列表、
ListFeatureClasses--要素類列表、
ListRasters--柵格列表、
ListTables--屬性表列表等等。
只要事先設置工作空間,即可將所有數據讀入列表中,而如果再配合arcpy的工具函數和循環語句,即可做大量的批處理工作。
import arcpy
from arcpy import env
env.workspace="c:/data"??
imgs=arcpy.ListRasters("","img")
for img in imgs:
? arcpy.BuildPyramids_management(img)
以上代碼就是為“data”文件夾下的所有img柵格數據創建金字塔。
使用列表函數可以輕松地將數據直接導入內存中,進而交給工具函數處理。
差異性訪問
矢量數據中,最出名的莫過于shapefile 文件了,其表現方式為:
- .shp - 存儲要素幾何的主文件;必需文件。
- .shx - 存儲要素幾何索引的索引文件;必需文件。
- .dbf - 存儲要素屬性信息的 dBASE 表;必需文件。
- .prj - 存儲坐標系信息的文件;由 ArcGIS 使用。
- .xml - ArcGIS 的元數據 - 用于存儲 shapefile 的相關信息。
- .sbn 和 .sbx - 存儲要素空間索引的文件。
- .fbn 和 .fbx - 存儲只讀 shapefile 的要素空間索引的文件。
- .ain 和 .aih - 存儲某個表中或專題屬性表中活動字段屬性索引的文件。
- .atx - .atx 文件針對各個 shapefile 或在 ArcCatalog 中創建的 dBASE屬性索引而創建。
- .ixs - 讀/寫 shapefile 的地理編碼索引。
- .mxs - 讀/寫 shapefile(ODB 格式)的地理編碼索引。
- .cpg - 可選文件,指定用于標識要使用的字符集的代碼頁。
從以上也可以看出,矢量數據有幾個基本組成部分:1、幾何要素、2、屬性表、3、空間坐標信息、4、地理編碼。
在其他矢量格式數據中都需要這四類信息,幾何要素用以表示圖形,屬性表用以表示屬性信息,空間坐標信息用以表示該矢量數據存在于那類空間坐標中,地理編碼用于幾何要素的空間定位。
因此,圍繞矢量數據的訪問,也就有著不同的訪問方式,或以幾何對象訪問(幾何圖形),或以游標訪問(屬性表),或以幾何對象的封裝屬性訪問(空間坐標信息、地理編碼),相對而言,矢量數據的訪問方式較為復雜。
(這里我們不討論矢量點、線、面的不同幾何類型)
柵格數據中,img表現方式為:
? ? ?img:索引文件,?
? ? ?rrd:金字塔文件,?
? ? ?ige:柵格數據。?
? ? ?rde:在某些情況下,金字塔文件(rrd)也會超過2GB,這時會創建rde文件來存儲這些信息
其中img文件像其他圖像格式的文件(如:bmp,tiff,hdf等)一樣,存有圖像一些文件頭信息,如:圖像的大小、波段、行列數,分辨率、是否壓縮、像素的行列數、位深等,還有空間坐標信息等,其基本組成部分有:1、柵格信息(R、G、B、NIR等)2空間坐標信息、3、波段、行列數、分辨率、位深
因此,柵格數據的訪問一般只是訪問柵格信息,其他的基本很少過問,雖然波段、行列數、分辨率、位深如此多的信息,但是它們都是相對單一的。
arcpy在解決以上的差異性問題時,提供的工具有:使用游標訪問矢量數據單個屬性項數據,使用numpy數組遍歷柵格數據單個柵格值。
矢量屬性訪問
游標是包含從要素類或表中獲取的一行或多行數據的內存對象。每行數據包含了數據源中每個字段中的屬性以及每個要素的幾何信息。游標可對表和要素類的數據進行搜索,增加,插入,更新以及刪除。arcpy.da提供了三個游標函數。
| SearchCursor() | SearchCursor | 只讀查看表或要素類數據 |
| InsertCursor() | InsertCursor | 向表或要素類插入行 |
| UpdateCursor() | UpdateCursor | 編輯或刪除表和要素類行 |
SearchCursor():用于在要素類或表上建立只讀游標。SearchCursor?可用于遍歷?Row?對象并提取字段值。可以使用 where 子句或字段限制搜索,并對結果排序。
語法
SearchCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})| 參數 | 說明 | 數據類型 |
| dataset | 包含要搜索行的要素類、shapefile 或表。 | String |
| where_clause | 用于限制在游標中返回的行的可選表達式。有關 where 子句和 SQL 語句的詳細信息,請參閱?構建 SQL 查詢。 | String |
| spatial_reference | 指定后,要素將使用提供的?spatial_reference?進行動態投影。 | SpatialReference |
| fields | 游標中包含以分號分隔的字符串字段。默認情況下,包含所有字段。 | String |
| sort_fields | 用于在游標中對行進行排序的字段。每個字段的升序和降序排列表示為?"field1 A;field2 B"?形式,A?表示升序,D?表示降序。 | String |
返回值
| 數據類型 | 說明 |
| Cursor | 可分發?Row?對象的?Cursor?對象。 |
列出 Counties.shp 的字段內容。游標按州名稱和人口進行排序。
InsertCursor():向要素類、shapefile 或表中插入行。InsertCursor?可返回一個分發?Row?對象的枚舉對象。
語法
InsertCursor (dataset, {spatial_reference})| 參數 | 說明 | 數據類型 |
| dataset | 將向其中插入行的表、要素類或 shapefile。 | String |
| spatial_reference | 在提供的?spatial_reference?中指定的坐標,并動態轉換到數據集的坐標系。 | SpatialReference |
返回值
| 數據類型 | 說明 |
| Cursor | 返回針對指定要素類、shapefile 或表的?Cursor?對象。 |
向表中插入 25 個新行。
UpdateCursor():創建一個用于更新或刪除指定要素類、shapefile 和表中的行的游標。該游標將數據鎖定保留至腳本完成或更新游標對象被刪除時。
語法
UpdateCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})| 參數 | 說明 | 數據類型 |
| dataset | 包含要更新或刪除行的要素類、shapefile 或表。 | String |
| where_clause | 用于限制在游標中返回的行的可選表達式。有關 where 子句和 SQL 語句的詳細信息,請參閱在查詢表達式中使用的元素的 SQL 參考。 | String |
| spatial_reference | 在提供的?spatial_reference?中指定的坐標,并動態轉換到數據集的坐標系。 | SpatialReference |
| fields | 游標中包含以分號分隔的字符串字段。默認情況下,包含所有字段。 | String |
| sort_fields | 用于在游標中對行進行排序的字段。每個字段的升序和降序排列表示為?"field1 A;field2 B"?形式,A?表示升序,D?表示降序。 | String |
返回值
| 數據類型 | 說明 |
| Cursor | 可分布?Row?對象的?Cursor?對象。 |
根據另一個字段值更新要素類中的字段值。
以上三個游標函數都返回一個游標對象,游標對象根據實際對象的改變而改變。
矢量幾何訪問
空間數據需要同時維護屬性表數據與圖形數據信息,圖形數據和屬性數據之間通過唯一的ID號進行對象內部關聯,涉及到空間數據更新時,一般是同時更新空間對象的屬性數據和圖形數據??臻g圖形對象定義了空間圖形的空間位置、形狀,空間圖形包含點、多點、線、面、多面體等多種空間圖形對象,空間圖形對象是空間拓撲、空間分析、空間幾何網絡構造的基礎,在創建空間幾何對象的時候,空間邊界、最小邊界多邊形、包含、相交、接觸、相離、合并等空間關系等對象或者方法得以繼承,可以直接使用空間圖形對象更新圖形信息,又因Arcpy調用了arcobject空間對象的方法,也可以使用圖形令牌訪問圖形信息,同時也可以使用游標方式對屬性數據和圖形數據進行同步更新。如果只需要圖形的某些特定屬性,利用圖形令牌訪問幾何屬性即可,操作比圖形對象訪問更加簡便,例如:SHAPE@XY 會返回一組代表要素質心的 x,y 坐標。
| SHAPE@ | 要素的幾何對象。 |
| SHAPE@XY | 一組要素的質心 x,y 坐標。 |
| SHAPE@TRUECENTROID | 一組要素的真正質心 x,y 坐標。 |
| SHAPE@X | 要素的雙精度 x 坐標。 |
| SHAPE@Y | 要素的雙精度 y 坐標。 |
| SHAPE@Z | 要素的雙精度 z 坐標。 |
| SHAPE@M | 要素的雙精度 m 值。 |
| SHAPE@JSON | 表示幾何的 esri JSON 字符串。 |
| SHAPE@WKB | OGC 幾何的熟知二進制 (WKB) 制圖表達。該存儲類型將幾何值表示為不間斷的字節流形式。 |
| SHAPE@WKT | OGC 幾何的熟知文本 (WKT) 制圖表達。其將幾何值表示為文本字符串。 |
| SHAPE@AREA | 要素的雙精度面積。 |
| SHAPE@LENGTH | 要素的雙精度長度。 |
使用幾何對象
import arcpy
feature_info = [[[1, 2], [2, 4], [3, 7]],
? ? ? ? ? ? ? ? [[6, 8], [5, 7], [7, 2], [9, 5]]]
features = []
for feature in feature_info:
? ? features.append(
? ? ? ? arcpy.Polygon(
? ? ? ? ? ? arcpy.Array([arcpy.Point(*coords) for coords in feature])))
arcpy.CopyFeatures_management(features, "c:/geometry/polygons.shp")
使用圖形令牌
import arcpy
feature_class = "c:/data/Hawaii.shp"cursor = arcpy.da.SearchCursor(feature_class, ["SHAPE@"])
for row in cursor:
? ? print("Number of Hawaiian islands: {0}".format(row[0].partCount))
? ? for island in row[0].getPart():
? ? ? ? print("Vertices in island: {0}".format(island.count))
? ? ? ? for point in island:
? ? ? ? ? ? print("X: {0}, Y: {1})".format(point.X, point.Y))
幾何數據、屬性數據一起插入
import arcpy
row_values = [('Anderson', (1409934.4442000017, 1076766.8192000017)),
? ? ? ? ? ? ? ('Andrews', (752000.2489000037, 1128929.8114))]
cursor = arcpy.da.InsertCursor("C:/data/texas.gdb/counties",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?("NAME", "SHAPE@XY"))
for row in row_values:
? ? cursor.insertRow(row)
del cursor
柵格數據訪問
import arcpy
arcpy.raster()
NumPy 數組是包含在 Python 的 SciPy 科學計算包中的最著名數組,很多現有 Python 函數都是為了處理 NumPy 數組而創建。
柵格可以使用 ArcPy 函數?RasterToNumPyArray?和?NumPyArrayToRaster?轉換為 NumPy 數組,也可以使用同樣的函數從這些數組反向轉換。您可能想要將 ArcGIS 柵格轉換為 NumPy 數組以:
用于處理柵格的 arcpy 函數
| RasterToNumPyArray | 將柵格轉換為 NumPy 數組。 |
| NumPyArrayToRaster | 將 NumPy 數組轉換為柵格。 |
語法
RasterToNumPyArray (in_raster, {lower_left_corner}, {ncols}, {nrows}, {nodata_to_value})| 參數 | 說明 | 數據類型 |
| in_raster | 要轉換為 NumPy 數組的輸入柵格。 | Raster |
| lower_left_corner | 可從?in_raster?中的左下角提取處理塊以轉換為數組。x 值和 y 值采用地圖單位。若未指定值,則將使用輸入柵格的原點。 (默認值為 None) | Point |
| ncols | in_raster?中要轉換為 NumPy 數組的?lower_left_corner?中的列數。 若未指定值,則將使用輸入柵格的列數。 (默認值為 None) | Integer |
| nrows | in_raster?中要轉換為 NumPy 數組的?lower_left_corner?中的行數。 若未指定值,則將使用輸入柵格的行數。 (默認值為 None) | Integer |
| nodata_to_value | 在生成的 NumPy 數組中分配?in_raster?NoData 值的值。 若未指定值,則將使用?in_raster?的 NoData 值。 (默認值為 None) | Variant |
將柵格數據轉換為 NumPy 數組旨在計算整個柵格行中的像元值的百分比。然后,將會創建一個新的柵格數據。
只要將柵格數據轉換成為NumPy矩陣數組,那么遙感影像的分割、分類、聚類、機器學習等都將成為可能。它內置有很多數學運算函數,支持大量高級的維度數組與矩陣運算,是大量機器學習框架的基礎庫。它通常與SciPy一起用于科學計算,某種程度上可以取代matlab。
SciPy模塊組成:
| scipy.cluster | 矢量量化 / K-均值 |
| scipy.constants | 物理和數學常數 |
| scipy.fftpack | 傅里葉變換 |
| scipy.integrate | 積分程序 |
| scipy.interpolate | 插值 |
| scipy.io | 數據輸入輸出 |
| scipy.linalg | 線性代數程序 |
| scipy.ndimage | n維圖像包 |
| scipy.odr | 正交距離回歸 |
| scipy.optimize | 優化 |
| scipy.signal | 信號處理 |
| scipy.sparse | 稀疏矩陣 |
| scipy.spatial | 空間數據結構和算法 |
| scipy.special | 任何特殊數學函數 |
| scipy.stats | 統計 |
元數據訪問(或者說描述性數據訪問)
地理信息數據類型多種多樣,每種數據類型都有特定的屬性,在實際使用過程中常常需要事先知道這些信息。arcpy中的describe函數就可以很好的實現這一點。describe函數可以識別很多數據集的類型,包括、要素類、要素數據集、數據庫、柵格數據、柵格數據集、鑲嵌數據集等等,同時,它返回一個多屬性的describe對象,這個describe對象是動態的,它隨著輸入對象的改變而改變。
語法
Describe (value, {datatype})| 參數 | 說明 | 數據類型 |
| value | 要描述的指定數據元素或地理處理對象。 | String |
| datatype | 數據的類型。僅當存在命名沖突(例如,如果地理數據庫包含同名的要素數據集 (FeatureDataset) 和要素類 (FeatureClass))時需要此項。在這種情況下,數據類型將用于確定要描述的數據集。 (默認值為 None) | String |
返回值
| 數據類型 | 說明 |
| Describe | 返回的對象屬性中包含被描述對象的詳細信息。某些返回的對象屬性會包含文本值或對象。 |
Describe?對象屬性
| 屬性 | 說明 | 數據類型 |
| baseName (只讀) | 文件基本名稱 | String |
| catalogPath (只讀) | 數據路徑 | String |
| children (只讀) | 子元素列表 | Describe |
| childrenExpanded (只讀) | 指示子元素是否已擴展 | Boolean |
| dataElementType (只讀) | 元素的元素類型 | String |
| dataType (只讀) | 元素類型 | String |
| extension (只讀) | 文件擴展名 | String |
| file (只讀) | 文件名稱 | String |
| fullPropsRetrieved (只讀) | 指示是否已檢索完整屬性 | Boolean |
| metadataRetrieved (只讀) | 指示是否已檢索元數據 | Boolean |
| name (只讀) | 元素的用戶分配名稱 | String |
| path (只讀) | 文件路徑 | String |
常見數據類型子Describe對象屬性有:
要素類屬性
| 屬性 | 說明 | 數據類型 |
| featureType (只讀) | 要素類的要素類型。
| String |
| hasM (只讀) | 指示幾何是否啟用 m 值。 | Boolean |
| hasZ (只讀) | 指示幾何是否啟用 z 值。 | Boolean |
| hasSpatialIndex (只讀) | 指示要素類是否具有空間索引。 | Boolean |
| shapeFieldName (只讀) | Shape 字段的名稱。 | String |
| shapeType (只讀) | 幾何形狀類型。
| String |
柵格數據集屬性
| 屬性 | 說明 | 數據類型 |
| bandCount (只讀) | 柵格數據集內的波段數。 | Integer |
| compressionType (只讀) | 壓縮類型
| String |
| format (只讀) | 柵格格式
| String |
| permanent (只讀) | 指示柵格的永久狀態:False 表示臨時柵格;True 表示永久柵格。 | Boolean |
| sensorType (只讀) | 用于捕獲圖像的傳感器類型。 | String |
表屬性
| 屬性 | 說明 | 數據類型 |
| hasOID (只讀) | 指示表是否包含 ObjectID 字段。 | Boolean |
| OIDFieldName (只讀) | OID 字段(如果存在)名稱。 | String |
| fields (只讀) | 此表的字段對象的 Python 列表。這與使用?ListFields?函數時相同。 | Field |
| indexes (只讀) | 此表的索引對象的 Python 列表。這與使用?ListIndexes?函數時相同。 | Index |
其他對象屬性情況可參看describe函數:Describe—ArcGIS Pro | 文檔?
二、制作腳本工具
地理處理:制作地理處理工具
地理處理:制作地理處理模型
三、發布地理處理服務
地理處理:共享地理處理服務
不知這個需要寫多久,估計也是像以前那篇關于坐標系的文章一樣,斷斷續續需要個三年五載的。
附件:
argis中自帶python其他站點包使用
1、將python和pip執行程序的路徑添加進系統配置路徑
檢查argis中的python和pip是否可用
2、pip安裝
? ? ?pypi是Python編程語言的軟件存儲庫,PyPI可幫助您查找和安裝Python社區開發和共享的軟件。pip用于搜索、下載、管理、卸載PyPI上的Python包。
PyPI · The Python Package Index
搜索pip
也可以直接以鏈接官網下載pip包,地址是pip · PyPI
? ? ? 下載完成之后,解壓到一個文件夾,用cmd進入這個解壓好的文件夾,輸入:Python?setup.py install?
? ?
?再次檢查站點是否可用,cmd中輸入:pip
3 因國外站點pypi速度較慢,使用國內pypi鏡像站點
站點如下:
阿里云 http://mirrors.aliyun.com/pypi/simple
中國科學技術大學 http://pypi.mirrors.ustc.edu.cn/simple
中國科技大學 https://pypi.mirrors.ustc.edu.cn/simple
豆瓣(douban) http://pypi.douban.com/simple
清華大學 https://pypi.tuna.tsinghua.edu.cn/simple
使用方法:
在pip下,執行以下命令,如下載request包
pip install request -i https://pypi.tuna.tsinghua.edu.cn/simple
會發現,網速果然比一起啊快了好多?
如果出現這是未信任的源,修改上述命令,如下:
pip install request -i https://pypi.tuna.tsinghua.edu.cn/simple?
- -trusted-host pypi.tuna.tsinghua.edu.cn
如果想使用其為默認源?
windows下可修改%HOMEPATH%\pip\pip.ini文件?
修改內容為:?
[global]?
index-url = https://pypi.tuna.tsinghua.edu.cn/simple?
[install]?
trusted-host=pypi.tuna.tsinghua.edu.cn
?
easy_install的安裝:
1 在命令提示符或終端程序中執行“easy_install --version”檢驗在當前操作系統是否安裝了easy_install.
C:\Users\liangxiang>easy_install --version
setuptools 28.8.0 from e:\python\lib\site-packages (Python 3.5)
2 若無前往https://pypi.python.org/pypi/ez_setup下載一個名叫ez_setup.py的程序。解壓安裝,方法:cmd進入到對應目錄下(我的下載目錄為E:\python\Lib\ez_setup-0.9),
執行命令:python ez_setup.py
C:\Users\liangxiang>e
?
E:\>cd E:\python\Lib\ez_setup-0.9
?
E:\python\Lib\ez_setup-0.9>python ez_setup.py
easy_install的用法:
1.0 通過庫名安裝(默認情況下安裝最新版本)
easy_install 軟件包名稱
2.0安裝指定版本
easy_install '軟件包的名稱==版本號'
3.0不指定版本號,要求某一個版本之前或之后的版本
easy_install '軟件包名稱<=版本號'
4.0安裝已經下載的egg文件
easy_install /文件下載路徑/egg文件名
5.0安裝包卸載
easy_install -m 軟件包名稱
?6.0安裝包更新
#默認最新版本
easy_install --upgrade 安裝包名稱?
easy_install -U 安裝包名稱 ? ? ??
#指定升級的版本
easy_install " 安裝包名稱==版本號"
easy_install " 安裝包名稱>版本號"
pip的安裝:
1 若已經安裝easy_install,直接用命令安裝
easy_install install pip
2 若無,前往https://pypi.python.org/pypi/pip?下載pip-18.0.tar.gz?文件,解壓下載的文件,進入解壓后的文件夾中,調出命令行窗口或者終端,輸入 python setup.py install
python setup.py install
3 檢驗pip是否安裝成功
C:\Users\liangxiang>pip --version
pip 18.0 from e:\python\lib\site-packages\pip-18.0-py3.5.egg\pip (python 3.5)
?
pip的用法:
1.0??通過庫名安裝
pip install 軟件包名稱
2.0?安裝指定版本
pip install "軟件包名稱==版號"
3.0?不指定版本號,要求某一個版本之前或之后的版本
pip install "軟件包名稱>=版號"
4.0軟件包卸載
pip uninstall 軟件包名稱
5.0??列出所有安裝的庫
pip list ?
pip freeze?
6.0?列出所有過期的庫
pip list --outdated?
7.0 庫更新
pip install --upgrade 庫名?
?
pip install -U 庫名
8.0 過期庫批量更新/安裝
pip freeze > xxxx.txt #導出當前系統安裝的庫,保存為TXT文件
( pip freeze > E:\\XXX.txt #保存到指定文件夾 )
pip install -r xxxx.txt
9.0 查詢某一個庫的相關信息
pip search 庫名
10.0 其他高級功能,用help查詢
pip help
?
寄語
很多時候我們對arcpy是望而卻步的,不僅僅是因為它需要編碼,而是我們對于地理信息很多本身的邏輯思維都不甚了解。比如,你可能聽說過空間統計分析,但是你是否知道自相關系數、歐式距離、線性/非線性回歸、聚類等知識,我們的回答常常是否定的。大凡一類事物都有他獨有的規則和范圍體系,當我們說到一類編程語言的時候,就勢必涉及語法規則、數據類型、控制結構、編寫環境,編譯工具等等,當編程語言觸及web網絡時,也勢必涉及網絡七層協議、數據交換、https、css、端口號等等,當我們談到地圖服務的時候,又會涉及到網絡地址、服務類型、坐標體系、分辨率、比例尺、旋轉參數等等。arcpy也同樣有它的規則和體系,它屬于python的,必須符合python規則,它又是屬于arcgis的,它也必須符合arcgis甚至于地理信息的一些規則。掌握這些規則的過程,也是提升我們自身的過程。
總結
- 上一篇: 1064. 朋友数(20)
- 下一篇: python 查看当前目录_「Pytho