使用游标访问数据

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