• 【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()
    
    --
    ----------
     
    --------------------------------------------------
       
  • 相关阅读:
    LeetCode算法题-Binary Search(Java实现)
    LeetCode算法题-Kth Largest Element in a Stream(Java实现)
    LeetCode算法题-Search in a Binary Search Tree(Java实现)
    LeetCode算法题-Degree of an Array(Java实现)
    LeetCode算法题-Count Binary Substrings(Java实现)
    LeetCode算法题-Binary Number with Alternating Bits(Java实现)
    之前见汤姆大叔 写过一系列的 js 深入理解 呢 很是感觉经典
    xsd 和 wsdl
    发现 一个业务管理系统 解决了 orm 和 前端框架 剩下的 是 业务逻辑 了 。 哈
    uwp 嗯 我最近 准备开发一个 应用 。 嗯 走起
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/8179678.html
Copyright © 2020-2023  润新知