使用游标访问数据
1.游标是一个数据库术语,只要用于访问表格中每一行记录或向表中插入新的记录,在ArcGis中,游标通常用于从表中或者向表中按行读取或写入新几何结构。
2.游标通常三种形式:搜索(查行) 插入(增行) 更新(删行,改行)
3.每种形式由arcpy.da模块中对应的ArcPy函数**SearchCursorInsertCursorUpdateCursor** 创建
arcpy.da.InsertCursor(in_table, field_names)
arcpy.da.SearchCursor(in_table, field_names,{where_clause},{spatial_reference},{explore_to_points})
arcpy.da.UpdateCursor(in_table, field_names,{where_clause},{spatial_reference},{explore_to_points})
以上三种游标的参数中in_table,field_names为必选参数
游标类型 | 方法 | 功能 |
搜索 | next | 检索下一个行对象 |
reset | 将游标还原到初始位置 | |
插入 | insertRow | 向表中插入行对象 |
next | 检索下一个行对象 | |
更新 | deleteRow | 从表中删除行 |
next | 检索下一个行对象 | |
reset | 将游标还原到初始位置 | |
updateRow | 更新当前行对象 |
用for循环来遍历所有搜索到的记录并输出指定的字段
improt arcpy
fc="c:/Data/study.gdb/roads"
cursor=arcpy.da.SearchCursor(fc, ["STREETNAME"])
for row in cursor:
print "Streetname = {0}".format(row[0])
运行结果:
Streetname = MARKHAM WOOD
Streetname = MARKHAM WOOD
Streetname = LAKE MARY
Streetname = AVENUE H
Streetname = FLORIDA
...
使用with语句后,无论游标运行成功还是失败都可以保证数据库锁的关闭和释放
improt arcpy
fc="c:/Data/study.gdb/roads"
with arcpy.da.SearchCursor(fc, ["STREETNAME"]) as sursor
for row in cursor:
print "Streetname = {0}".format(row[0])
下面举例如何向表中插入新记录:
improt arcpy
fc="c:/Data/study.gdb/roads"
cursor=arcpy.da.InsertCursor(fc, ["STREETNAME"])
cursor.insertRow(["NEW STREET"])
"""InsertCursor函数的首字母需要大写,而insetrRow方法的首字母不需要大写ArcPy普遍使用这种命名风格。"""
下面战术通过循环来插入多行数据:
improt arcpy
fc="c:/Data/study.gdb/roads"
cursor=arcpy.da.InsertCursor(fc, ["STREETNAME"])
x=1
while x<5:
cursor.insertRow(["NEW STREET"])
x += 1
"""默认情况下,新插入的数据位于表的末尾,表中游标没有遍历到的字段会分配默认通常是"null"(不同数据库会有不同的默认值)"""
下面例子,展示游标的更新操作
improt arcpy
fc="c:/Data/study.gdb/roads"
cursor=arcpy.da.UpdateCursor(fc, ["ACRES","SHAPE_AREA"])
for row in cursor:
row[0] = row[1] /43560
cursor.updateRow([row])
"""一个字段(ACRES)的值会根据另一个字段(SHAPE_AREA)的值进行更新,假设Shape_area字段的单位是平方英尺,那么需要将它除以43560才能得到以英亩为单位的面积值"""
deleteRow 方法用于删除UpdateCursor 当前位置所在行对象。提取行对象之后可在游标商调用deleteRow方法进行删除行:
improt arcpy
fc="c:/Data/study.gdb/roads"
cursor=arcpy.da.UpdateCursor(fc, ["ACRES","SHAPE_AREA"])
for row in cursor:
if row[0]=="MAIN ST":
cursor.deleteRow()
插入游标和更新游标均支持编辑操作,在ArcGIS地理处理框架中,创建游标对象的同时会在属性表上添加一个锁。
锁有两种类型:共享锁和排他锁。
当访问表格或者数据集时,会应用共享锁。同一属性表中可以存在多个共享锁,但是存在共享锁时,不允许存在排他锁。
对属性表或要素类进行更改,将应用排他锁。
在应用程序或者脚本释放数据集之前,锁将一直存在脚本中,可以用del语句删除游标对象,一边释放该游标对象设置在数据集上的排他锁,如下需要两个del语句,一个删除行对象,一个删除游标对象:
improt arcpy
fc="c:/Data/study.gdb/roads"
cursor=arcpy.da.UpdateCursor(fc, ["ACRES","SHAPE_AREA"])
for row in cursor:
if row[0]=="MAIN ST":
cursor.deleteRow()
del row
del cursor
使用了with语句后,就不需要再使用del语句了
在python中使用SQL
在地理处理中,经常需要使用结构化查询语言SQL查询数据,SQL可以定义一个或者多个有属性,运算符,和算式组成的条件语句。ArcMap 里的按属性选择功能就需要使用SQL,ArcToolBox(包括选择工具)很多工具也需要用到SQL
python中使用SearchCursor 函数可以执行SQL语句,其中where_clause可以表示SQl表达式:
arcpy.da.SearchCursor(in_table, field_names,{where_clause},{spatial_reference},{explore_to_points})
查询不同的数据集,where_clause参数中的SQL语句会存在细微差别,但是都遵循SQL的语法规则,下面是一段SQL表达式代码:
improt arcpy
fc="c:/Data/study.gdb/roads"
cursor=arcpy.da.SearchCursor(fc,["NAME","CLASSCODE"],'"CLASSCODE"=1')
for row in cursor:
print row[0]
del row
del cursor
SQL的语法是比较繁杂的,针对不同格式的要素,会有不同的语法,例如不同的要素类的字段分割符是不同的,为了防止混淆并确保字段分隔符的准确性,可以使用AddFieldDelimiters函数
AddFieldDelimiters(datasource,field)
该函数可以识别正在使用的数据集的类型,然后添加正确的字段分隔符:
improt arcpy
fc="c:/Data/study.gdb/roads"
fieldname="CITY"
delimfield=arcpy.AddFiledDelimiters(fc,fieldldname)
cursor=arcpy.da.SearchCursor(fc,["NAME","CLASSCODE"],delimfield+"= 'LONGWOOD'")
for row in cursor:
print row[0]
del row
del cursor