需求说明
在城乡规划中,需要对用地用海分类地块图斑进行分别统计,例如:林地xx公顷、耕地xx公顷等,结果模板表大致如下:
地类分类代码参考《国土空间调查、规划、用途管制用地用海分类指南》,用地用海分类代码部分规则如下
代码实现
建立分类代码索引
根据《分类指南》,建立分类索引文件,保存至一个文件中:
实现主体代码
def YDYH_feature_statics(data_path,mc_field,dm_field,mj_field,res_path):
"""用地用海分类统计"""
# 面积统计字典
square_statics_dict={}
# 从索引中提取分类代码表
spot_classes_list=YDYH_classes.keys()
# 对索引代码表进行排序,易于后续成果录入
spot_classes_list.sort()
# 建立结果表,主要包含分类代码、地类名、面积
for i,value in enumerate(spot_classes_list):
square_statics_dict[value]={"square":0,"name":YDYH_classes[value]}
# 读取要素属性表
data_table=arcpy.SearchCursor(data_path)
# 计算并分类统计面积
for row in data_table:
# 计算统计二级分类总面积
square_statics_dict[row.getValue(dm_field)]["square"]+=float(row.getValue(mj_field))
# 计算统计一级分类总面积,一级分类代码取二级分类代码的前两位
square_statics_dict[row.getValue(dm_field)[:2]]["square"] += float(row.getValue(mj_field))
# 新建excel表保存数据
workbook = xlwt.Workbook(encoding="utf-8")
sheet = workbook.add_sheet("DLTJ", cell_overwrite_ok=True)
# 写入excel表
for i,item in enumerate(spot_classes_list):
sheet.write(i, 0, item)
sheet.write(i, 1, square_statics_dict[item]["name"])
sheet.write(i, 2, square_statics_dict[item]["square"])
# 保存excel表
workbook.save(res_path)
参数获取部分
# 要素路径
feature_path = arcpy.GetParameterAsText(0)
# 分类名字段
name_field = arcpy.GetParameterAsText(1)
# 分类代码字段
code_field = arcpy.GetParameterAsText(2)
# 面积字段
square_field = arcpy.GetParameterAsText(3)
# 输出路径,excel表
out_path = arcpy.GetParameterAsText(4)
函数调用
YDYH_feature_statics(feature_path,name_field,code_field,square_field,out_path)
ArcGIS工具导入
插件效果: