农村土地承包经营权二轮延包—生成地块的KJZB字段
"关于地块的空间坐标(KJZB)字段,可能稍微复杂一点,用脚本生成较好。空间坐标,目前有两种表达:方案一,根据地块上界址点的个数依次填上(如4个为J1/J2/J3/J4);方案二,根据地块上的界址点的界址点号填的(从编号1开始)。由于之前生成界址点是按照顺时针排的,采用方案一。"
1、数据准备
根据地块(DK.shp)要素图层上界址点(JZD.shp)要素图层中点的个数,给地块要素图层“KJZB”字段填写数据。要素图层:DK.shp、JZD.shp,地块要素图层“KJZB”字段如果不存在,会新建该字段。
地块的矢量数据如果有“KJZB”字段的,涉及到更新。建议将“KJZB”字段先都改为''。方便更新字段。
接下来打开工具的脚本,单击鼠标右键,选择属性,找到源,将源的路径替换你下载的py文件的路径。这样脚本才能使用。
2、脚本代码
脚本工具打开后,将地块、界址点填入,确定就能执行。
具体代码:
# -*- coding: utf-8 -*-
import arcpy
import sys
# 设置默认编码为UTF-8
reload(sys)
sys.setdefaultencoding('utf-8')# 设置工作空间和输入图层
arcpy.env.workspace = "C:/data"
dk_layer = arcpy.GetParameterAsText(0) # 地块图层
jzd_layer = arcpy.GetParameterAsText(1) # 界址点图层try:# 确保KJZB字段存在if "KJZB" not in [f.name for f in arcpy.ListFields(dk_layer)]:arcpy.AddField_management(dk_layer, "KJZB", "TEXT", field_length=255)# 使用空间连接统计每个地块包含的界址点temp_table = "in_memory/temp_join"arcpy.SpatialJoin_analysis(dk_layer, jzd_layer, temp_table,"JOIN_ONE_TO_ONE", "KEEP_ALL",match_option="CONTAINS")# 创建字典存储地块ID与点数量的映射count_dict = {}with arcpy.da.SearchCursor(temp_table, ["TARGET_FID", "Join_Count"]) as cursor:for row in cursor:count_dict[row[0]] = row[1]# 更新KJZB字段with arcpy.da.UpdateCursor(dk_layer, ["OID@", "KJZB"]) as cursor:for row in cursor:if row[0] in count_dict:count = count_dict[row[0]]jzd_list = ["J{}".format(i+1) for i in range(count)]row[1] = "/".join(jzd_list)cursor.updateRow(row)# 清理临时数据arcpy.Delete_management(temp_table)arcpy.AddMessage( u"处理完成!")except arcpy.ExecuteError as e:arcpy.AddError("地理处理失败: {}".format(e))
except Exception as e:arcpy.AddWarning("其他错误: {}".format(e))
3、视频演示
具体的操作视频:
生成地块的空间坐标