目标:批量统计每个面要素上各个面上各个类型点的数量
研究单元和数据示例:
如果使用空间连接工具进行一个一个处理,那枯燥且漫长。如果使用模型构建器(只允许一个迭代)或者批处理又无法达到把空间连接的结果都在一个表上显示出来。所以使用arcpy
思路:遍历每一类点数据,并与研究单元图层taz进行空间连接,将结果放到中间图层test中,然后删除原研究单元,最后将test拷贝为taz,随后删除test。接下来处理字段,因为空间连接输出的计算字段名默认为Join_count,为防止后续迭代同名的冲突,新建一个字段存放此结果。此处新建的字段名为当前进行空间连接的点数据类型名,使用字段计算器将值将Join_count中的值放入该字段后,删除Join_count。这样就完成了一个类型点数据的统计,接下来就是反复迭代直至最后。
注:以上数据均存储在一个文件地理数据库中
初始工作:导入包,设置工作空间和变量
# POI统计.py
# Created on: 2021-06-27 10:28:59.00000
# (generated by ArcGIS/ModelBuilder)
# Description:
# ---------------------------------------------------------------------------
# Import arcpy module
import arcpy
from arcpy.arcobjects.arcobjects import Field
# Local variables:
arcpy.env.workspace="G:\\功能区提取\\POI\\三级类\\POI数据库.gdb"
arcpy.env.overwriteOutput = True
featurename="TAZ"
运行主体:
fcs = arcpy.ListFeatureClasses(feature_type='Point')
for fc in fcs:
print(fc)
# Process: 空间连接
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(featurename)
arcpy.SpatialJoin_analysis(featurename, fc, 'test', "JOIN_ONE_TO_ONE", "KEEP_ALL",fieldmappings, "INTERSECT")
#删除上一次的目标要素featurename
arcpy.DeleteFeatures_management(featurename)
#拷贝这一次的输出要素,重新设定featurename
arcpy.CopyFeatures_management('test',featurename)
#获取featurename字段名
# fieldName = []
# fields = arcpy.ListFields(featurename)
# for field in fields:
# fieldName.append(field.name)
# print(fieldName)
# 删除这一次的输出
arcpy.DeleteFeatures_management('test')
# 删除多余的字段
arcpy.DeleteField_management(in_table=featurename,drop_field=['INTERSECT','TARGET_FID'])[0]
# 增加计数字段,设定为图层名
arcpy.AddField_management(featurename,fc,'LONG')[0]
# Process: 计算字段 (计算字段)
arcpy.CalculateField_management(in_table=featurename, field=fc, expression="!Join_Count!", expression_type="PYTHON3", code_block="", field_type="TEXT")[0]
# 删除join_count字段
arcpy.DeleteField_management(in_table=featurename,drop_field=['Join_Count'])[0]
#明确当前处理过程
print('当前处理完{}图层'.format(fc))
运行结果: