【ArcGIS Pro二次开发】(66):三调规程_土地利用现状分类面积汇总表

之前做了一个三调的土地利用现状分类统计表,是按照自己的习惯做的,发现不符合土规专业的要求,于是翻开三调规程,按规范重新制作。


一、要实现的功能

如上图所示,在【规划应用】组---【三调】面板下,点击【1、土地利用现状分类面积汇总表】工具。

在弹出的工具框中,分别输入参数:

1、输入三调图层。

2,3、参数2和3是可选参数。用于需要按地块进行分区统计的情况。参数3为参数2中用于标记地块名称的字段。

4、汇总面积。工具预设了3种,【shape_area、TBMJ、TBDLMJ】。【shape_area】即投影面积,【TBMJ】即椭球面积,【TBDLMJ】为椭球面积扣去扣除面积,即净面积。

5、面积单位。工具预设了【平方米、公顷】2种。

6、输出Excel统计表的位置。

生成结果如下:


二、实现流程

因为全部代码比较长,这里只贴出主流程代码,其中部分汇总数据以及对Excel表的操作,之前的文章都有说到,可以回头翻阅一下。

cs 复制代码
// 复制嵌入资源中的Excel文件
ToolManager.CopyResourceFile(@"CCTool.Data.Excel.三调规程.土地利用现状分类面积汇总表.xlsx", excel_path);
ToolManager.CopyResourceFile(@"CCTool.Data.Excel.三调用地自转换.xlsx", folder_path + @"\三调用地自转换.xlsx");

// 放到新建的数据库中
Arcpy.CreateFileGDB(folder_path, "新数据库");
string new_gdb = $@"{folder_path}\新数据库.gdb";

if (fc_area_path == "")  // 如果没有分地块统计
{
    Arcpy.CopyFeatures(fc_path, $@"{new_gdb}\{fc_path}");
}

else   // 如果分地块统计
{
    // 按属性分割
    Arcpy.SplitByAttributes(fc_area_path, new_gdb, name_field);
}

// 收集分割后的地块
List<string> list_area = ToolManager.GetFeatureClassAndTablePath(new_gdb);
// 新建的gdb列表
List<string> gdb_list = new List<string>();

foreach (var area in list_area)
{
    // 裁剪新用地
    string area_name = area[(area.LastIndexOf(@"\") + 1)..];
    string new_fc = $@"{new_gdb}\{area_name}_裁剪结果";

    Arcpy.Clip(fc_path, area, new_fc);

    // 如果是计算图斑面积,就重新计算
    if (area_field == "TBMJ")
    {
        Arcpy.CalculateField(new_fc, "TBMJ", "!shape.geodesicarea!");
    }
    else if (area_field == "TBDLMJ")
    {
        Arcpy.CalculateField(new_fc, "TBDLMJ", "!shape.geodesicarea! * (1-!KCXS!)");
    }

    // 添加一个类一、二级字段
    Arcpy.AddField(new_fc, "mc_1", "TEXT");
    Arcpy.AddField(new_fc, "mc_2", "TEXT");

    // 用地编码转换
    ToolManager.AttributeMapper(new_fc, "DLMC", "mc_1", folder_path + @"\三调用地自转换.xlsx\一级$");
    ToolManager.AttributeMapper(new_fc, "DLMC", "mc_2", folder_path + @"\三调用地自转换.xlsx\二级$");

    // 将新用地按【坐落地代码名称】分割放入新的数据库,并收集,方便下一步处理
    Arcpy.CreateFileGDB(folder_path, $"{area_name}_裁剪结果");
    gdb_list.Add(@$"{folder_path}\{area_name}_裁剪结果.gdb");
    // 再分割
    Arcpy.SplitByAttributes(new_fc, $@"{folder_path}\{area_name}_裁剪结果.gdb", "ZLDWDM;ZLDWMC");
    // 收集分割后的地块
    List<string> list_area_detail = ToolManager.GetFeatureClassAndTablePath($@"{folder_path}\{area_name}_裁剪结果.gdb");

    // 新建sheet
    ToolManager.ExcelCopySheet(excel_path, "sheet1", area_name);
    string new_sheet_path = excel_path + @$"\{area_name}$";

    // 处理每个行政单位
    int start_row = 7;
    List<int> row_list = new List<int>();
    foreach (var area_detail in list_area_detail)
    {
        // 复制行
        ToolManager.CopyRow(new_sheet_path, "A6:BS6", $"A{start_row}");
        // 记录写入行数的列表
        row_list.Add(start_row);
        // 要处理的要素名称
        string area_name_detail = area_detail[(area_detail.LastIndexOf(@"\") + 1)..];
        // 获取行政代码和行政名称
        string ad_name = area_name_detail[(area_name_detail.LastIndexOf(@"_") + 1)..];
        string ad_code = area_name_detail[1..area_name_detail.LastIndexOf(@"_")];

        // 汇总大、中类
        List<string> list_bm = new List<string>() { "mc_1", "mc_2" };
        // 单位转算【1:公顷,4:平方米】
        int unit_index = 0;
        if (unit == "平方米") { unit_index = 4; }
        else if (unit == "公顷") { unit_index = 1; }

        ToolManager.MultiStatistics(area_detail, gdb_path + @"\statistic_sd", area_field + " SUM", list_bm, "国土调查总面积", unit_index);

        // 将映射属性表中获取字典Dictionary
        Dictionary<string, string> dict = ToolManager.GetDictFromTable(gdb_path + @"\statistic_sd", @"分组字段", "SUM_" + area_field);
        // 加入行政代码和名称
        dict.Add("名称", ad_name);
        dict.Add("代码", ad_code);

        // 属性映射到Excel
        ToolManager.ExcelAttributeMapperCol(new_sheet_path, 2, start_row, dict);
        // 进入下一个行政单位
        start_row++;
    }
    // 删除空列
    ToolManager.DeleteNullColByList(new_sheet_path, row_list);
    // 删除行
    ToolManager.DeleteRows(new_sheet_path, new List<int>() { 6, 2 });
}

// 删除中间数据
Arcpy.Delect(gdb_path + @"\statistic_sd");
File.Delete(folder_path + @"\三调用地自转换.xlsx");
Directory.Delete(new_gdb, true);
foreach (var item in gdb_list)
{
    Directory.Delete(item, true);
}

三、工具文件分享

我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:

【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

相关推荐
新中地GIS开发老师13 小时前
《Vue进阶教程》(12)ref的实现详细教程
前端·javascript·vue.js·arcgis·前端框架·地理信息科学·地信
GZ同学14 小时前
Arcgis中python工具箱制造要点及统计要素图层字段信息工具分享
python·arcgis
孙 悟 空2 天前
ArcGIS Maps SDK for JavaScript:根据经纬度定位,并添加定位标记
javascript·arcgis
GIS思维2 天前
ArcGIS Pro品字型标记符号填充
arcgis·arcgis pro·arcgis pro符号填充
wuningw3 天前
ant-design-ui的Select选择器多选时同时获取label与vaule值
ui·arcgis
GISerQ.4 天前
ArcGIS计算土地转移矩阵
arcgis·土地利用·土地转移矩阵
小仙有礼了5 天前
Arcgis for javascript 开发学习经验
javascript·学习·arcgis
规划GIS会5 天前
【ArcGIS Pro】实现一下完美的坐标点标注
arcgis
中科GIS地理信息培训5 天前
ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关
arcgis·分类·回归·arcgis pro
赵钰老师5 天前
【ArcGIS Pro】水文水资源、水生态与水环境
人工智能·python·机器学习·arcgis·chatgpt·数据分析