内容导读
路网数据是进行网络分析的基础,它是建立网络数据集的数据来源。
本文我们以OSM路网数据为例,详细介绍OSM路网数据从下载,到数据处理,添加属性,完成符合网络分析的网络数据集的全部过程。
01
数据获取
比较全面的路网数据一般有两个渠道,一个是交通运输部门(会包含隧道、桥梁等等非公开数据,一般不会对外提供),一个是图商(有偿,脱密的路网或者导航数据)。
除此之外免费,并且能够在互联网上找到的公开的路网数据可以参考以下连接
https://zhuanlan.zhihu.com/p/493135621
但是国内数据都不太多,就连Esri自己提供的数据(https://www.arcgis.com/home/item.html?id=83535020ce154bd5a498957c159e3a99)其中的国内数据也很少,一般都只有高速和国道级别,时效性也都不太能保证,而且不少数据都没有名称等等基本属性。
使用上述链接中获取的数据,可以做世界范围、或者洲际、国家级别的相关分析。
另外我们还可以在自然资源部提供的全国地理信息资源目录服务系统:
https://www.webmap.cn/main.do?method=index
在该服务系统下载1:25万矢量地图数据,从中提取路网数据,这个系统中的数据包含名称、国标码、等级等等属性,信息准确,同时数据基本都是当年或者是前一年的,时效性上可以得到保证。在分析时,极大地节省了数据处理和准备的时间。
图1 全国地理信息资源目录服务系统数据格式
但是受到比例尺限制,提供的道路的等级一般都比较高。
所以这类数据更适合做城际之间,省际之间的成本矩阵、导航类分析等等,对成本的精度要求不是特别高的网络分析。
PS:ArcGIS Pro中还提供了对GTFS数据(谷歌通用公共交通信息数据标准)转换的工具。但是这个格式的数据公开少,国内几乎都是爱好者自己做的,不好获取到。
如果想要获取开源的城市内部的道路信息,更加推荐使用OpenStreetMap网站(以下简称OSM)的数据。OpenStreetMap网站提供免费开源、可编辑的地图服务,它允许用户自己上传采集到的数据,并提供数据下载。这些数据不仅包括兴趣点、水系、管线、铁路、境界,还包含了一些低等级的乡道、公园道路、步行道,与上述其他资源相比,道路信息和类型更加全面(不同城市的道路详尽程度不同)。
特别注意:OSM中国界线有问题,如果下载了OSM数据要用到国界线时,一定要甄别。
OSM又有很多的下载方式,可以参考:
https://blog.csdn.net/weixin_38233769/article/details/109755046
OSM中提供了直接下载shapefile格式的数据功能,shapefile是ArcGIS 系列软件原始支持的矢量数据格式。
经过比较,个人觉得下载pbf的速度会更快,包含的属性信息更多,可以借助QGIS软件将pbf格式转换到shapefile。
但是上述连接中提供的工具可能会遇到shapefile文件中文属性有乱码(可以通过修改ArcMap注册表修改),或者没有类似的符号化效果等等问题。
因为我们最终目的是要在ArcGIS 桌面软件中处理并分析路网数据。所以考虑使用插件ArcGIS Editor for OSM 10.X Desktop工具,以下简称OSM编辑器,这是个ArcMap的免费开源附加组件,专门用来下载、处理OSM数据的。
下载地址如下:
https://www.esri.com/en-us/arcgis/products/arcgis-editor-for-openstreetmap
这个工具有以下两个优势:
-
自动转换OSM数据并将其存储在文件地理数据库GDB中。能执行各种各样的地理处理分析。
-
支持ArcGIS for Desktop 10.3, 10.4, 10.5, 10.6, 10.7 or 10.8
图2 OSM编辑器工具
安装后,启动ArcMap,会在目录浏览窗口中的系统工具箱下看到一个“OpenStreetMap工具箱”。工具箱中会有多个工具,可以加载、编辑.osm文件和下载OSM数据,应用符号系统,可以将编辑更改回发到OSM,并根据OSM数据创建网络数据集。有关如何使用这些工具的信息,请参阅文档。
图3 OpenStreetMap工具箱
可以选择使用Download OSM Data或者Download,Extract and Symbolize OSM Data工具来下载数据并保存在GDB中。Download OSM Data工具下载的全类线要素都在一个要素类中,包含公路、铁路、水系、境界等等。
Download,Extract and Symbolize OSM Data工具则可以按照要素类别直接分层显示并支持按照OSM Web地图风格进行符号化。同时支持将Tags属性,也就是一些补充说明信息放到单独的属性字段中(例如oneway\public_transport等等)这些字段在我们后续制作网络数据集时,会很有用。
推荐使用Download,Extract and Symbolize OSM Data工具。
需要注意
1)工具运行之前,需要将后台关闭,在前台运行方便查看当前工具运行状态及错误信息。(地理处理工具中的地理处理选项)
图4 关闭后台处理
2)工具中将会限制下载的范围只能包括50000个数据节点
所以使用工具的时候,还要看研究的城市的规模,例如一线城市可能50000个节点,就只能下载一个小范围,这样就需要多下载几次然后拼接。但是二三线城市中心城区可能一次下载就搞定了。
下载过程中还需要符号化和格式转化,所以时间可能比较长。
图5 Download,Extract and Symbolize OSM Data工具处理时长
图6 下载后的数据在Arcmap中的效果
02
数据梳理
数据下载完成后,在内容列表中会看到OSM GroupLayer图层组。
图7 OSM GroupLayer图层组
包括点、线和面图层组(本质上仍然是点、线、面三个要素类,将要素类使用定义查询的方式设置为图层组)。点图层组包括多种类型兴趣点。线包括管线、境界、道路、铁路、水系等等数据,面图层组则代表水域、空域、建筑等等。
交通路网主要用到线图层组中的道路线和地铁,我们可以新建一个要素数据集(为后续的网络数据集做准备),将用到的几个要素类都导入进去。本示例中我们只用了Highway(Lines)。如果所在城市有地铁数据,还可以将Railway(Lines)中的subway导出。OSM数据默认是WGS 84坐标系。在做网络分析时,我们大部分都将计算其距离长度,一般都会用到公里或者米的单位,所以建议将数据投影变换到必要的投影坐标系。例如CGCS2000 6度或3度带投影,或者web墨卡托。
然后再打开导入到新建数据集中道路图层并查看其字段。
字段介绍
道路图层的字段比较多,我们这里保留字段中有内容的,其他的直接删除。(遇到无法删除的情况,可以先转为shapefile)
重点保留highway(道路类型)\OSM_name(道路名称)\OSM_oneway(是否单行)\ osm_bridge(立交桥)\OSM_lanes(车道数量)\max_speed(限速)\ osm_maxheight(限高)
来重点看一下highway字段,字段中会有多个类型。
图8 highway字段类型
可以结合这个类型表格,理解当前的道路数据。可以考虑删除非必要的数据。假如这里我们要做的是基于车辆行驶的解决方案。那么步行街道、台阶踏步这类数据就可以直接删除。
补充名称属性
OSM中数据的属性都是不同用户提交上来的,如果我们后续在分析时,确实需要用到名称,可以结合手头资料对名称进行补充,或者可以给同类型的数据进行顺序编号重命名。
给同类型的数据进行顺序编号重命名方法如下:
1)首先选中osm_name为空且是highway的某一类数据
图9 提取OSM中无名称数据
2)使用Python代码,给选中的数据赋值
代码如下:
step=0 def autoIncrement():global step,codepStart = 1 pInterval = 1if (step == 0): step = pStart else: step = step + pInterval code=str(step)return code
图10 顺序编号重命名
03
矢量化方向检查
检查路网数据的矢量化方向。观察地图视图中的数据,首先使用箭头居中符号渲染道路,显示路网数据的矢量化方向。
观察数据,会发现高等级的道路,比如primary、secondary这些数据,同一个段道路使用了两个线要素来表示,这两个线要素的方向正好相反。低等级的道路,则是使用一个线要素来表示。
这里我们需要检查一下高等级的道路矢量化方向与真正的车辆行驶的方向是否一致。
不一致的地方需要使用编辑工具,修改线的方向。
打开编辑器,双击需要翻转的线要素,右键选择翻转即可。
图11 翻转线方向
一般OSM中的数据这个问题不多。
04
连通性
ArcGIS中基于路网数据的分析都是依靠网络数据集来完成的。网络数据集由源要素组成。源要素包括网络边(也叫做边),交汇点和转弯三类数据。具体的介绍可以参考
https://ke.qq.com/course/5182451/13760697264444403关于网络数据集源数据设置的视频。
本例中我们只收集到了可以构建边要素的线数据。
为了构建网络数据集,我们还需要检查道路的连接方式,也就是连通性。
边要素的连通可以分为端点连通和节点连通。
端点是指线数据的起点和终点,任意节点则是指创建要素时所有的特征点。
如果设置了端点连通,则网络边只在线要素的端点处连通。它比较适合于构建交叉式的对象模型。如下图右图所示,东西道路和桥梁是连通的。南北道路和桥梁就是不连通的了。
图12 端点连通
如果设置了任意节点连通,线要素将在重合的节点部分拆分成为多个网络边要素。这种更适合于构建街道的数据,使得街道和其他的街道相交。如下图右图所示。
图13 任意节点连通
所以我们需要借助已有资料(立交桥、涵洞,转弯信息),依次检查道路的连通方式。在路网数据量比较大的情况下,为了减少工作量,我们可以:
1)先将所有的道路数据在相交处打断,形成端点连通的情况,可以使用高级编辑工具栏中的打断相交线工具。
图14 打断相交线
2)针对特殊道路中情况(立交桥等)将数据断开的合并。
3)另外,还需要考虑高程连通的情形。OSM道路数据本身没有带Z值属性,这里我们可以增加一个高程字段,用来表示高度级别。
这个属性来自立交桥、涵洞、隧道、过街天桥等等。我们可以借助已有的bridge等等字段并借助互联网地图中的立交桥效果来设置。
比如简单的立交桥:
图15 多层立交桥
这个立交桥共有三层,分别是东西向一层、南北向二层、东西向三层。可以分别赋予这三类要素的高程属性为0,1,2。
如果是复杂的立交桥,就需要结合立交桥的高度和汇入汇出方向判断其层级。
05
判断单行道
其中网络边要素是指路网数据中的线要素的两个方向,一个是沿着矢量化方向,一个是与矢量化方向相反的边要素,这两个边要素除了方向之外,还有可能其他属性不一致,例如通行的时间。
图16 边要素与线要素对应关系(同一位置)
在实际应用时,需要考虑几种情况。
1)实际获取到路网数据中的线要素等级比较低,使用一个线要素表示道路的双向。但是类似胡同这样的小的道路,可能本身就是单行的。也就是说线要素对应的一个边要素是无效的。
图17 单行道1
2)实际获取到路网数据中的线要素等级比较高,使用两个线要素表示道路的双向。例如高速路,使用两个线要素也就是4个边要素来表示一段路,显然线要素对应的一个边要素也是无效的。
图18 单行道2
等等类似的问题,遇到上述情况,我们首先需要判断获取到的路网数据中线要素是双向还是单向。其次是矢量化方向与实际单行方向一致还是矢量化方向与实际单行方向相反。
可以添加FT(From-To字段)。字段中属性分为三种。一种为NULL,也就是默认为空,表示线要素双向,第二种是YES,表明单行道与矢量化方向一致,第三种是No,表明单行道与矢量化方向相反。
OSM数据中的OSM_oneway字段,表示道路是否为单行道(内容为空或者yes),这里大部分的单行道与矢量化方向都是一致的。
06
添加其他属性字段
道路等级
网络数据集中还可以设置等级信息。等级是指分配给网络元素的次序或者是级别。在跨越大型网络求解分析时,使用等级能够提升分析效率计算。例如城际、省际之间的网络分析。
按照《1:10000(1:5000)基础地理信息地形要素数据规范》要求,道路可以分为国道、高速公路、快速、省道、县道、乡道、轨道交通等等(这里我们只考虑公路情况),可以使用规范中的道路类型来设置等级。网络数据集中的等级是一个整数字段。
所以需要将OSM数据中的类型与规范对应。
OSM数据的类型标准与规范差别较大,不太好对应,这里我们就简单的按照下列表格进行对照。
等级 | 道路类型 | Type |
1 | 高速公路 | trunk、motorway |
2 | 快速路/国道 | primary |
3 | 省道 | secondary |
4 | 县道 | residential、service、tertiary |
5 | 乡道 | track |
6 | 人行道 | bridleway、footway、path、pedestrian |
同样需要注意,Type属性信息并不准确,在完成了等级、道路类型以及type字段的对应之后,还需要结合互联网电子地图数据或者其他渠道,对数据进行检查,将道路类型有误的道路进行纠正。
时间成本
OSM数据中提供了maxspeed最大时速字段,我们可以直接使用道路长度shape_length/maxspeed 获得大致的通行时间。
如果没有maxspeed字段,我们也可以根据道路等级,获得常用的限速信息,再使用道路长度/限速信息也可以。
核心Python代码如下:
def traveltime(leixing,length):if (leixing=="高速"):return length/1000/120elif (leixing=="快速路"):return length/1000/80elif (leixing=="省道"):return length/1000/60elif (leixing=="县道"):return length/1000/40elif (leixing=="乡镇道路"):return length/1000/30elif (leixing=="人行道"):return length/1000/10
07
总结
1.数据来源五花八门,可能遇到的问题也不一样,大概的过程中这几步都完成之后,简单的网络分析就可以实现,并且保证一定的准确度。
2.数据准备阶段最好把数据都处理好,然后再创建网络数据集。
在网络数据集中也可以修改几何和属性,但是几何修改部分可能出现问题,所以尽量是保证处理好的数据备份,然后再构建网络数据集,如果出现问题,可以重新创建新的网络数据集。