先来一段简单的ArcPy脚本:
# -*-coding:utf-8-*-
import arcpy
try:
source_path_name = r"F:/GIS测试数据/测试.gdb"
source_name = "DLTB"
target_name = "Target_copy"
arcpy.env.workspace = source_path_name
# 覆盖已存在数据
arcpy.env.overwriteOutput = True
print "Copy {0} to {1}".format(source_name, target_name)
arcpy.Copy_management(source_name, target_name)
except arcpy.ExecuteError:
print arcpy.GetMessages()
except Exception as e:
print e.message
1、环境变量设置(env)
1.1、设置当前工作空间,将指定的工作空间用作地理处理工具输入和输出的默认位置。
arcpy.env.workspace = r"F:/GIS测试数据/测试.gdb"
1.2、覆盖任何现有输出。设置为 True 时,工具将执行并覆盖输出数据集。设置为 False 时,将不会覆盖现有输出,工具将返回错误。
arcpy.env.overwriteOutput = True
1.3、设置XY容差
arcpy.env.XYTolerance = "0.01 meters"
1.4、输出去除M值
arcpy.env.outputMFlag = "Disabled"
1.5、输出去除Z值
arcpy.env.outputZFlag = "Disabled"
2、列表函数
2.1、ListDatasets:列出工作空间中的所有数据集。可针对数据集名称和数据集类型指定搜索条件,从而限制返回的列表。
print "存在数据集 {0}".format(arcpy.ListDatasets('*'))
2.2、ListFeatureClasses:列出工作空间中的要素类,受名称、要素类型和可选要素数据集的限制。
print "存在要素类 {0}".format(arcpy.ListFeatureClasses(feature_type="Point"))
2.3、ListTables:按名称和表类型列出工作空间中的表
print "存在表 {0}".format(arcpy.ListTables())
2.4、ListRasters:按名称和栅格类型返回工作空间中的栅格列表。
print "存在栅格数据 {0}".format(arcpy.ListRasters())
2.5、ListFields:列出指定数据集中的要素类、shapefile 或表中的字段。返回的列表可用针对名称和字段类型的搜索条件进行限制,并将包含字段对象。
for field in arcpy.ListFields("F:/GIS测试数据/测试.gdb/DLTB"):
print "{0} is a type of {1} with a length of {2}".format(field.name, field.type, field.length)
3、属性信息(Describe)
ftDesc = arcpy.Describe(source_name)
3.1、获取要素类属性
print "要素类的要素类型 {0}".format(ftDesc.featureType)
print "是否有Z值 {0}".format(ftDesc.hasZ)
print "是否有M值 {0}".format(ftDesc.hasM)
print "指示要素类是否具有空间索引 {0}".format(ftDesc.hasSpatialIndex)
print "Shape 字段的名称 {0}".format(ftDesc.shapeFieldName)
print "几何形状类型 {0}".format(ftDesc.shapeType)
3.2、数据集属性
print "空间坐标系名称 {0}".format(ftDesc.spatialReference.name)
4、游标操作
4.1、查询游标(SearchCursor):
从表中检索的每一行都会作为一组字段值而返回。会按照提供给游标的 field_names 参数的相同顺序返回这些值。游标的 fields 属性也可用于确定字段值的顺序。
with arcpy.da.SearchCursor(r"F:\GIS测试数据\测试.gdb\XZQ", ["OID@"]) as cursor:
for row in cursor:
print "OID:{0}".format(row[0])
通过以下方式获取记录数:
# 方式一
count = len([feature[0] for feature in arcpy.da.SearchCursor(source_name, "OID@")])
# 方式二
count = int(arcpy.GetCount_management(source_name).getOutput(0))
4.2、更新游标(UpdateCursor)
# 删除地类编码为0101的记录
with arcpy.da.UpdateCursor(r'F:\GIS测试数据\测试.gdb\YBH', ['OID@'], "DLBM = '0101'") as cursor:
for row in cursor:
cursor.deleteRow()
# 将面积值赋值给NEW_AREA
with arcpy.da.UpdateCursor(r"F:\GIS测试数据\测试.gdb\XZQ", ["NEW_AREA", "SHAPE@AREA"]) as cursor:
for row in cursor:
row[0] = row[1]
cursor.updateRow(row)
4.3、插入游标(InsertRow)
cursor = arcpy.da.InsertCursor("c:/base/data.gdb/roads_lut", ["roadID", "distance"])
# Create 25 new rows. Set the initial row ID and distance values
for i in range(0, 25):
cursor.insertRow([i, 100])
del cursor
5、令牌
令牌是字段的一种快捷访问方式。常用令牌:
ObjectID字段的令牌:OID@
shape字段的令牌:SHAPE@
要素质心的令牌:SHAPE@XY
X、Y坐标的令牌:SHAPE@X、SHAPE@Y
坐标JSON字符串的令牌:SHAPE@JSON
面积和长度的令牌:SHAPE@AREA、SHAPE@LENGTH
with arcpy.da.SearchCursor(r"F:\GIS测试数据\测试.gdb\XZQ",
["OID@", "SHAPE@", "SHAPE@XY", "SHAPE@X", "SHAPE@Y", "SHAPE@AREA", "SHAPE@LENGTH",
"SHAPE@JSON"], "OBJECTID=1") as cursor:
for row in cursor:
print "OID:{0};Feature:{1};质心:{2};X坐标:{3};Y坐标:{4};面积:{5};长度:{6};" \
"坐标JSON字符串:{7}".format(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7])