在使用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.da.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))