ArcPy常用函数梳理
1 地理處理環境及其設置
1) 獲取和設置地理處理環境
地理處理環境設置以env類的屬性的方式訪問。這些屬性可用于檢索或設置當前值。環境可作為環境類中的讀/寫屬性進行訪問,方法為arcpy.env.<環境名稱>。示例1為設置地理處理環境。
示例1:設置地理處理環境值
| import arcpy # 設置地理處理環境值 acpy.env.worksapce = "c:/St_Johns/data.gdb" |
2) 重新設置環境
由于地理處理環境對工具操作和輸出有著很大的影響,因此需要保證能夠追蹤環境設置并在必要時將其重置為默認狀態。可以使用ResetEnvironments函數恢復默認環境值,或者使用ClearEnvironment函數重置特定環境,如示例2-2所示。
示例2:重置地理處理環境值
| import arcpy # 恢復默認的環境值 arcpy.ResetEnvironments() # 重置特定環境 arcpy.ClearEnvironment("workspace") |
2 描述數據
描述數據主要使用Describe函數。Describe函數返回的Describe對象包含多個屬性,如數據類型、字段、索引。該對象的屬性是動態的,也就是說不同的數據類型,會有不同的描述屬性可供使用。
Describe屬性被組織成一系列屬性組。任何特定數據集都將至少獲取其中一個組的屬性。例如,如果要描述一個地理數據庫要素類,可以訪問GDB要素類、要素類、表和數據集屬性組中的屬性。所有的數據,不管是哪種數據類型,總會獲取通用的Describe對象屬性。
值得注意的是,arcpy.da.Describe也可以獲取相同的描述信息,唯一的區別在于該方法以字典的方式返回描述信息。
在某些情況下,Describe返回的對象并不包含為其設計的所有屬性。例如,地圖中圖層的Describe對象不會包含圖層屬性集。只有在描述.lyr文件時,該屬性才會存在。如果試圖訪問Describe對象不具有的屬性,它會拋出錯誤異常或返回空值(如:None、0或-1或空字符串)。如果不是很確定描述對象是否含某個屬性,可以使用Python的hasattr()函數進行檢查。
可以通過Describe函數獲取描述信息的數據類型如表1所示。
表1? 可使用Describe函數獲取描述信息的數據類型
| ArcInfo Workstation 項屬性 | ArcInfo Workstation 表屬性 | CAD 工程圖數據集屬性 |
| CAD 要素類屬性 | 地籍結構屬性 | Coverage 要素類屬性 |
| Coverage 屬性 | 數據集屬性 | dBASE 表屬性 |
| 編輯器追蹤數據集屬性 | 要素類屬性 | 文件屬性 |
| 文件夾屬性 | GDB 要素類屬性 | GDB 表屬性 |
| 幾何網絡屬性 | LAS 數據集屬性 | 圖層屬性 |
| 地圖文檔屬性 | 鑲嵌數據集屬性 | Network Analyst 圖層屬性 |
| 網絡數據集屬性 | Prj 文件屬性 | 波段柵格屬性 |
| 柵格目錄屬性 | 柵格數據集屬性 | RecordSet和FeatureSet 屬性 |
| 關系類屬性 | 制圖表達類屬性 | 邏輯示意圖數據集屬性 |
| 邏輯示意圖屬性 | 邏輯示意圖文件夾屬性 | SDC 要素類屬性 |
| Shapefile 要素類屬性 | 表屬性 | 表視圖屬性 |
| 文本文件屬性 | Tin 屬性 | 工具屬性 |
| 工具箱屬性 | 拓撲屬性 | VPF Coverage 屬性 |
| VPF 要素類屬性 | VPF 表屬性 | 工作空間屬性 |
注:詳細信息請查閱http://pro.arcgis.com/zh-cn/pro-app/arcpy/functions/describe.htm。
?
?
?
Dscribe函數的語法及返回值說明分別如表2和表3所示。其中,Describe類型對象的屬性信息如表4所示。
表2? Describe函數語法
| 參數 | 數據類型 | 說明 |
| value | String | 要描述的指定數據元素或地理處理對象。 |
表3? Describe函數返回值
| 數據類型 | 說明 |
| Describe | 返回具有用于詳細描述所描述的數據元素的屬性的對象。某些返回的對象屬性會包含文本值或對象。 |
表4? 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 | 文件路徑 |
?
?
Dscribe函數示例如示例3所示。
示例3:Describe函數
| import arcpy # 從參數中獲取Layer對象 layerString = arcpy.GetParameterAsText(0) # 獲取Layer對象的描述信息 desc = arcpy.Describe(layerString) # 打印Layer對象的名稱 print("Name: {}".format(desc.name)) # 判斷描述信息中是否函數layer屬性 if hasattr(desc, "layer"): ??? print("Layer name: {}".format(desc.layer.name)) ??? print("Layer data source: {}".format(desc.layer.catalogPath)) ??? print(".lyr file: {}".format(desc.catalogPath)) else: ??? print("Layer name: {}".format(desc.name)) ??? print("Layer data source: {}".format(desc.catalogPath)) |
3 游標
3.1 InsertCursor
InsertCursor可返回一個分發Row對象的枚舉對象,可以實現向要素類、shapefile或表中插入行。可使用newRow方法從插入行的枚舉對象獲取新的Row對象。光標每次調用insertRow方法都會在表中創建新行,該行的初始值設置為輸入行中的值。
InsertCursor函數的調用方式為:InsertCursor (dataset, {spatial_reference}),其語法以及返回值信息分別如表5和6所示。 ??
表5? InsertCursor函數語法
| 參數 | 數據類型 | 說明 |
| dataset | String | 將向其中插入行的表、要素類或shapefile。 |
| spatial_reference | SpatialReference | 在提供的spatial_reference中指定的坐標,并動態轉換到數據集的坐標系。 |
表6? InsertCursor函數返回值
| 數據類型 | 說明 |
| Cursor | 返回針對指定要素類、shapefile或表的Cursor對象。 |
InsertCursor函數示例如示例4所示。
示例4:InsertCursor函數
| import arcpy # 通過InsertCursor為Table創建Cursor對象 rows = arcpy.InsertCursor("c:/base/data.gdb/roads_lut") # 添加25行新數據 for x in range(1, 26): ??? row = rows.newRow() ??? row.setValue("rowid", x) ??? row.setValue("distance", 100) ??? rows.insertRow(row) # 刪除Cursor對象和行對象,主要是為了解除數據的鎖定 del row del rows |
3.2 SearchCursor
SearchCursor函數用于在要素類或表上建立只讀游標。SearchCursor函數可用于遍歷Row對象并提取字段值,可使用where子句或字段限制搜索,并對結果排序。
SearchCursor函數的調用方式為:SearchCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields}),其語法以及返回值信息分別如表7和8所示。表7? SearchCursor函數語法
| 參數 | 數據類型 | 說明 |
| dataset | String | 包含要搜索行的要素類、shapefile 或表。 |
| where_clause | String | 用于限制在游標中返回的行的可選表達式。 |
| spatial_reference | SpatialReference | 指定后,要素將使用提供的spatial_reference進行動態投影。 |
| fields | String | 游標中包含以分號分隔的字符串字段。默認情況下,包含所有字段。 |
| sort_fields | String | 在游標中對行進行排序的字段。 |
表8? InsertCursor函數返回值
| 數據類型 | 說明 |
| Cursor | 可分發Row對象的Cursor對象 |
Python中可用于迭代搜索游標的方式有兩種:for循環或者while循環(通過游標的next方法返回下一行)。通過for循環以及通過while循環使用SearchCursor函數分別如示例5和示例6所示。
示例5:通過for循環使用SearchCursor。
| import arcpy fc = "c:/data/base.gdb/roads" field = "StreetName" cursor = arcpy.SearchCursor(fc) for row in cursor: print(row.getValue(field)) |
示例6:通過while循環使用SearchCursor。
| import arcpy fc = "c:/data/base.gdb/roads" field = "StreetName" cursor = arcpy.SearchCursor(fc) row = cursor.next() while row: print(row.getValue(field))??? row = cursor.next() |
3.3 UpdateCursor
UpdateCursor函數可創建一個用于更新或刪除指定要素類、shapefile和表中的行的游標。該游標將數據鎖定保留至腳本完成或更新游標對象被刪除時。
UpdateCursor函數的調用方式為:UpdateCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields}),其語法以及返回值信息分別如表9和10所示。表7? SearchCursor函數語法
| 參數 | 數據類型 | 說明 |
| dataset | String | 包含要更新或刪除行的要素類、shapefile或表。 |
| where_clause | String | 用于限制在游標中返回的行的可選表達式。 |
| spatial_reference | SpatialReference | 在提供的spatial_reference中指定的坐標,并動態轉換到數據集的坐標系。 |
| fields [fields,...] | String | 游標中包含以分號分隔的字符串字段。默認情況下,包含所有字段。 |
| sort_fields | String | 用于在游標中對行進行排序的字段。 |
表8? InsertCursor函數返回值
| 數據類型 | 說明 |
| Cursor | 可分發Row對象的Cursor對象 |
Python中可用于迭代搜索游標的方式有兩種:for循環或者while循環(通過游標的next方法返回下一行)。通過for循環以及通過while循環使用SearchCursor函數分別如示例7和示例8所示。
示例7:通過for循環使用UpdateCursor。
| import arcpy fc = "c:/data/base.gdb/roads" field1 = "field1" field2 = "field2" cursor = arcpy.UpdateCursor(fc) for row in cursor: ??? row.setValue(field2, row.getValue(field1) * 3.0) ?cursor.updateRow(row) |
示例8:通過while循環使用UpdateCursor。
| import arcpy fc = "c:/data/base.gdb/roads" field1 = "field1" field2 = "field2" cursor = arcpy.UpdateCursor(fc) row = cursor.next() while row: row.setValue(field2, row.getValue(field1) * 3.0)? cursor.updateRow(row) row = cursor.next() |
4 獲取和設置參數
4.1 GetParameter
在參數列表中,按所需參數的索引值選擇參數。參數以對象的形式返回。要將此參數用作文本字符串,可調用GetParameterAsText函數。
GetParameter函數調用方式為GetParameter(index),其語法說明及返回值信息分別如表9和表10所示
表9? GetParameter函數語法
| 參數 | 數據類型 | 說明 |
| index | Integer | 在參數列表中按索引選擇指定參數。 |
表10? InsertCursor函數返回值
| 數據類型 | 說明 |
| Object | 對象通過指定參數返回。 |
?
?
GetParameter函數示例如示例9所示。
示例9: GetParameter函數。
| import arcpy # 獲取第一個參數 spatial_ref = arcpy.GetParameter(0) # 顯示投影坐標系信息 arcpy.AddMessage("Name is: {0}".format(spatial_ref.name)) arcpy.AddMessage("Type is: {0}".format(spatial_ref.type)) arcpy.AddMessage("Factory code is: {0}".format(spatial_ref.factoryCode)) |
4.2 GetParameterAsText
按照參數在參數列表中的索引位置以文本字符串的形式獲取指定參數。無論參數的數據類型是什么,所有值都將作為字符串返回。
GetParameterAsText函數調用方式為GetParameterAsText (index),其語法說明及返回值信息分別如表11和表12所示
表11? GetParameterAsText函數語法
| 參數 | 數據類型 | 說明 |
| index | Integer | 在參數列表中按索引選擇指定參數。 |
表12? GetParameterAsText函數返回值
| 數據類型 | 說明 |
| String | 以字符串形式返回的指定參數值。 |
GetParameterAsText函數示例如示例10所示。
示例10: GetParameterAsText函數
| import os import arcpy arcpy.env.workspace = arcpy.GetParameterAsText(0) in_featureclass = arcpy.GetParameterAsText(1) out_workspace = arcpy.GetParameterAsText(2) out_featureclass = os.path.join(out_workspace, ??????????????????????????????? os.path.basename(in_featureclass)) arcpy.CopyFeatures_management(in_featureclass, out_featureclass) |
5 幾何
5.1 AsShape
將Esri JSON或GeoJSON轉換為ArcPy幾何對象或要素集對象。GeoJSON 是一種地理空間數據的交換格式,可用于對地理數據結構進行編碼。AsShape不支持 GeoJSON 坐標參考系對象,通過 GeoJSON 創建的幾何對象的空間參考將為未知。
AsShape函數調用方式為AsShape (geojson_struct, {esri_json}),其語法說明及返回值信息分別如表13和表14所示
表13? AsShape函數語法
| 參數 | 數據類型 | 說明 |
| geojson_struct | Dictionary | geojson_struct包括type和coordinates。type主要類型有:Point、LineString、Polygon、MultiPoint和MultiLineString。 |
| esri_json | Boolean | 設置將輸入JSON作為Esri JSON評估還是作為GeoJSON 評估。如果為True,則將輸入作為Esri JSON評估。 |
表14? AsShape函數返回值
| 數據類型 | 說明 |
| Geometry | AsShape將基于輸入GeoJSON或Esri JSON對象返回幾何對象(PointGeometry、Multipoint、Polyline或Polygon)。如果Esri JSON是要素集,AsShape將返回FeatureSet。 |
?
AsShape函數示例如示例11所示。
示例11: AsShape函數
| import arcpy geojson_point = { ??? "type": "Point", ??? "coordinates": [5.0, 5.0]} point = arcpy.AsShape(geojson_point) |
6 地理數據庫管理
6.1 AcceptConnections
允許管理員啟用或禁用非管理員用戶連接到企業級地理數據庫的功能。管理員可使用AcceptConnections函數暫時阻止到企業級地理數據庫的連接。該函數用于補充ArcGIS Desktop中企業級地理數據庫屬性頁面中的“連接”選項卡。
AcceptConnections函數調用方式為AcceptConnections (sde_workspace, accept_connections),其語法說明別如表15所示
表15? AcceptConnections函數語法
| 參數 | 數據類型 | 說明 |
| sde_workspace | String | 將改變連接屬性的企業級地理數據庫。企業級地理數據庫中指定的連接屬性必須為地理數據庫管理員。 |
| accept_connections | Boolean | 用于指示地理數據庫將接受連接 (True) 或拒絕接受連接 (False) 的布爾值。 |
?
AcceptConnections函數示例如示例12所示。
示例12:AcceptConnection函數。
| import arcpy admin_workspace = "Database Connections/admin.sde" arcpy.AcceptConnections(admin_workspace, False) arcpy.DisconnectUser(admin_workspace, 'ALL') arcpy.ReconcileVersions_management(admin_workspace, 'ALL_VERSIONS', ?????????????????????????????????? 'sde.DEFAULT', with_post='POST') arcpy.Compress_management(admin_workspace) # Allow connections. arcpy.AcceptConnections(admin_workspace, True) |
6.2 DisconnectUser
DisconnectUser函數能夠實現允許管理員斷開當前連接到企業級地理數據庫的門戶的連接。
DisconnectUser函數的調用方式為DisconnectUser(sde_workspace, {users}),其語法說明如表16所示。
表16 ?DisconnectUser函數語法
| 參數 | 數據類型 | 說明 |
| sde_workspace | String | 包含要斷開連接的用戶的企業級地理數據庫。在企業級地理數據庫中指定的連接文件必須具有管理權限以允許用戶斷開其他連接。 |
| users[users,…] | Interger | 指定將斷開哪些用戶與地理數據庫的連接,可選參數為: 1) sde_id —從 ListUsers 函數返回的 ID 值。可將其作為單個 sde_id 或包含多個 sde_id 的列表傳遞到函數。 2) ALL —關鍵字指定應斷開所有已連接的用戶。 |
?
DisconnectUser函數使用示例如示例13所示。
示例13:使用DisconnectUser函數斷開地理數據庫所有用戶連接。
| import arcpy arcpy.DisconnectUser("Database Connections/admin@sde.sde", "ALL") |
7 柵格
7.1 NumPyArrayToRaster
該函數可將NumPy數組轉換為柵格。所生成的柵格數據集的大小和數據類型取決于輸入數組。其中x_cell_size和y_cell_size參數可支持矩形像元。
NumpyArrayToRaster支持將多維 NumPy 數組直接轉換為多波段柵格。如果輸入數組具有兩個維度,則其返回的單波段柵格的大小由這兩個維度(行、列)定義。如果輸入數組具有三個維度,則在其返回的多波段柵格中,波段數等于第一維的長度,而且該柵格的大小由第二維和第三維(波段、行、列)定義。如果輸入數組具有三個維度并且第一維的大小為 1,則會返回單波段柵格。
此函數支持以下地理處理環境設置:輸出坐標系、范圍、捕捉柵格、當前工作空間、臨時工作空間。
NumpyArrayToRaster函數調用方式為:NumPyArrayToRaster (in_array, {lower_left_corner}, {x_cell_size}, {y_cell_size}, {value_to_nodata}),其語法說明及返回值信息分別如表17和表18所示。
表17? NumpyArrayToRaster函數語法
| 參數 | 數據類型 | 說明 |
| in_array | NumPyArray | 要轉換為柵格的二維或三維的NumPy數組。 |
| lower_left_corner | Point | 定義地圖單位中輸出柵格左下角的點對象。默認情況下,左下角的坐標將設置為(0.0, 0.0)。默認值為None。 |
| x_cell_size | Double | x方向的像元大小用地圖單位指定。輸入可為指定的像元大小(類型:雙精度)值或柵格。默認值為1.0 |
| y_cell_size | Double | y 方向的像元大小用地圖單位指定。輸入可為指定的像元大小(類型:雙精度)值或柵格。默認值為 1.0。 |
| value_to_nodata | Double | 在輸出柵格中分配到NoData的NumPy數組值。如果沒有為?value_to_nodata?指定任何值,則在生成的柵格中不會有任何NoData值。默認值為 None。 |
表18? NumpyArrayToRaster函數返回值
| 數據類型 | 說明 |
| Raster | 輸出柵格。 |
?
AcceptConnections函數示例如示例14所示。
示例14:NumpyArrayToRaster函數。
| import arcpy import numpy myArray = numpy.random.random_integers(0,100,2500) myArray.shape = (50,50) myRaster = arcpy.NumPyArrayToRaster(myArray,x_cell_size=1) myRaster.save("C:/output/fgdb.gdb/myRandomRaster") |
7.2 RasterToNumPyArray
該方法實現將柵格轉換為NumPy數組。Python NumPy數組專門用于處理大型數組。很多現有Python函數都是為了處理NumPy數組而創建的,NumPy數組是包含在Python的SciPy科學計算包中的最著名數組。
如果數組的定義(左下角以及行數和列數)超出in_raster的范圍,則數組值將分配為 NoData;如果lower_left_corner與像元角不重合,則會自動捕捉到最近像元角的左下角,該捕捉方法采用的規則與“捕捉柵格”環境設置中的規則相同。
RasterToNumPyArray函數支持將多波段柵格直接轉換為多維數組 (ndarray)。
1) 如果輸入?Raster?實例基于多波段柵格,則會返回ndarry,其中第一維的長度表示波段數。該ndarry將具有三個維度:波段、行、列。
2) 如果輸入?Raster?實例基于單個柵格或多波段柵格中的特定波段,則會返回含維度(行、列)的二維數組。
RasterToNumPyArray函數調用方式為:RasterToNumPyArray (in_raster, {lower_left_corner}, {ncols}, {nrows}, {nodata_to_value}),其語法說明及返回值信息分別如表19和表20所示。
表19? RasterToNumpyArray函數語法
| 參數 | 數據類型 | 說明 |
| in_raster | Raster | 要轉換為NumPy數組的輸入柵格。 |
| lower_left_corner | Point | 可從in_raster中的左下角提取處理塊以轉換為數組。x值和y值采用地圖單位。若未指定值,則將使用輸入柵格的原點。默認值為 None。 |
| ncols | Integer | in_raster中要轉換為NumPy數組的lower_left_corner中的列數。若未指定值,則將使用輸入柵格的列數。默認值為 None。 |
| nrows | Integer | in_raster中要轉換為 NumPy 數組的lower_left_corner中的行數。若未指定值,則將使用輸入柵格的行數。默認值為 None。 |
| nodata_to_value | Variant | 在生成的 NumPy 數組中分配in_rasterNoData值的值。若未指定值,則將使用in_raster的 NoData 值。默認值為 None。 |
?
表20? NumpyArrayToRaster函數返回值
| 數據類型 | 說明 |
| NumPyArray | 輸出的 NumPy 數組。 |
?
RasterToNumPyArray函數示例如示例15所示。
示例15:RasterToNumPyArray函數。
| import arcpy import numpy inRas = arcpy.Raster('C:/data/inRaster') lowerLeft = arcpy.Point(inRas.extent.XMin,inRas.extent.YMin) cellSize = ras.meanCellWidth arr = arcpy.RasterToNumPyArray(inRas,nodata_to_value=0) arrSum = arr.sum(1) arrSum.shape = (arr.shape[0],1) arrPerc = (arr)/arrSum #Convert Array to raster (keep the origin and cellsize the same as the input) newRaster = arcpy.NumPyArrayToRaster(arrPerc,lowerLeft,cellSize, ???????????????????????????????????? value_to_nodata=0) newRaster.save("C:/output/fgdb.gdb/PercentRaster") |
?
?
參考:?https://pro.arcgis.com/zh-cn/pro-app/arcpy/main/arcgis-pro-arcpy-reference.htm
總結
以上是生活随笔為你收集整理的ArcPy常用函数梳理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python调用c#注意事项_Pytho
- 下一篇: python3语法都相同吗_python