- 概述
- 在OpenStreetMap上下载地图数据
- 常见报错操作
- 完美操作
Python+networkX+OpenStreetMap实现交通数据可视化(一):用OpenStreetMap下载地图数据
概述
做地理信息系统,交通仿真与优化的小伙伴们,很多时候需要将地理数据可视化,以更直观的展示所做的课题。也就是需要把地理数据转化成类似下面的图片,并且能够完成下面的操作:
- 对路网本身进行动态操作;
- 在路网中增加特定的信息,如统计数据,需求出现的位置信息等;
- 路网和算法、仿真等操作集成在一起,实现算法的可视化。
下面的图就是纽约市曼哈顿区某个月出租车出行数据的经纬度信息统计。
接下来我们来逐步介绍如何画出上面那样的图。
整个过程分为如下步骤:
- 下载纽约市出租车出行数据,网址纽约市出租车出行数据http://www.nyc.gov/html/tlc/html/about/trip_record_%20data.shtml也就是这个界面
- 数据是csv格式的,用python读取非常简单;
- 在
OpenStreetMap
上下载纽约市曼哈顿区的路网数据OpenStreetMap网址 - 用Python读取地图数据的XML文件,用Python的工具包
networkX
实现地图数据的可视化。
在OpenStreetMap上下载地图数据
常见报错操作
我们进入OpenStreetMap
的主页,是这样的
进入主页以后,我们可以搜索我们要下载的地区,然后跳转至目标地理位置,用设置上下左右经纬度
的方法来导出数据,操作如下:
然后会进入手动选取目标区域并导出
界面,当然了,这些经纬度也可以手动输入具体值。具体如下图
就这?当你搓搓手准备迎接数据的时候,你会发现出现了面的问题:
You requested too many nodes (limit is 50000). Either request a smaller area, or use planet.osm
这就尴尬了,50000个点的限制当然获得不了整个manhattan的数据了。这条路就cut掉把。
完美操作
我们仅用Query
的方法,就可以完美的解决上述问题,主要分为下面几个步骤:
- 进入
overpass-api
界面http://www.overpass-api.de/index.html,选择Query and Convert Forms
选项卡 - 获取城市对应的
ID
- 根据城市
ID
获取路网数据。
下面我们来逐步演示获取manhattan地图数据的步骤。
获取城市的ID
进入http://www.overpass-api.de/index.html,选择Query and Convert Forms
选项卡
在Overpass API Query Form
下方的输入框中输入代码(用来获取城市的ID):
<osm-script>
<query type="relation">
<has-kv k="boundary" v="administrative"/>
<has-kv k="name" v="Manhattan"/>
query>
<print/>osm-script>
其中:
-
k="boundary" v="administrative"
表示城市的管辖边界 -
k="name" v="Manhattan"
表示地区名字是Manhattan
如果不确定,可以在OpenStreetmap中去核对
如果是中国的城市,比如深圳,那代码相应的改成
<osm-script>
<query type="relation">
<has-kv k="boundary" v="administrative"/>
<has-kv k="name:zh" v="深圳市"/>
query>
<print/>osm-script>
输入以后点击Overpass API Query Form
右下角的Query
按钮
在这里插入图片描述
点击以后,浏览器会自动下载一个名为interpreter
的文件,这个文件内容的格式是XML
的,里面记录了我们想要的城市的ID
我们用超级记事本notepad++
打开这个文件,里面内容是这样的
这个文件里这个8398214
就是manhattan的城市ID
.这里有个坑,这个文件里有三个,我们选的是这个id
最大的。一般情况下,我们得到的文件里只有一个,如果有多个的话,就选择框柱的内容最多的那个
上面这幅图就是短的ID的部分,这个ID是不对的。
根据城市ID获取城市路网数据
上面我们拿到了城市ID
,接下来我们用城市ID来获得城市的路网数据。我们在 在Overpass API Query Form
下方的输入框中输入代码(用来获取城市的路网数据):
<osm-script timeout="1800" element-limit="100000000">
<union>
<area-query ref="3608398124"/>
<recurse type="node-relation" into="rels"/>
<recurse type="node-way"/>
<recurse type="way-relation"/>
union>
<union>
<item/>
<recurse type="way-node"/>
union>
<print mode="body"/>
osm-script>
其中,我们只需要把中3608398124
这个数字改成3600000000
加上城市ID
即可。
输入以后点击Overpass API Query Form
右下角的Query
按钮,就可以看到浏览器在慢慢下载城市数据了,下载的文档名仍然是interpreter
,仍然是XML
文件。
下载完成后,大功告成,我们将最终获得的manhattan路网数据用python读取,就可以开心的做可视化啦。
作者:刘兴禄,清华大学,清华伯克利深圳学院 (博士在读)