【284】◀▶ arcpy.da & arcpy 數據訪問模塊


  1. 使用游標訪問數據
  2. 數據訪問模塊 (arcpy.da)

 參考:


01   da.SearchCursor 只讀查看表或要素類數據。
02   da.InsertCursor 向表或要素類插入行。
03   da.UpdateCursor 編輯或刪除表和要素類行。
04   SearchCursor 用於在要素類或表上建立只讀游標。
05   InsertCursor 向要素類、shapefile 或表中插入行。
06   UpdateCursor 創建一個用於更新或刪除指定要素類、shapefile 和表中的行的游標。

序號 函數名稱  

功能說明

  語法 & 舉例

以下是 arcpy.da.SearchCursor、arcpy.da.InsertCursor、arcpy.da.UpdateCursor

01 da.SearchCursor  

====<<<< Description >>>>====

SearchCursor 用於建立從要素類或表中返回的記錄的只讀訪問權限。
返回一組迭代的元組。元組中值的順序與 field_names 參數指定的字段順序相符。使用 For 循環可迭代搜索游標。
----------------------------------------------------------------------------------

====<<<< Syntax >>>>====

da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})
----------------------------------------------------------------------------------

====<<<< Parameters >>>>====

◈  in_table:要素類、圖層、表或表視圖。
◈  field_names、[field_names,...]:字段名稱列表(或組)。對於單個字段,可以使用一個字符串,而不使用字符串列表。如果要訪問輸入表中的所有字段(柵格和 BLOB 字段除外),可以使用星號 (*) 代替字段列表。以令牌(如 OID@)取代字段名稱可訪問更多的信息:
    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@ —要素的幾何對象。(Point、Polyline、Polygon)
    SHAPE@AREA —要素的雙精度面積。
    SHAPE@LENGTH —要素的雙精度長度。
    OID@ —ObjectID 字段的值。

◈  where_clause:用於限制所返回的記錄的可選表達式。有關 WHERE 子句和 SQL 語句的詳細信息,請參閱構建查詢表達式。
(默認值為 None)
----------------------------------------------------------------------------------

====<<<< Properties >>>>====

◈  fields:返回一個使用這個游標的字段名稱的元組,與上面的參數對應。
----------------------------------------------------------------------------------

====<<<< Methods >>>>====

◈   next ():將下一行作為元組返回。字段將按照創建光標時所指定的順序返回。
◈   reset ():將光標重置回第一行。

 
# 用來查詢 "Fre = 0" 的全部記錄(遇到字符串使用單引號,"Name = 'alex'")
cursor = arcpy.da.SearchCursor("union", "Fre", "Fre = 0")
# 獲取查詢列的所有值,並賦值為列表(values)
>>> cursor = arcpy.da.SearchCursor("CNTRY92", "NAME")
>>> values = [row[0] for row in cursor]
# 獲取經緯度坐標
>>> cursor = arcpy.da.SearchCursor("CNTRY92", "SHAPE@XY")
>>> xy = [row[0] for row in cursor]
>>> xy[0]
(6.299706626866719, 49.77865316900599)

# 獲取 polygon 面積
>>> cursor = arcpy.da.SearchCursor("CNTRY92", "SHAPE@AREA")
>>> area = [row[0] for row in cursor]
>>> area[0]
0.33773702035614406

# 獲取 polygon 周長
>>> cursor = arcpy.da.SearchCursor("CNTRY92", "SHAPE@LENGTH")
>>> length = [row[0] for row in cursor]
>>> length[0]
2.58749040209765

# 獲取 polygon 並輸出
>>> cursor = arcpy.da.SearchCursor("CNTRY92", "SHAPE@")
>>> shape = [row[0] for row in cursor]
>>> shape[0]
<Polygon object at 0x2acfa110[0x2acf8b40]>
>>> arcpy.CopyFeatures_management(shape[0], "shape_00.shp")
<Result 'D:\\McDelfino\\Documents\\ArcGIS\\shape_00.shp'>

在 Python 中,構建由三重引號括起的表達式

cursor = arcpy.da.SearchCursor(fc, ["roadclass", "name"], 
""""roadclass" = 2""")
for row in cursor:
    print(row[1])

1. 注意操作的時候不要選擇數據,否則只會查詢選擇范圍內的信息;

2. 如果想要選擇全部 table 內容,則不需要添加 SQL 語句;

3. 注意 SQL 語法等。

 


 

 02 da.InsertCursor

 

 

====<<<< Description >>>>====

InsertCursor 可在要素類或表上建立寫入游標。可以使用 InsertCursor 來添加新行。
----------------------------------------------------------------------------------

====<<<< Syntax >>>>====

da.InsertCursor (in_table, field_names)
----------------------------------------------------------------------------------

====<<<< Parameters >>>>====

◈  in_table:要素類、圖層、表或表視圖。
◈  field_names、[field_names,...]:字段名稱列表(或組)。對於單個字段,可以使用一個字符串,而不使用字符串列表。如果要訪問輸入表中的所有字段(柵格和 BLOB 字段除外),可以使用星號 (*) 代替字段列表。
----------------------------------------------------------------------------------
====<<<< Properties >>>>====

◈  fields:返回一個使用這個游標的字段名稱的元組,與上面的參數對應。
----------------------------------------------------------------------------------

====<<<< Methods >>>>====

◈   insertRow (row):向表中插入一行。
 

 

 03

da.UpdateCursor

 

