使用arcpy.SearchCursor()与arcpy.da.SearchCursor()时出现AttributeError: __exit__

在使用arcpy便利要素的几何信息和属性信息时,可以使用SearchCursor()来进行便利,arcpy官网指出,arcpy.SearchCursor()已经由arcpy.da.SearchCursor()代替,但arcpy.SearchCursor()依然可以使用。

arcpy.da.SearchCursor()的参数如下:

dataset

包含要搜索行的要素类、shapefile 或表。

String

where_clause

用于限制在游标中返回的行的可选表达式。有关 where 子句和 SQL 语句的详细信息,请参阅 构建查询表达式

String

spatial_reference

指定后,要素将使用提供的 spatial_reference 进行动态投影。

SpatialReference

fields

游标中包含以分号分隔的字符串字段。默认情况下,包含所有字段。

String

sort_fields

用于在游标中对行进行排序的字段。每个字段的升序和降序排列表示为 A 形式,D 表示升序,"field1 A;field2 D" 表示降序。

String

dataset可以是.shp文件的路径,可以是数据库中的要素类,也可以是数据库遍历后的要素对象:

fc1 = r"D:\ArcGIS\DataBase\XQX.shp"  #.shp类型的文件

fc2 = r"D:\ArcGIS\DataBase\data.gdb\XQX_co"  #数据库中的要素类文件

Fcls = arcpy.ListFeatureClasses()
for fc in Fcls:   #遍历后的要素对象
    print(fc)

where_clause是查询表达式,在查询字符串型属性值时,注意添加引号:

SQL="name='Line1'"
cursor = arcpy.SearchCursor(fc,SQL)

当where_clause缺省时,查询所有的要素,

在很多示例代码中,使用with子句来进行要素属性遍历:

Fcls=arcpy.ListFeatureClasses() #要素遍历
for fc in Fcls:
    with arcpy.SearchCursor(fc,['OID@', 'SHAPE@']) as cursor:  #返回要素OID和几何信息
        for row in cursor:
            print("Feature {0}:".format(row[0]))  #输出要素XY坐标
            for point in row[1].getPart(0):
                print("{0}, {1}".format(point.X, point.Y))

但是会报错:

原因是with as子句是一种简化版本的try finally,用于一些可能事先需要设置,事后做清理工作的任务,以文件读取为例:

file = open("/tmp/foo.txt")

try:

  data = file.read()

finally:

  file.close()

因此,with所求值的对象必须有一个__enter__()方法,一个__exit__()方法,上述报错就是因为原先的arcpy.SearchCursor()没有__exit__方法,因此出现报错的情况。

修改方法有两种:

1.使用arcpy.da.SearchCursor()

with arcpy.SearchCursor(fc,['OID@', 'SHAPE@']) as cursor:

2.使用其他语法

field = "name"
SQL="name='xiangqianxian1'"
cursor = arcpy.SearchCursor(fc,SQL)
for row in cursor:
    value=row.getValue(field)
    print(row.getValue(field))

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值