jason71241 发表于 2023-7-29 06:43:18

利用OpenStreetMap解决城市路网数据获取

OpenStreetMap社区是一个由地图制作爱好者组成的社区,这些爱好者提供并维护世界各地关于道路、小道、咖啡馆、铁路车站等各种各样的数据。

OpenStreetMap开源项目可以让程序开发更加灵活,图源更加丰富,例如可以使用谷歌地图,以解决国内无法使用谷歌服务的尴尬。国内户外导航软件,例如:行者、户外帮和小狼信标都使用了OpenStreetMap。

OpenStreetMap地图官网:

https://www.openstreetmap.org/

这篇博客主要是围绕如何在该网站上获取某个城市的路网信息,关于路网信息的解析遵循XML格式或JSON数据格式。

通过OpenStreetMap地图获取城市道路网数据其实很简单,主要分为两个步骤:一. 根据城市名获取对应ID二. 据城市ID获取路网数据

下面将具体详细步骤:

根据城市名获取对应城市ID

进入 http://www.overpass-api.de/index.html

点击第二栏的Query -> Query and Convert Forms



在Overpass API Query Form下方的输入框中输入代码:

<osm-script>
<query type="relation">
    <has-kv k="boundary" v="administrative"/>
    <has-kv k="name:zh" v="北京市"/>
</query>
<print/></osm-script>
其中name:zh代表中文地址,否则使用name即可. 当然,如果你不喜欢输出格式为XML,也可以将<osm-script>修改为<osm-script output="json">,定义输出数据格式为JSON, 目前我们主流的程序交互偏向于使用JSON格式数据。



点击右侧的Query按钮,即可将结果从浏览器下载到本地,文件名为interprept, 用记事本打开该文件,找到<relation id="912940">, 即可拿到北京市的ID为912940



根据城市ID获取路网数据

上面的输入框中的代码替换为如下:

<osm-script timeout="1800" element-limit="100000000">
<union>
    <area-query ref="3600912940"/>
    <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="3600912940"/>中3600912940是上一步骤中拿到的ID加上360000000后得到的数字。点击右侧的Query按钮,即可将结果从浏览器下载到本地,文件名为interprept,打开后即可得到路网数据。



关于JSO格式的下载解析与上述步骤相同, 只需在<osm-script>标签中, 加入output="json",属性, 即可导出JSON格式数据.

晚安, 祝你好梦!

未完待续


扫描二维码 关注我们

微信号 : 小G在路上
页: [1]
查看完整版本: 利用OpenStreetMap解决城市路网数据获取