杨秋菊 任海翔 孙进冬 彭春晖
(江苏省地质测绘院, 江苏 南京 211100)
地理国情监测是对全国陆地国土及毗邻海域范围内地表覆盖、重要地理要素变化情况监测,形成现势性强、精度高、全覆盖的地理国情信息数据库,服务于耕地种植状况监测、生态保护修复效果评价、督察执法监管以及自然资源管理宏观分析等自然资源管理工作,并为各部门和地方政府提供地理国情信息决策支撑[1]。因此,控制地理国情监测数据的质量具有重要意义。而地理国情监测的数据一般是按行政区划分片生产,导致在数据拼接时边界处不可避免地会出现空间和属性不一致的问题。此类问题通过人工接边检查的方式来解决,不仅耗时耗力,而且正确性难以保证。
目前,国内存在地理国情监测数据接边检查软件,但大多都是基于ArcEngine平台二次开发[2],使得软件都依托于ArcGIS,执行的效率较低。本文基于图论在Microsoft Visual Studio 2019 编程环境下,实现了地理国情监测数据的接边算法,并在江苏省宿迁市2020年地理国情监测数据生产过程中验证了该方法的有效性,相比人工和ArcEngine平台二次开发的软件具有明显的效率优势,并且在准确性方面也能有很好的保障。
本次实验数据包含宿迁市宿城区、宿豫区、泗洪县、泗阳县、沭阳县及徐州市新沂市6个区县,面积约8 980 km2,地处江苏省北部,南与淮安市毗连,东与连云港市接壤,北与邳州市相连,西与安徽省交界,处于徐、淮、连的中心地带,以平原为主,河网密布。
图论(Graph Theory)也称拓扑学,是由点和线构成的拓扑结构。本文所用的算法的核心是依据欧拉定理构建一个有效的平面图(Planar Graph),即一个可靠的拓扑空间结构,这个结构必须满足式(1)条件
V-E+F=2
(1)
式中,V为顶点数;E为边数;F为被划分区域数。
对于线(LineString)、面(Polygon)要素(面要素可以看成是首尾闭合的线要素),在线的起点与终点处,以及三交以上的节点处断开,构成由节点和线段组成的平面图,同时创建几何图结构(Geometry Graph Struct),有向边结构(Direct Edge Struct)和节点结构(Node Struct),用来记录边界与图形之间的关系。
如图1所示,以线要素为例,存在线段A和B,构建几何图时,A线段与B线段在节点N1处断开成有向边 c、d和e,生成节点N1、N2、N3和N4。
图1 线要素平面图
创建几何图结构记录各要素所包含的有向边,结构示例如下:
public class PlanarGraph///平面图
{
public IEnumerable< DirectEdge > DirectEdges { get; } ///.Net迭代器,用以遍历此平面图中的全部有向边
public IEnumerable< Node > Nodes { get; } ///.Net迭代器,用以遍历此平面图中的全部节点
public GeometryGraph[] Graphs { get; } ///存储平面图中全部几何图
}
public class GeometryGraph///几何图
{
public int ID { get; } ///图形ID编号
public DirectEdge[] DirectEdges { get; } ///隶属的有向边数组
}
有向边结构记录具体的坐标数组,方向信息与隶属信息,结构示例如下:
public class DirectEdge ///有向边
{
public Coordinate[]Coordinates { get; }///存储有向边具体的坐标数组
public Direction[]Owners{ get; }///存储拥有此有向边的GeometryGraphID以及此GeometryGraph相对于有向边的方向
public class Direction
{
public int ID { get;} ///图形ID编号
public Direction Type {get;} ///图形相对于DirectedEdge的方向
}
public enum Direction
{
Same,///方向与隶属DirectedEdge相同
Different,///方向与隶属DirectedEdge相反
}
}
节点结构记录具体的节点坐标,节点与边界的关系,结构示例如下:
public class Node///节点
{
public Coordinate Vertex { get; } ///存储具体的节点坐标信息
public DirectEdge[] DirectEdges { get; } ///存储通过此节点的有向边数组
}
要素的几何坐标信息只存取一次,减少了数据的冗余。通过两张关系表记录要素边界之间的方向和关系,在接边过程中,通过关系表即可方便地判断出是否存在接边要素,来达到接边检查的目的。
本算法与著名开源软件Geos(Geometry Engine, Open Source)中的GeometryGraph有所不同,本算法中的拓扑空间结构,不记录Label(空间标签),只记录边线的方向。同时在构建几何图过程中,添加了容差因子,使得构建的几何图更具有包容性。
地理国情监测数据一般以经纬度坐标系存储,需将待检查的数据转换为平面投影坐标系。
计算待查图层的空间范围(Extent),使用四叉树(QuadTree)方法创建图层空间索引,加快要素的检索速度。地理国情监测数据的生产一般按县区划分,接边线是不规则的县区界。
为了提高接边检查的效率,先以接边线进行空间查询,获取待查图层中与当前接边线存在相交的要素。将接边线和查询出的相交要素融合在一起,共同构建几何图P1。
2.2.1面要素检查
(1)在几何图P1中筛选出隶属于接边线要素的有向边,逐一遍历该方向边。
(2)对方向边进行判断:若方向边只隶属于两个待检查面要素,且方向相反,则在该段位置上,图形关系正确,存在接边要素;若方向边只隶属于一个待检查面要素,则在该段位置上,不存在接边要素。
以图2为例,面状要素和接边线一起构建几何图,生成有向边a、b…j。其中a至f为在接边线上的有向边,遍历这些有向边进行检查。判断有向边b在有向边界表中同时隶属于三个要素,接边线、要素PA1和要素PA2,且方向属性相反,则可认定在接边线b处,存在需接边要素,且接边要素满足接边要求,接边正确。同理接边线d,也判定为接边正确,但接边线e,则只隶属于两个要素,接边线和要素PB2,所以在接边线e处,判定为未找到接边要素,接边有错误。
图2 面状要素接边检查
2.2.2线要素检查
(1)在几何图P1中筛选出隶属于接边线要素的顶点(Vertex)。
(2)对顶点进行判断:若顶点隶属于两个或以上待检查线要素,且方向相反,判断隶属的线要素是否在接边线同一侧,若不是,则在该段位置上,图形关系正确,存在接边要素;若是,则在该段位置上,不存在接边要素。若顶点只隶属于一个待检查线要素,则在该段位置上,不存在接边要素。
以图3为例,线状要素和接边线一起构建平面图,在接边线上生成节点N1、N2…N5。遍历接边线上节点,若节点只隶属接边线,则该处不存在待接边线要素(节点N1和节点N5);若节点只隶属于一个待接边要素,则该处接边存在错误(节点N4);若节点隶属于二个及以上待接边要素,则需判断待接边要素是否在接边线一侧,在同一侧的,接边有可能错误(节点N3),列入可疑接边问题人工核实,不在同一侧的为接边正确。
图3 线状要素接边检查
属性的接边是建立在几何接边检查正确的基础上,根据检查的要求,指定的属性字段应一致,判断接边线两侧要素属性是否一致,若一致,则接边正确;若不一致,则接边存在错误。
本文论述的接边检查方法,应用于江苏省宿迁市地理国情监测项目,得到了很好的应用价值。项目以区县为单位生产,接边线为不规则的区县界,接边检查程序读取待接边的两个区县和接边线数据,执行完成,接边检查结果以MDB (Message Driven Bean)数据格式展示,可定位修改。
为了验证本文论述接边检查方法的运行效率优势和准确性,选取了两个区县的地理国情数据,人工设定接边错误。将检查人员分为三组进行检查,第一组安排一人,采用本文检查程序检查;第二组安排一人,采用某基于ArcEngine平台程序检查;第三组安排两人,采用人工方式检查。最后对检查结果进行比较分析,结果见表1。
表1 检查结果对比
表1显示,三种方法比较,本文方法可靠,在准确率和效率上有明显优势,能够提高地理国情数据的生产效率,保证数据的质量。
本文阐述了基于图论的接边算法思路,通过自主开发接边程序实现了地理国情数据的接边检查。该方法具有一定的普适性,能够提高接边检查的准确率和效率,对地理国情的生产具有较好的实用价值。但是,该方法仍有不足之处,检查只能一次针对两个接边区县;检查的规则不能定制,无法只针对个别检查项专查;检查结果的存储形式不方便作业人员修改;对于可疑的接边点,还需要人工判断。下一步的工作重点是对检查方法进一步改进,减少人工的参与,完善程序的界面和定制化,使程序能够操作简便,适应多样化的需求。