【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表

根据现在村规成果要求,【空间功能结构调整表】是必需的。

以福建省为例,它长这样:

【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表_第1张图片下面就来实现从现状用地和规划用地导出这样的Excel表格。


一、要实现的功能

【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表_第2张图片

如上图所示,点击【汇总村庄空间功能结构调整表】工具,选择【现状用地】和【规划用地】图层,选择要保存输出的Excel文件路径,再点击【执行】即可。

生成结果如下:

【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表_第3张图片

PS:注意输入的【现状用地】和【规划用地】的规范要求

一、【现状用地】

输入的【现状用地】图斑需要注意要有2个字段:【JQDLBM】和【CZCSXM】。

【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表_第4张图片

【JQDLBM】是村规入库的标准代码,即基期地类编码。

【CZCSXM】是三调自带的字段,用来表示三调用地的城镇村属性。201、201A是城市建设用地,202、202A是建制镇建设用地,203、203A是村庄建设用地。这里提取【201、201A、202、202A】作为城镇用地。

二、【规划用地】

输入的【规划用地】图斑需要注意要有2个字段:【GHDLBM】和【SSBJLX】。

【GHDLBM】和【SSBJLX】都是村规入库的标准代码。

【GHDLBM】即规划地类编码。

【SSBJLX】用来表示规划用地的城镇村属性,字段值为【Z】则表示该地块为城镇用地。这里为了照顾输入时的误差,字段值为小写的【z】也可以被认得。

【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表_第5张图片


二、实现流程

工具的实现流程和我的上一篇文章很像:

【ArcGIS Pro二次开发】(28):用地图斑导出用地用海汇总表

流程长但不复杂,更重要的是Excel模板和输入【现状用地、规划用地】的准备。

1、准备Excel模板

一、【空间功能结构调整表】模板

【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表_第6张图片

首先是要输出表的模板,需要输入的单元格包括面积、比重、和面积增减。这里的大部分面积值由用地汇总而来,部分合计值、比重以及面积增减值就在Excel里用公式计算。另外,还需要一个参照列,用来属性映射。

二、【用地用海代码_村庄功能】属性映射表

这个表格是作为用地用海代码向村庄功能映射的参照表,将用地用海代码转换成村庄功能代码。

【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表_第7张图片

2、主要代码

实现功能的主要流程如下:

            // 获取默认数据库
            string init_gdb = Project.Current.DefaultGeodatabasePath;
            // 获取默认文件夹位置
            string init_path = Project.Current.HomeFolderPath;
            
            // 获取参数
            string yd_xz = combox_fc_xz.Text;           // 现状用地
            string yd_gh = combox_fc_gh.Text;         // 规划用地
            string excel_GN = init_path + @"\用地用海代码_村庄功能.xlsx";    // 村庄功能映射Excel
            string excel_TZB = textExcelPath.Text;      // 输出空间功能结构调整表Excel
            string output_table_xz = init_gdb + @"\output_table_xz";
            string output_table_gh = init_gdb + @"\output_table_gh";
            string statistics_fields = "Shape_Area SUM";
            string field_xz = "JQDLBM";
            string field_gh = "GHDLBM";
            string field_GN = "村庄功能";

            // 复制模板Excel和输出结果Excel
            ToolManager.CopyResourceFile(@"CCTool.Excel.用地用海代码_村庄功能.xlsx", excel_GN);
            ToolManager.CopyResourceFile(@"CCTool.Excel.【模板】空间功能结构调整表.xlsx", excel_TZB);
            // 现状、规划用地功能映射
            GN_Mapper(yd_xz, field_xz, field_GN, excel_GN);
            GN_Mapper(yd_gh, field_gh, field_GN, excel_GN);
            // 统计面积
            ToolManager.MultiStatistics(yd_xz, output_table_xz, statistics_fields, new List() { field_GN }, "总计", 1, true);
            ToolManager.MultiStatistics(yd_gh, output_table_gh, statistics_fields, new List() { field_GN }, "总计", 1, true);
            // 删除中间字段
            Arcpy.DeleteField(yd_xz, field_GN);
            Arcpy.DeleteField(yd_gh, field_GN);
            // 属性映射至Excel
            ToolManager.ExcelAttributeMapper(excel_TZB + @"\sheet1$", 13, 6, "output_table_xz", @"分组字段", "SUM_Shape_Area", 5);
            ToolManager.ExcelAttributeMapper(excel_TZB + @"\sheet1$", 13, 8, "output_table_gh", @"分组字段", "SUM_Shape_Area", 5);
            // 删除0值行
            ToolManager.Delete0Row(excel_TZB + @"\sheet1$", new List() {6, 8}, 5);
            // 删除参照列
            ToolManager.DeleteColumns(excel_TZB + @"\sheet1$", new List() { 13 });
            // 删除中间数据
            Arcpy.Delect(new List() { output_table_xz, output_table_gh });

其中【GN_Mapper】方法用于计算城村庄功能字段:

        // 村庄功能映射
        public async void GN_Mapper(string yd, string field_bm, string field_GN, string excel_GN)
        {
            // 汇总统计现状用地
            Arcpy.AddField(yd, field_GN, "TEXT");     // 添加一个参照字段
            // 属性映射
            ToolManager.AttributeMapper(yd, field_bm, field_GN, excel_GN + @"\sheet1$");
            // 计算城镇用地
            var map = MapView.Active.Map;
            FeatureLayer init_layer = map.FindLayers(yd)[0] as FeatureLayer;
            await QueuedTask.Run(() =>
            {
                using (ArcGIS.Core.Data.Table table = init_layer.GetTable())
                {
                    using (RowCursor rowCursor = table.Search(null, false))
                    {
                        TableDefinition tableDefinition = table.GetDefinition();
                        while (rowCursor.MoveNext())
                        {
                            using (Row row = rowCursor.Current)
                            {
                                if (field_bm == "JQDLBM")
                                {
                                    // 获取value
                                    var va = row["CZCSXM"].ToString();
                                    // 赋值
                                    if (va == "202" || va == "202A" || va == "201" || va == "201A")
                                    {
                                        row[field_GN] = "城镇用地";
                                    }
                                }
                                else if (field_bm == "GHDLBM")
                                {
                                    // 获取value
                                    var va = row["SSBJLX"].ToString();
                                    // 赋值
                                    if (va == "Z" || va == "z")
                                    {
                                        row[field_GN] = "城镇用地";
                                    }
                                }
                                row.Store();
                            }
                        }
                    }
                }
            });
        }

流程里涉及到的其它功能包括:复制Excel、属性映射、统计面积、Excel属性映射、删除0值行等,可以在以往的文章里查到,具体可以看上一篇文章,或在文章末尾提供的工程文件里查看。实在也没什么好讲的。

PS:这次提供的工程文件和别的工具合在一起了。代码里的功能嵌套越来越多,分离开来反而很麻烦,就将整个工具包一块分享了。


三、工程文件分享

最后,放上工程文件的链接:

StatisticVillagehttps://pan.baidu.com/s/1nsjUHqRqfogHrjis5pXDXw?pwd=dwsv

PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

你可能感兴趣的:(ArcGIS,Pro,SDK,ArcGIS,c#,二次开发,arcgis,pro,arcgis,pro,sdk,村庄规划)