开源数据对交通模型贡献与日俱增。就道路网络建模而言,随着数据质量的提升,开源OpenStreetMap矢量数据已经具备较强的可用性。首先,OpenStreetMap矢量数据更新速度较快,且具备较为准确的几何线形信息,自带路名、路名和等级等信息,使其具备了较好的基本条件;其次,采用通用的WGS84坐标系,可以更方便的与其它开源数据源协同利用。不过,OpenStreetMap矢量数据文件是xml格式,直接用于建模也存在不同程度的障碍,尤其是网络拓扑存在普遍的问题。本文探讨基于Python + OSMnx软件包的OpenStreetMap矢量数据在TransCAD交通规划模型软件中的路网建模方法,发掘开源数据利用新路径。
1 OSMnx简介及路网数据提取方法
1.1 OSMnx简介及安装
OSMnx 是南加州大学的Geoff Boeing助理教授开发的一个 Python 软件包,可以用于从OpenStreetMap下载、拓扑处理、分析和可视化街道网络和其他地理要素。只需一行代码,就能下载步行、驾车或骑车网络并建立模型,然后对其进行分析和可视化。OSMnx还可以轻松处理城市设施/兴趣点、建筑占地面积、公交站点、高程数据、街道方向、速度/旅行时间和路线。本文着重介绍怎样基于OSMnx构造交通模型的道路网络,关于其它功能详见OSMnx官网。
OSMnx的安装方法之一是可以在Anaconda环境下运行以下命令:
conda create -n ox -c conda-forge --strict-channel-priority osmnx
Anaconda是一个功能强大的数据科学平台,可安装、管理Python相关包的软件,自带Python、Jupyter Notebook、Spyder等工具。其自带Python解释器,用户可以方便地进行Python编程。当然,也可以使用pip安装,不过Anaconda软件安装说明文档提示这不属于官方支持做法。
1.2 OSMnx在线路网下载和拓扑处理
OSMnx 提供5种方式下载在线路网,本文主要介绍多边形面域和矩形框两种,其他具体详见使用手册的函数参数说明。
序号 | 方式 | 函数 |
1 | 地址 | graph_from_address() |
2 | 矩形框 | graph_from_bbox() |
3 | 位置 | graph_from_place() |
4 | 坐标点 | graph_from_point() |
5 | 多边形 | graph_from_polygon() |
(1)多边形面域graph_from_polygon()
OSMnx可以获取OpenStreetMap自带的行政边界,用作选择范围的面域。当然,也可以通过外部读入面域图形的shp文件作为边界。以下以北京海淀区范围为例演示通过多边形面域构建图网络。
注意运行以上操作需要有对国外网站的访问权限,生成的gpkg文件是GeoPackage的文件格式,可以用QGIS打开看到包含edges和nodes两个图层,分别对应线层和点层。将这两个图层分别导出为shp文件,即可作为TransCAD建模的路网输入文件。
需要说明的是面域文件可以使用外部读入权威的shp文件替代,考虑到OpenStreetMap自带行政边界缺少权威性,建议使用自定义边界以避免产生不必要的争议。
(2)矩形框graph_from_bbox()
矩形框操作和多边形面域类似,使用graph_from_bbox()函数,通过元组数据指定边界范围即可,使用海淀区的坐标范围所得小汽车网络见下图。
1.3 离线osm文件的获取、切割和OSMnx拓扑处理
OSMnx还提供基于osm文件的离线建模方式,不受网络下载的限制。但一般而言可直接获取的数据是一个包含全中国的范围的osm文件,数据量很大。因此在使用前需要对osm文件根据需要的范围进行切割。
(1)OSM文件下载
通过https://download.geofabrik.de/网站,可以下载全国的osm文件,点击Asia然后选择子区域中的China。原始文件大小约2G,解压缩后约22.6G。
(2)使用osmosis工具切割OSM文件
切割OSM文件需要用到osmosis工具。osmosis是一个基于Java的开源osm文件切割工具,当前最新版为0.49.2,下载链接:
https://github.com/openstreetmap/osmosis/releases/download/0.49.2/osmosis-0.49.2.zip
osmosis切割osm同样提供矩形框和面域两种形式。对于矩形框而言操作较为简单,以前文的北京市海淀区为例,其命令为:
osmosis--read-xml file=f:china-latest_20240518.osm --bounding-boxtop="40.173" left="116.059" bottom="39.871"right="116.398" clipIncompleteEntities=true--wx file=f:haidian.osm
通过上下左右的坐标来指定矩形范围,特别需要注意的是clipIncompleteEntities需要设置为true,否则OSMnx在读入文件构建图网络时会提示节点信息不完整出错。
osmosis同样提供面域切割的模式,面域文件后缀为“.poly”。根据shp文件生成“.poly”建议使用QGIS的插件osmploy_export。安装完成后,选择面域,点击菜单图标,指定字段作为面域名称即可生成“.poly”文件。注意面域需要包含字符型字段才可以作为面域“.poly”文件的面域标签。
基于面域“.poly”文件的osm文件切割命令如下:
osmosis--read-xml file=f:china-latest_20240518.osm --bounding-polygonfile="f:Haidian.poly" clipIncompleteEntities=true --wxfile=f:Haidian_poly.osm
(3)离线osm文件拓扑处理
使用OSMnx对离线osm文件拓扑处理过程如下:
从上图不难发现离线osm文件的要素远比直接在线地图建模的内容要丰富,主要是因为前文在线地图中只包含小汽车通行的网络,而在离线osm建模结果包含了铁路、地铁、小汽车、步行等所有网络信息。相对在线下载的osm文件,遗憾的是未能在离线osm文件找到通行权选择集参数。因此如采用离线osm文件得到的结果作为后续交通模型输入需要通过选择集做进一步筛选和清洗。
上图为多边形切割后的建模结果,网络冗余明显减少。因此,考虑后续处理的工作量,建议采用多边形切割代替矩形框。
2 基于OSMnx数据的TransCAD路网建模
2.1 gpkg数据导出
OSMnx生成的图网络保存gpkg,对应生成edges和nodes两个图层。gpkg文件可以直接用QGIS打开,分别将这两个文件导出保存为shp备用。为了防止shp文件中文字段的乱码,需要针对不同的TransCAD版本选择不同编码方式,下面的例子是选择UTF-8编码方式。顺便说一下,使用QGIS保存shp文件为不同编码方式,可以解决TransCAD早期版本对一些特定编码的shp文件显示为乱码的问题。
2.2 shp文件导入TransCAD
TransCAD支持带有拓扑关系的点和线两个图层同时导入,也支持双向的道路双线要素格式转换为单线要素格式,并用AB/BA字段表示双向的不同属性,较为灵活。参见:TransCAD导入常用交通规划软件网络数据。
在TransCAD通过File菜单,Open找到edges.shp文件,并按下图设置(包括nodes.shp文件),待完成后即可生成TransCAD模型路网。
不难发现,导入后的网络link属性中路名、道路等级等属性比较完整,但车道数、自由流车速等指标存在缺失。这是由于OpenStreetMap地图数据本身的缺陷。要用于交通模型,还需要通过标准化属性赋值来弥补这一缺陷的方法。下面介绍标准化属性赋值方法。
2.3 道路属性配置
考虑OpenStreetMap数据车道和自由流车速缺失的问题。经对osm地图数据的梳理,发现车行道的linktype约有89种。结合道路等级和连接属性,进一步分成22类,分别对于每一类道路的车道数和自由流车速进行初始化。相关参数见下表。
NO | linktype | type | lanes | speed |
1 | motorway | 1 | 3 | 120 |
2 | trunk | 2 | 4 | 70 |
3 | primary | 3 | 3 | 50 |
4 | secondary | 4 | 2 | 40 |
5 | tertiary | 5 | 1 | 30 |
6 | residential | 6 | 1 | 20 |
7 | living_street | 7 | 1 | 15 |
8 | road | 8 | 1 | 20 |
9 | unclassified | 8 | 1 | 20 |
10 | busway | 9 | 1 | 40 |
11 | escape | 10 | 1 | 10 |
12 | motorway_link | 11 | 2 | 60 |
13 | trunk_link | 12 | 2 | 40 |
14 | primary_link | 13 | 1 | 30 |
15 | secondary_link | 14 | 1 | 25 |
16 | tertiary_link | 15 | 1 | 20 |
17 | ['motorway', 'motorway_link'] | 21 | 1 | 30 |
18 | ['motorway_link', 'motorway'] | 21 | 1 | 30 |
19 | ['primary', 'motorway'] | 21 | 1 | 30 |
20 | ['secondary', 'motorway'] | 21 | 1 | 30 |
21 | ['trunk', 'motorway'] | 21 | 1 | 25 |
22 | ['trunk_link', 'motorway'] | 21 | 1 | 25 |
23 | ['motorway_link', 'primary_link'] | 22 | 1 | 25 |
24 | ['motorway_link', 'tertiary'] | 22 | 1 | 25 |
25 | ['motorway_link', 'unclassified'] | 22 | 1 | 25 |
26 | ['primary', 'motorway_link'] | 22 | 1 | 25 |
27 | ['residential', 'motorway_link'] | 22 | 1 | 25 |
28 | ['secondary', 'motorway_link'] | 22 | 1 | 25 |
29 | ['secondary_link', 'motorway_link'] | 22 | 1 | 25 |
30 | ['tertiary_link', 'motorway_link', 'tertiary'] | 22 | 1 | 25 |
31 | ['tertiary_link', 'motorway_link'] | 22 | 1 | 25 |
32 | ['trunk', 'motorway_link'] | 22 | 1 | 25 |
33 | ['trunk_link', 'motorway_link'] | 22 | 1 | 25 |
34 | ['unclassified', 'motorway_link'] | 22 | 1 | 25 |
35 | ['primary', 'trunk', 'primary_link'] | 23 | 1 | 20 |
36 | ['primary', 'trunk'] | 23 | 1 | 20 |
37 | ['secondary', 'secondary_link', 'trunk'] | 23 | 1 | 20 |
38 | ['secondary', 'trunk', 'trunk_link', 'unclassified'] | 23 | 1 | 20 |
39 | ['secondary', 'trunk'] | 23 | 1 | 20 |
40 | ['secondary_link', 'trunk', 'secondary'] | 23 | 1 | 20 |
41 | ['secondary_link', 'trunk'] | 23 | 1 | 20 |
42 | ['trunk', 'primary_link'] | 23 | 1 | 20 |
43 | ['trunk', 'tertiary'] | 23 | 1 | 20 |
44 | ['trunk', 'trunk_link'] | 23 | 1 | 20 |
45 | ['primary', 'trunk_link'] | 24 | 1 | 20 |
46 | ['residential', 'trunk_link'] | 24 | 1 | 20 |
47 | ['secondary', 'trunk_link'] | 24 | 1 | 20 |
48 | ['secondary_link', 'trunk_link'] | 24 | 1 | 20 |
49 | ['trunk_link', 'primary_link'] | 24 | 1 | 20 |
50 | ['trunk_link', 'tertiary'] | 24 | 1 | 20 |
51 | ['trunk_link', 'unclassified'] | 24 | 1 | 20 |
52 | ['primary', 'primary_link'] | 25 | 1 | 20 |
53 | ['primary', 'tertiary'] | 25 | 1 | 20 |
54 | ['primary', 'tertiary_link'] | 25 | 1 | 20 |
55 | ['primary_link', 'tertiary'] | 25 | 1 | 20 |
56 | ['residential', 'primary'] | 25 | 1 | 20 |
57 | ['residential', 'primary_link'] | 25 | 1 | 20 |
58 | ['secondary', 'primary', 'tertiary'] | 25 | 1 | 20 |
59 | ['secondary', 'primary'] | 25 | 1 | 20 |
60 | ['secondary', 'primary_link'] | 25 | 1 | 20 |
61 | ['tertiary', 'primary_link'] | 25 | 1 | 20 |
62 | ['unclassified', 'primary_link'] | 25 | 1 | 20 |
63 | ['residential', 'secondary'] | 26 | 1 | 15 |
64 | ['secondary', 'living_street'] | 26 | 1 | 15 |
65 | ['secondary', 'secondary_link'] | 26 | 1 | 15 |
66 | ['secondary', 'tertiary'] | 26 | 1 | 15 |
67 | ['secondary', 'tertiary_link', 'tertiary'] | 26 | 1 | 15 |
68 | ['secondary', 'tertiary_link'] | 26 | 1 | 15 |
69 | ['secondary', 'unclassified'] | 26 | 1 | 15 |
70 | ['secondary_link', 'secondary', 'tertiary'] | 26 | 1 | 15 |
71 | ['secondary_link', 'secondary'] | 26 | 1 | 15 |
72 | ['secondary_link', 'tertiary'] | 26 | 1 | 15 |
73 | ['secondary_link', 'tertiary_link', 'tertiary'] | 26 | 1 | 15 |
74 | ['secondary_link', 'tertiary_link'] | 26 | 1 | 15 |
75 | ['secondary_link', 'unclassified'] | 26 | 1 | 15 |
76 | ['living_street', 'tertiary'] | 27 | 1 | 15 |
77 | ['living_street', 'unclassified'] | 27 | 1 | 15 |
78 | ['residential', 'living_street', 'unclassified'] | 27 | 1 | 15 |
79 | ['residential', 'living_street'] | 27 | 1 | 15 |
80 | ['residential', 'road'] | 27 | 1 | 15 |
81 | ['residential', 'tertiary'] | 27 | 1 | 15 |
82 | ['residential', 'tertiary_link'] | 27 | 1 | 15 |
83 | ['residential', 'unclassified', 'tertiary'] | 27 | 1 | 15 |
84 | ['residential', 'unclassified'] | 27 | 1 | 15 |
85 | ['road', 'residential'] | 27 | 1 | 15 |
86 | ['road', 'unclassified'] | 27 | 1 | 15 |
87 | ['tertiary_link', 'tertiary'] | 27 | 1 | 15 |
88 | ['tertiary_link', 'unclassified'] | 27 | 1 | 15 |
89 | ['unclassified', 'tertiary'] | 27 | 1 | 15 |
建议在shp文件导入TransCAD之前完成数值初始化,这样双向的属性更容易一次性操作。
3 结语
总体来说通过OpenStreetMap来构建交通模型网络虽然还存在一定缺陷,特别是道路等级、车道数和自由流车速的问题。但无疑这是一种高效的交通网络建模方法,再配合公交模型数据库自动创建工具,能够快速完成基础交通网络模型的开发,是一种值得推广的工作模式。当然,网络数据的可靠性对模型的精度也会有直接的影响,在条件允许的情形下,其他高质量的输入数据仍然是交通建模的首选(例如导航地图矢量数据)。
OSMnx不仅可以作为道路网络的建模工具,还有其他一些重要的功能,包括k最短路分析、距离计算等。这些功能具有广泛的应用场景。骑行、步行网络也能够直接支持开展城市骑行和步行网络的研究工作。
全部0条评论
快来发表一下你的评论吧 !