====<<<< Description >>>>====

UpdateCursor 用於建立對從要素類或表返回的記錄的讀寫訪問權限。
返回一組迭代列表。列表中值的順序與 field_names 參數指定的字段順序相符。
----------------------------------------------------------------------------------

====<<<< Syntax >>>>====

da.UpdateCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})
----------------------------------------------------------------------------------

====<<<< Parameters >>>>====

◈  in_table:要素類、圖層、表或表視圖。
◈  field_names、[field_names,...]:字段名稱列表(或組)。對於單個字段,可以使用一個字符串,而不使用字符串列表。如果要訪問輸入表中的所有字段(柵格和 BLOB 字段除外),可以使用星號 (*) 代替字段列表。
----------------------------------------------------------------------------------
====<<<< Properties >>>>====

◈  fields:返回一個使用這個游標的字段名稱的元組,與上面的參數對應。
----------------------------------------------------------------------------------

====<<<< Methods >>>>====

◈  deleteRow ():刪除當前行。
◈  next ():將下一行作為元組返回。字段將按照創建光標時所指定的順序返回。
◈  reset ():將光標重置回第一行。
◈  updateRow (row):更新表中的當前行。
 

 

 

 

 

以下是 arcpy.SearchCursor、arcpy.InsertCursor、arcpy.UpdateCursor

04

SearchCursor

 

====<<<< Description >>>>====

SearchCursor 函數用於在要素類或表上建立只讀游標。SearchCursor 可用於遍歷行對象並提取字段值。可以使用 where 子句或字段限制搜索,並對結果排序。

以迭代方式搜索游標的方式有兩種:for 循環或者 while 循環(通過游標的 next 方法返回下一行)。如果要使用游標的 next 方法來檢索行數為 N 的表中的所有行,則腳本必須調用 next N 次。在檢索完結果集的最后一行后調用 next 將返回 None,它是一種 Python 數據類型,此處用作占位符。

返回值為 Cursor 類,具體屬性與方法參見 Cursor 類
----------------------------------------------------------------------------------

====<<<< Syntax >>>>====

SearchCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})
----------------------------------------------------------------------------------

====<<<< Parameters >>>>====

  dataset:The feature class, shapefile, or table containing the rows to be searched.
◈  where_clause:SQL 語句,用來限定查詢注意內容用單引號

 
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyrs = arcpy.mapping.ListLayers(mxd)

lyr = lyrs[0]

# 內容需要用單引號引起來,只查詢遼寧省的部分

# for 循環
cursor = arcpy.SearchCursor(lyr, "NAME='遼寧省'")
for row in cursor:
    print row.getValue("ID")
  
# while 循環,需要得到 row,然后判斷 row 是否存在  
cursor = arcpy.SearchCursor(lyr, "NAME='遼寧省'")
row = cursor.next()
while row:
    print row.getValue("ID")
    row = cursor.next()
05

InsertCursor

   

====<<<< Description >>>>====

向要素類、shapefile 或表中插入行。InsertCursor 返回一個分發行對象的枚舉對象。

可使用 newRow 方法從插入行的枚舉對象獲取新的行對象。每次調用光標上 insertRow 都會在表中創建新行,該行的初始值設置為輸入行中的值。

返回值為 Cursor 類,具體屬性與方法參見 Cursor 類
----------------------------------------------------------------------------------

====<<<< Syntax >>>>====

InsertCursor (dataset, {spatial_reference})
----------------------------------------------------------------------------------

====<<<< Parameters >>>>====

◈  dataset:The feature class, shapefile, or table containing the rows to be searched.

 
cursor = arcpy.InsertCursor(lyr)
for i in range(1, 10):
    row = cursor.newRow()
    row.setValue("NAME", "阿拉斯加")
    row.setValue("ID", i)
    cursor.insertRow(row)
    
# 將其刪除
del cursor, row
06

UpdateCursor

   

====<<<< Description >>>>====

UpdateCursor 函數創建一個用於更新或刪除指定要素類、shapefile 和表中的行的游標。該游標將數據鎖定保留至腳本完成或更新游標對象被刪除時。

以迭代方式更新游標的方式有兩種:for 循環或者 while 循環(通過游標的 next 方法返回下一行)。如果要使用游標的 next 方法來檢索行數為 N 的表中的所有行,腳本必須調用 next N 次。在檢索完結果集的最后一行后調用 next 將返回 None,它是一種 Python 數據類型,此處用作占位符。

返回值為 Cursor 類,具體屬性與方法參見 Cursor 類
----------------------------------------------------------------------------------

====<<<< Syntax >>>>====

UpdateCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})
----------------------------------------------------------------------------------

====<<<< Parameters >>>>====

◈  dataset:The feature class, shapefile, or table containing the rows to be searched.
◈  where_clause:SQL 語句,用來限定查詢注意內容用單引號

 
# 將一列的數據賦值到另一列
# for 循環
cursor = arcpy.UpdateCursor(lyr)
field1 = "BOU2_4M_"
field2 = "BOU2_4M_ID"
for row in cursor:
    row.setValue(field1, row.getValue(field2)*2)
    cursor.updateRow(row)
    
# while 循環,最后的時候 row 返回為 0
cursor = arcpy.UpdateCursor(lyr)
row = cursor.next()
while row:
    row.setValue(field1, row.getValue(field2)/2)
    cursor.updateRow(row)
    row = cursor.next()
--
----------
 
--------------------------------------------------
   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM