bb一句,原本不知道ArcPy的游标是什么意思,今天学习了一下,又学废了。教程在这里了,数据在文章最后。上传图片好麻烦,你们就自己打开数据看属性表吧

8.2 使用SearchCursor检索要素类中要素

与SearchCursor ()函数一同使用的with 语句用来创建、打开和关闭游标,因此,不需要再像使用ArcGIS 10 . 1 之前的版本那样手动释放游标锁定。传入SearchCu r sor()函数的第l 个参数是要素类,本节传入的是School s .shp 文件。第2 个参数是Python 元组,用于存储游标中返回的字段列表。为了提高游标的性能,最好的做法是在游标中限制字段的个数,只返回完成任务所需的字段。在这个例子中,指定返回Facility 和Name字段, SearchCursor 对象存储在名为cursor 的变量中。在with 语句块中,使用for 循环来遍历返回的学校,也使用了sorted ()函数对游标的内容进行排序。要访问某行中字段的值,只需要使用该字段的索引值来返回。在这个例子中,要返回Name 列的内容,它的索引值是l ,因为在返回的含有字段名称的元组中它是第2 项(索引值从0 开始〉。

# coding=utf-8
import arcpy.da
# 设置工作空间
arcpy.env.workspace = "C:/ArcpyBook/Ch8"
# 使用with语句创建游标
with arcpy.da.SearchCursor("Schools.shp",("Facility","Name")) as cursor:
    # 使用for循环遍历SearchCursor中的行,输出学校的等级和名称。注意要确保for循环缩进在with语句中
    for row in sorted(cursor):
        print("School name: " + row[0] + "  " + row[1])
School name: ELEMENTARY SCHOOL  ALLAN
School name: ELEMENTARY SCHOOL  ALLISON
School name: ELEMENTARY SCHOOL  ANDREWS
School name: ELEMENTARY SCHOOL  BARANOFF
School name: ELEMENTARY SCHOOL  BARRINGTON
School name: ELEMENTARY SCHOOL  BARTON CREEK
...

8.3 使用where子句筛选记录

默认情况下,当创建了一个SearchCursor 对象后,表或要素类中的所有行都将被返回。但是,在大多数情况下,需要限制返回的记录,可以在调用SearchCursor ()函数时,创建一个查询,将它作为参数传入where 子句来实现。本节将在8.2 节脚本的基础上添加一个where 子句来限制返回的记录。

# coding=utf-8
import arcpy.da
# 设置工作空间
arcpy.env.workspace = "C:/ArcpyBook/Ch8"
# 使用with语句创建游标
with arcpy.da.SearchCursor("Schools.shp",("Facility","Name"),'"FACILITY" = \'HIGH SCHOOL\'') as cursor:
    # 使用for循环遍历SearchCursor中的行,输出学校的等级和名称。注意要确保for循环缩进在with语句中
    for row in sorted(cursor):
        print("School name: " + row[0] + "  " + row[1])

输出

School name: HIGH SCHOOL  AKINS
School name: HIGH SCHOOL  ALTERNATIVE LEARNING CENTER
School name: HIGH SCHOOL  ANDERSON
School name: HIGH SCHOOL  AUSTIN
...

8.4 使用几何令牌改进游标性能

为了改进游标的性能, ArcGJS 1 0.l 引入了geome町tokens (几何令牌〉,使用几何令牌可以只返回几何的一部分信息,而不是返回游标中的全部要素的几何信息。返回整个要素的几何信息会导致游标性能下降,因为需要返回大量数据,而只返回需要的特定的几何部分明显提高了游标的速度。令牌是作为字段列表中的一个字段被传入游标的构造函数的,其格式为SHAPE@<Part ofFeature to be Returned>。这个格式唯→例外的是OID @令牌,即要素对象的ID 。下面的代码示例用于返回要素的x、Y 坐标。

with arcpy.da.SearchCursor(fc, (”SHAPE@XY”,” Facility”,”Name ”) ) as cursor:
# coding=utf-8
import arcpy.da
import time
# 设置工作空间
arcpy.env.workspace = "C:/ArcpyBook/ch8"
# 计算使用几何令牌执行代码的时间,添加以下代码,记录起始时间
start = time.clock()
# 使用with语句创建游标,返回每个要素的质心坐标和存储在PY_FULL_OW字段中的所有权信息
with arcpy.da.SearchCursor("coa_parcels.shp",("PY_FULL_OW","SHAPE@XY")) as cursor:
    # 使用for循环遍历SearchCursor的每一行,输出土地所有者的名称和地理坐标,要确保for循环缩进在with语句下。
    for row in cursor:
        print("土地所有者:{0} 有一个位置{1}".format(row[0],row[1]))
# 计算程序执行的时间并输出
elapsed = (time.clock() - start)
print("Execution time: " + str(elapsed))

输出:

...
土地所有者:CITY OF AUSTIN ATTN REAL ESTATE DIVISION 有一个位置(3110670.413783513, 10070800.960865)
土地所有者:CITY OF AUSTIN 有一个位置(3143925.0013213265, 10029388.97419636)
土地所有者:CITY OF AUSTIN % DOROTHY NELL ANDERSON ATTN BARRY LEE ANDERSON 有一个位置(3134432.983822767, 10072192.047894118)
Execution time: 1.0015463

8.5 使用InserCursor插入行

lstfires 变垦是一个包含所有wildfires数据的列表, wildfires 数据存储在逗号分隔的文本文件中。使用for 循环遍历记录的每一行,并将每个单独的记录插入到fire 变量中。for 循环中有一个if 语句用于跳过文件的第l 行记录,该行记录为表头。正如前文所述,首先,将vals 列表中的纬度、经度和置信度值分别赋给latitude 、longitude 不JI confid 变量,其次按照之前定义InsertCursor 的顺序将这些数值存储在一个名为主owValue 的新列表变量中, 所以,经纬度应该放置在首位, 其后是置信度值。然后调月~ I n sertCursor 对象的i n sertRow ()函数,传入新的rowValue 变革:。最后输出指示脚l本ill度的消息,井创建except 和lfinally i吾句块来处理错误并关闭文本文件。在finally 语句块中添加file . close ()方法,这样能确保即使在前面的try 语句块中出现错误JI才, 也能够关闭文件。

代码

# coding=utf-8
import arcpy
arcpy.env.workspace = r"C:\ArcpyBook\Ch8\WildfireData\WildlandFires.mdb"
# 打开文本文件,将所有的行读入列表中
f = open(r"C:\ArcpyBook\Ch8\WildfireData\NorthAmericaWildfires_2007275.txt","r")
lstFires = f.readlines()
try:
    # 使用with语句创建InsertCursor对象
    with arcpy.da.InsertCursor("FireIncidents",("SHAPE@XY","CONFIDENCEVALUE")) as cur:
        # 创建一个计数器变量,用于显示脚本的进度
        cntr = 1
        for fire in lstFires:
            if 'Latitude' in fire:
                continue
            vals = fire.split(",")
            latitude = float(vals[0])
            longitude = float(vals[1])
            confid = int(vals[2])
            rowValue = [(longitude,latitude),confid]
            cur.insertRow(rowValue)
            print("Record number " + str(cntr) + "written to feature class")
            cntr = cntr + 1
except Exception as e:
    print(e.message)
finally:
    f.close()

输出:

Record number 405written to feature class
Record number 406written to feature class
Record number 407written to feature class
Record number 408written to feature class
Record number 409written to feature class
...

8.6 使用UpdateCursor更新行

UpdateCursor ()函数可用于更新或删除表或要索类中的行。返回的游标将会锁定数据, 如果在with 语句中使用游标,则会自动释放数据锁定。调用该函数将返回UpdateCursor 对象。UpdateCursor 对象将会锁定要编辅或删除的数据, 如果在with 语句中使用游标,数据处理完成后将会自动释放前:标。但在ArcGIS IO . I 之前的版本中, 游标需要使用Python的del 语句手I;IJ释放。-且获得一个UpdateCursor 实例, 就可以调用UpdateCursor ()
函数来更新表或要素类的记录, 也可以调用deleteRow ( )方法来删除一行记录。本节将编写脚本来更新Fire Incidents 要素类巾的每个要素, 使用UpdateCursor把poor 、fa i r 、good 或excellent 赋值给新的字段,新宇段是对置信度值的进一步描述。更新记录之前, 需要将新宁段添加到Fireincidents 要素类中。

代码

# coding=utf-8
import arcpy
arcpy.env.workspace = r"C:\ArcpyBook\Ch8\WildfireData\WildlandFires.mdb"
try:
    # 在FireIncidents要素类中添加名为CONDFID_RATING的新字段
    arcpy.AddField_management("FireIncidents","CONFID_RATING","TEXT","10")
    print("CONFID_RATING field added to FireIncidents")
    with arcpy.da.UpdateCursor("FireIncidents",("CONFIDENCEVALUE","CONFID_RATING")) as cursor:
        # 创建一个计数器变量,用来输出脚本的进度
        cntr = 1
        # 循环FireIncidents要素类的每一行,并依据以下准则更新CONFID_RATING字段
        # 置信度(0~40) = POOR
        # 置信度(41~60) = FAIR
        # 置信度(61~85) = GOOD
        # 置信度(86~100) = EXCELLENT
        for row in cursor:
            # 更新CONFID_RATING字段
            if row[0] <= 40:
                row[1] = 'POOR'
            elif row[0] > 40 and row[0] <=60:
                row[1] = 'FAIR'
            elif row[0] > 60 and row[0] <= 85:
                row[1] = 'GOOD'
            else:
                row[1] = 'EXCELLENT'
            cursor.updateRow(row)
            print("Record number " + str(cntr)  + " updated")
            cntr = cntr + 1
except Exception as e:
    print (e.message)

输出:

Record number 405 updated
Record number 406 updated
Record number 407 updated
Record number 408 updated

8.7 使用UpdateCursor删除行

UpdateCursor 除了可以更新记录,还可以删除表或要素类的记录。在更新或删除记录时, UpdateCursor 对象的创建方式是相同的,但删除记录调用的是deleteRow ()而不是updateRow ()。也可以使用where 子句来限制运回的记录。本节将使用where 子句筛选过的UpdateCursor 对象来删除Fire Incidents 要素类中的记录。

代码:

# coding=utf-8
import arcpy
arcpy.env.workspace = r"C:\ArcpyBook\Ch8\WildfireData\WildlandFires.mdb"
try:
    with arcpy.da.UpdateCursor("FireIncidents",("CONFIDENCEVALUE"),'[CONFID_RATING] = \'POOR\'') as cursor:
        # 创建一个计数器变量,用来输出脚本的进度
        cntr = 1
        for row in cursor:
            cursor.deleteRow()
            print("Record number " + str(cntr)  + " deleted")
            cntr = cntr + 1
except Exception as e:
    print (e.message)

输出:

Record number 31 deleted
Record number 32 deleted
Record number 33 deleted
Record number 34 deleted

要素类和表中的行可以使用UpdateCursor 中的deleteRow ()方法删除,本节在UpdateCursor 构造函数中使用where 子句来限制CONFID RATING 宇段返回值为POOR 的要素。然后循环遍历游标返回的要素,井调deleteRow ()方法删除要素类中的行。

8.8 在编辑会话中插入和更新行

代码

import arcpy
import os
arcpy.env.workspace = "C:/ArcpyBook/Ch8/WildfireData/WildlandFires.mdb"
try:
	edit = arcpy.da.Editor('C:/ArcpyBook/Ch8/WildfireData/WildlandFires.mdb')
	edit.startEditing(True)
	with arcpy.da.UpdateCursor("FireIncidents",("CONFIDENCEVALUE","CONFID_RATING")) as cursor:
		cntr = 1
		for row in cursor:
			# update the confid_rating field
			if row[0] > 40 and row[0] <= 60:
				row[1] = 'GOOD'
			elif row[0] > 60 and row[0] <= 85:
				row[1] = 'BETTER'
			else:
				row[1] = 'BEST'
			cursor.updateRow(row)
			print("Recond number " + str(cntr) + " updated" )
			cntr += 1
		edit.stopEditing(True)
except Exception as e:
    print(e.message)

输出:

Recond number 368 updated
Recond number 369 updated
Recond number 370 updated
Recond number 371 updated
Recond number 372 updated
教程用的数据在这里:链接:https://pan.baidu.com/s/1QmfsY3lDPB4LbUzorCRuyA 
提取码:duge 
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