查看: 2206|回复: 0

Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据

[复制链接]
发表于 2022-12-10 18:23:42 | 显示全部楼层 |阅读模式

    概述

    在OpenStreetMap上下载地图数据

      常见报错操作

      完美操作


Python+networkX+OpenStreetMap实现交通数据可视化(一):用OpenStreetMap下载地图数据

本文主要参考:https://zhuanlan.zhihu.com/p/93239773?utm_source=wechat_session&utm_medium=social&utm_oi=677334979525218304
概述

做地理信息系统,交通仿真与优化的小伙伴们,很多时候需要将地理数据可视化,以更直观的展示所做的课题。也就是需要把地理数据转化成类似下面的图片,并且能够完成下面的操作:
    对路网本身进行动态操作;在路网中增加特定的信息,如统计数据,需求出现的位置信息等;路网和算法、仿真等操作集成在一起,实现算法的可视化。

下面的图就是纽约市曼哈顿区某个月出租车出行数据的经纬度信息统计。

接下来我们来逐步介绍如何画出上面那样的图。

整个过程分为如下步骤:

    下载纽约市出租车出行数据,网址纽约市出租车出行数据http://www.nyc.gov/html/tlc/html/about/trip_record_%20data.shtml也就是这个界面
    Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-1741
    数据是csv格式的,用python读取非常简单;

    在OpenStreetMap上下载纽约市曼哈顿区的路网数据OpenStreetMap网址

    用Python读取地图数据的XML文件,用Python的工具包networkX实现地图数据的可视化。
在OpenStreetMap上下载地图数据

常见报错操作

我们进入OpenStreetMap的主页,是这样的
Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-9873
进入主页以后,我们可以搜索我们要下载的地区,然后跳转至目标地理位置,用设置上下左右经纬度的方法来导出数据,操作如下:

Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-6178

然后会进入手动选取目标区域并导出界面,当然了,这些经纬度也可以手动输入具体值。具体如下图
Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-8535

就这?当你搓搓手准备迎接数据的时候,你会发现出现了面的问题:
Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-8234


You requested too many nodes (limit is 50000). Either request a smaller area, or use planet.osm

这就尴尬了,50000个点的限制当然获得不了整个manhattan的数据了。这条路就cut掉把。找了很多帖子,终于找到了下面的帖子,https://zhuanlan.zhihu.com/p/93239773?utm_source=wechat_session&utm_medium=social&utm_oi=677334979525218304完美的解决了这个问题。
完美操作

我们仅用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选项卡
Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-2091
在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中去核对
Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-9536

如果是中国的城市,比如深圳,那代码相应的改成
<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按钮

Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-4450
在这里插入图片描述
点击以后,浏览器会自动下载一个名为interpreter的文件,这个文件内容的格式是XML的,里面记录了我们想要的城市的ID我们用超级记事本notepad++打开这个文件,里面内容是这样的
Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-751
这个文件里<relation id = '8398214'>这个8398214就是manhattan的城市ID.这里有个坑,这个文件里有三个<relation id = ***>,我们选的是这个id最大的。一般情况下,我们得到的文件里只有一个<relation id = ***>,如果有多个的话,就选择<relation id = ***>框柱的内容最多的那个

Python+networkX+OpenStreetMap实现交通数据可视化(一):​用OpenStreetMap下载地图数据-6576
上面这幅图就是短的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>

其中,我们只需要把<area-query ref="3608398124"/>中3608398124这个数字改成3600000000加上城市ID即可。

输入以后点击Overpass API Query Form右下角的Query按钮,就可以看到浏览器在慢慢下载城市数据了,下载的文档名仍然是interpreter,仍然是XML文件。

下载完成后,大功告成,我们将最终获得的manhattan路网数据用python读取,就可以开心的做可视化啦。

再次感谢https://zhuanlan.zhihu.com/p/93239773?utm_source=wechat_session&utm_medium=social&utm_oi=677334979525218304的帖子。



作者:刘兴禄,清华大学,清华伯克利深圳学院 (博士在读)

邮箱:hsinglul@163.com
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表