已知有一个河流的线图层(HydroL)和多个不同用地类型的图层(WoodyA表示绿化用地,ResidentialA表示公共用地,BoundaryA表示其他类型用地),目标是获得每个分区内的河流总长度,该如何实现?
这个问题其实和分区统计管线长度,或者分省统计铁路长度其实是一样的,那么在ArcGIS中,我们要如何实现呢?
图1 现有数据和图例
在本例中,区域之间的重合是被允许的,如果计算的是各行政区的河流(管线)总长度,即各区域之间不允许重合,则在处理之前,需要先进行拓扑修正。
1.修正拓扑错误
1.1建立拓扑
打开ArcCatalog,在要素数据集上右键新建拓扑,按照系统向导一步一步设置:
名称:分区河流长度_Topology;
拓扑容差:保持默认;
参与到拓扑中的要素类:三个面要素;
等级:保持默认;
拓扑规则:BoundaryA不能与其他要素重叠ResidentialA,BoundaryA不能与其他要素重叠WoodyA,ResidentialA不能与其他要素重叠WoodyA。
最终摘要如图。
完成后在弹出的是否立即验证的对话框中选择否。
图2 新建拓扑摘要
1.2修正拓扑错误
打开ArcMap,将新建的拓扑以及对应的数据加载进来。
开启编辑,调用拓扑工具条,将视图缩放到所有图层,单击验证当前范围中的拓扑,然后打开错误检查器,对表格中的拓扑错误逐一排查修正。
图3 拓扑工具条
在每一条错误上右键会显示系统提供的错误修改方法,对于面和面重叠的拓扑错误一般选择系统建议的合并方法即可,单击合并后会出现合并选择对话框,选择需要合并的要素,单击确定修改。
图4 错误检查器
2.标识要素
然后对处理完成的数据,我们需要做的就是让每条河流都有一个字段值可以分辨出它流经的区域,我们通过标识(Identity)工具实现。
打开toolbox, 依次选择分析工具(Analysis Tools) > 叠加分析(Overlay) > 标识(Identity),相关参数设置如下:
图5 标识(Identity)工具对话框
通过以上操作,将河流按woody的边界断开,并生成新的带有woody标识的河流图层,其中每段河流都包含了woody图层的属性。
同理,我们需要将residential和boundary图层也标识到河流上。
再次运行标识(Identity)工具,输入要素:HydroL_Identity1;标识要素:ResidentialA;输出要素:HydroL_Identity2;连接属性:ALL。
第三次运行标识(Identity)工具,输入要素:HydroL_Identity2;标识要素:BoundaryA;输出要素:HydroL_Identity3;连接属性:ALL。
3.计算长度
接下来需要计算新HydroL图层每段河流的长度。
首先需要新建一个字段用于存储河流长度。在内容列表(TOC)中右键HydroL_Identity3图层,单击打开属性表,表选项(Options) > 添加字段(Addfield),字段名为“length”,类型为“双精度”。
图6 新建字段对话框
右键length字段计算几何(CalculateGeometry),打开计算几何对话框,设置如下,计算该坐标投影下每段河流的长度
图7 计算几何对话框
注意:
①计算河流长度要素类必须具有投影坐标系统;
②如果要素类存储在Geodatabase中,则可以直接使用Shape_Length字段中的值。
4.长度统计
下面我们需要根据不同的区域进行长度统计。
打开Toolbox,分析工具(AnalysisTools) > 统计分析(Statistics) > 汇总统计数据(SummaryStatistics),参数设置如下:
图8 汇总统计数据对话框
统计字段:如果是shapefile格式,选择第二步新建的字段;如果是Geodatabase格式,直接选择Shape_Length字段。
统计类型:选择SUM;
案例分组字段:选择具有唯一标识的字段,例如,在本案例中,woody字段中存储的值为1,标识这条河流位于woody区域内。
最终会生成一张dbf表格,内容如下:
图9 最终结果表
SUM_length字段可以清楚地看到每个区域的河流总长度,另外还会发现有些河流没有流经任何区域。
如果没有进行第一步,即允许区域之间重合,那么最终结果还会显示出流经多个区域的河流的长度,如图10所示。
图10 未经拓扑修正的结果图