Arcpy案例:用地用海分类面积统计

222 阅读1分钟

需求说明

在城乡规划中,需要对用地用海分类地块图斑进行分别统计,例如:林地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工具导入

插件效果: