路网自动构建路段拓扑

背景

在做道路匹配的时候,你发现很多论文都是基于路网的拓扑关系做的,但是问题就是:如何构建路网的拓扑关系?一般的论文都已经在构建好拓扑关系的基础上直接拿来用,有些论文说是使用MapInfo、MapX等等工具生成拓扑关系(我没试过,但是好像也需要写代码)。

其实,在ArcGIS里面,稍稍研究一下,间接就能建立路段之间的拓扑关系了。

然而,在百度搜“ArcGIS建立拓扑”,多数都是拓扑关系的处理,比如批量消除伪节点、悬挂点等等(对路网数据的处理确实很好用),和本文主题说的路段拓扑关系构建不是一个概念。


补充


正文

路段拓扑的定义:在路网数据中,使用"弧-结点"形式的数据结构来表示,弧段由两个端点定义:指示弧段起始位置的起始节点,指示弧段终止位置的终止节点。这被称为弧-结点拓扑。正是由于有这样的结构,只要路段收尾相连不断开,就能保证路网的连通性。

在ArcGIS里面,有一种用于存储矢量数据的地理相关数据模型,它叫:Coverage。当Coverage生成的时候,它就包括了节点(node)、弧段(arc)、tic文件。这就可以基于coverage的存储结构使用这些文件来进行路段拓扑的构建。

那么,为什么coverage可以做到呢?因为Coverage具有连通性、区域定义、邻接、生成拓扑的功能。我们看一张ArcGIS官方对Coverage的连通性描述:
路网自动构建路段拓扑_第1张图片

从图片中可以看出,在交叉路口(相邻的边),边与边共享同一个结点。例如:路段1的起点ID是10,终点ID是11。路段2的起始ID是11,终点ID是12。则路段1.endID=路段2.startID。具有这种连通性拓扑结构的网络,才是我们需要的路段拓扑。

构建路段拓扑需要的准备: 首先,你得有一份路网数据。当然,一般的路网数据都是有各种问题的,这个需要我们处理,比如:路网的伪节点、悬挂点等等情况。
当你已经处理好了这样的数据了(即一条路以交叉路口为分界),如下图所示,你就可以开始构建路段拓扑了。
路网自动构建路段拓扑_第2张图片

开始构路段建拓扑:

一、新建一个个人地理数据库,然后道路你的路网数据,然后建立集合网络。
路网自动构建路段拓扑_第3张图片
其中,构建出来的几何网络有一个叫:xxx_Junction的,这个是路段的起点和终点。(再次声明:要按照上述准备阶段处理完的路网结构才行!)

二、路网数据导出Coverage格式
在你的个人地理数据库里面,右键你的路网数据–>导出–>转为Coverage。
到这一步,要把刚才的xxx_Junction一起选入。
路网自动构建路段拓扑_第4张图片
三、简单浏览导出的Coverage文件
这时候,就会生成节点文件、弧段文件、tic文件、原路网文件。其中,我们重点关注是arc弧段文件。
路网自动构建路段拓扑_第5张图片
我们来分析一下arc弧段文件:FNODE是起点编号(下文"编号"统统用"ID"来称呼),TNODE是终点ID。其余一些属性是系统自动生成的,没什么实际用处,我们重点来关注FNODE和TNODE即可。
路网自动构建路段拓扑_第6张图片
我们来测试一下它生成路段的起始ID和终点ID是否正确:
路网自动构建路段拓扑_第7张图片
通过多次随机抽取路段进行对比,都是正确的。其中,路段显示方向这个是根据direction字段进行可视化显示的,与数字化道路方向相同或相反(有的使用oneway字段)。但是,无论是direction还是oneway字段,都是你路网数据有的,要么你自己抽取出来。

四、arc弧段文件导出shp格式:

右键arc弧段文件–>导出

五、把arc弧段文件和原路网文件进行合并处理(重要的一步)
ArcToolbox–>分析工具–>叠加分析–>相交

路网自动构建路段拓扑_第8张图片
把两个文件的相交部分合并在一起,这样arc弧段文件的起点ID和终点ID的属性列表也就合并在原文件里面了。

六、查看合并结果

经过对比分析,每条路段的起点ID、终点ID是一致的。并且,上一路段的终点ID等于下一路段的起点ID。
路网自动构建路段拓扑_第9张图片


补充

关于上面生成的道路节点,只需要记住:snode是数字化道路的起点,enode是数字化道路的终点,就可以了。
至于加入direction方向(可参考我另一篇博客:数字化方向)来判断之后,会显得很绕。但是大概的拓扑关系我都写在下图了。
路网自动构建路段拓扑_第10张图片


结语

连续整了好几天,终于整出来了。其实,我不是学地理信息专业的,但是有句话说得很好:念念不忘,必有回响。距离发表论文还是有段距离,写下来记录一下自己的成果吧。 现在论文被录了,这篇博客就可以放出来了~

其实,在构建路段拓扑的时候,也有过A、B、C等等一系列的解决方案,都失败了,最后还是这个方案成功了。也说说其他方案的处理,或许能给其他人提供解决方案。

A方案:ArcGIS里面能提出每条路段的起始、终止节点。数据管理工具–>要素–>要素折点转点。但是提取出来的端点编号全部不一致,无法做到上一路段的终点ID等于下一路段的起点ID。

B方案:PostGreSQL数据库里面,有一个交Pgrouting的内置处理命令可以对路网数据自动构建拓扑,具体命令如下所示:

select pgr_createTopology('wgs84testsegments',0.001, 'geom', 'gid');

但是,我尝试过了用这个命令生成的拓扑结构,em…反正我单从表面逻辑上没看出来有什么道路的连通性。

C方案:由于之前我不知道有“相交”这个功能,我得到arc弧段文件后,使用python对文件进行处理。因为arc弧段文件和原路网文件实际上是一样的,只是记录的属性表不一样(即使是一样的,但是每个点的经纬度还是不一样,因为要具体到小数点后7位之后,只是肉眼看不出来,以为是一样的)。我把arc弧段的起点和终点的经纬度提取出来,和原路网文件的起点、终点的经纬度进行比较,如果一样,就把arc弧段文件的拓扑属性丢给原文件。这时候我发现,即使在ArcMap里面看起来一样的点,实际上小数点后7位之后的数字还是不一样。无果,放弃。

D方案:就是本文的方案,完美解决。

打完收工~

你可能感兴趣的:(ArcGIS,路网构建拓扑)