根据《第三次全国国土调查技术规程》,三调中的地类可以归纳为土地管理法中规定的三大类用地。
我们可以在三调中直接统计出这三大类用地的面积。主要方法是在ArcGIS中将这三大类对应的用地提取出来,再进行统计。不过每次都要在复制一长串的筛选语句,贴到GP工具里执行,有点不方便。
于是便做了这个小工具,主打的就是一个懒人需求。
一、要实现的功能
如上图所示,点击【统计三调三大类】按钮,输入用三调图层,需要注意的是要确保图层中有【DLBM】字段,这是三调自带的字段。
第二步输入面积字段,三调的业务我不熟,不知道是要统计的是投影面积还是图斑面积,这里以投影面积为例,输入【shape_area】。
最后输入要导出的Excel表格位置,点击执行即可。
生成结果如下:
二、实现流程
这里的生成结果采用的是Excel文件,所以首先要准备一个Excel模板:
部分单元格使用Excel里的公式计算。
主要流程如下:
1、按【DLBM】汇总面积
Arcpy.Statistics(fc_path, gdb + @"\statistisc_all", bm_field + @" SUM", "DLBM");
2、通过固定的筛选语句选择出三大类用地
// 三大类用地SQL
string sql_nyd = "DLBM IN ('0303','0304','0306','0402','0101','0102','0103','0201','0201K','0202','0202K','0204','0301', '0301K', '0302', '0302K' ,'0305','0307','0401' ,'0402' ,'0403' ,'1006','1103','1104','1104A', '1104K' ,'1107', '1107A', '1202' ,'1203')";
string sql_jsyd = "DLBM IN ('0603','05H1','0508','0601','0602','0701','0702','08H1','08H2','0809','0810','0810A','09','1001', '1002','1003','1004','1005','1007','1008','1009', '1109', '1201')";
string sql_wlyd = "DLBM IN ( '1105','1106' ,'1108' ,'0404' ,'1101' ,'1102','1110','1204' ,'1205' ,'1206' ,'1207' )";
// 筛选三大类用地
Arcpy.TableSelect(gdb + @"\statistisc_all", gdb + @"\statistisc_nyd", sql_nyd);
Arcpy.TableSelect(gdb + @"\statistisc_all", gdb + @"\statistisc_jsyd", sql_jsyd);
Arcpy.TableSelect(gdb + @"\statistisc_all", gdb + @"\statistisc_wlyd", sql_wlyd);
3、分别汇总三大类用地
Arcpy.Statistics(gdb + @"\statistisc_nyd", gdb + @"\all_nyd", "SUM_" + bm_field + @" SUM", "");
Arcpy.Statistics(gdb + @"\statistisc_jsyd", gdb + @"\all_jsyd", "SUM_" + bm_field + @" SUM", "");
Arcpy.Statistics(gdb + @"\statistisc_wlyd", gdb + @"\all_wlyd", "SUM_" + bm_field + @" SUM", "");
4、新建一个共有字段【地类名称】,并赋值,为后面合并用
string filed_dl = "地类名称";
Arcpy.AddField(gdb + @"\all_nyd", filed_dl, "TEXT");
Arcpy.AddField(gdb + @"\all_jsyd", filed_dl, "TEXT");
Arcpy.AddField(gdb + @"\all_wlyd", filed_dl, "TEXT");
Arcpy.CalculateField(gdb + @"\all_nyd", filed_dl, "'" + "农用地" +"'");
Arcpy.CalculateField(gdb + @"\all_jsyd", filed_dl, "'" + "建设用地" + "'");
Arcpy.CalculateField(gdb + @"\all_wlyd", filed_dl, "'" + "未利用地" + "'");
5、合并表格
List<string> files = new List<string>() { gdb + @"\all_nyd", gdb + @"\all_jsyd", gdb + @"\all_wlyd"};
Arcpy.Merge(files, gdb + @"\all_merge", true);
6、因为面积统计结果以公顷为单位,所以这里做了一个面积转换
Arcpy.CalculateField(gdb + @"\all_merge", "SUM_SUM_" + bm_field, "!SUM_SUM_" + bm_field + "!/10000");
7、从生成的统计表属性映射至Excel表格中,这部分内容可以看往期文章,或者直接看工程文件里的代码
// 复制嵌入资源中的Excel文件
ToolManager.CopyResourceFile(@"CCTool.Data.Excel.三调三大地类统计表.xlsx", table_path);
// 将映射属性表中获取字典Dictionary
Dictionary<string, string> dict = ToolManager.GetDictFromTable("all_merge", filed_dl, "SUM_SUM_" + bm_field);
// 属性映射大类
ToolManager.ExcelAttributeMapper(table_path + @"\Sheet1$", 2, 3, dict, 3);
三、工程文件分享
最后,放上工程文件的链接:
StatisticsSDhttps://pan.baidu.com/s/1rHPpNefYc0vAjQA4aGMhrQ?pwd=wyr5PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。