查看: 1695|回复: 1

基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)

[复制链接]
发表于 2022-11-19 08:29:19 | 显示全部楼层 |阅读模式




【你投稿了没?10万+作者“平台好才是真的好”,也许下一个就是你!】(点击看详情),是由城市数据派主办的征稿活动,小派在此恭候派友们投稿分享!

【本期看点】

相信OpenStreetMap是大家熟悉的老朋友了,这回本文为大家介绍的是OSM的新朋友——OSMnx:OpenStreetMap的python拓展包(OSMnx)简介与入门操作教程。

科研写论文用到行政边界数据?交通可达分析在找细致的路网数据?需要获取分不同情景的步行道路、骑行道路、驾驶道路?还是路径规划面临庞大数据量和API极小配额的尴尬?......强大的OSMnx通通可以解决!

  本期投稿

作者:高枫

广州大学地理科学学院
GIS专业硕士研究生
研究方向为地理大数据与城市研究
(共享单车相关的时空行为研究)
爱好GIS,平平无奇

什么是OSMnx
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-9238
OSMnx是由南加大规划系的Geoff Boeing教授编写的OpenStreetMap的python拓展包。
参考官网:https://geoffboeing.com/
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-9166

参考文献:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-5088

OSMnx可以实现什么

科研写论文用到行政边界数据?交通可达分析在找细致的路网数据?需要获取分不同情景的步行道路、骑行道路、驾驶道路?还是路径规划面临庞大数据量和API极小配额的尴尬?......
强大的OSMnx通通可以解决!可通过少量代码实现以下功能: (1)世界范围内各级边界获取;(若涉及我国界线必须使用国家审查有资质的数据)(PS. 你能认出下面哪个边界是国内的吗?hhhh)
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-316

(2)世界范围内道路获取

基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-7661

基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-2217

(3)路径规划
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-5126

等等...

OSMnx有何优势

1. 区域不限,全球各国各地均可操作;2. 道路数据可分场景获取,包括驾驶,骑车与步行道路;3. 路径规划功能无需注册,且无限额(awsl...)。
OSMnx的简易入门教程

1.安装  其实安装才是OSMnx应用最难的一步。相比其他python包,OSMnx较难安装,以下为笔者安装经验:
① 建议应用anaconda作为python开发环境。conda install -c conda-forge osmnx首先,可在Anaconda Prompt中键入以上代码尝试下载。若失败,参考以下内容。
② 建议创建一个虚拟环境安装OSMnx。详细步骤如下:conda create -n osmnx_env python=3.7 #创建版本为3.7的虚拟环境activate osmnx_env #激活虚拟环境conda config --prepend channels conda-forge #添加安装镜像源conda install osmnx #开始正式安装   2.调用  检验安装成功第一步,调用。import osmnx as ox  3.各级别边界获取  (1)例:澳大利亚新南威尔士州行政边界获取:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-1827

实现代码:city = ox.gdf_from_place('New South Wales')ox.plot_shape(ox.project_gdf(city))
(2)例:悉尼市行政边界获取:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-5161

实现代码:city = ox.gdf_from_place('Sydney')ox.plot_shape(ox.project_gdf(city))
(3)例:广州市天河区行政边界获取:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-2768

实现代码:city = ox.gdf_from_place("广州市天河区")ox.plot_shape(ox.project_gdf(city))
4.数据获取可视化已完成,那如何保存数据到本地呢? OSMnx提供三种文件保存格式:ESRI Shpfile,osm以及graphml。
以最常用的shpfile为例:ox.save_gdf_shapefile("city.shp")  (保存路径一般为代码所在文件夹)  5.道路数据获取  道路数据获取方法有三种:以上为根据坐标范围进行获取(graph_from_bbox),其次还可以根据地名进行检索(graph_from_place),根据地址进行检索(graph_from_address)。道路类型也有三种可供获取:行车道路(network_type = 'drive'),可骑行道路(network_type = 'bike')与步行道路(network_type = 'walk')。
(1)例:根据坐标范围获取深圳市全市可骑行道路数据:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-9803

实现代码:
G = ox.graph_from_bbox(22.9837, 22.1365, 114.976, 113.3487, network_type = 'drive')

G = ox.project_graph(G)

ox.save_graph_shapefile("深圳市可骑行道路.shp")

ox.plot_graph(G)

(2)例:根据地名检索获取以广州大学为中心,半径1.5km范围内的所有道路:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-5420

对比百度地图:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-3681

细致的高校内部小路也能获取,可见OSMnx质量。
实现代码:
G = ox.graph_from_address("广州大学", distance = 1500, network_type = 'all')

ox.plot_graph(G)

ox.save_graph_shapefile("全国排名第100高校周边道路.shp")
Arcmap软件查看下载数据:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-30

▲广州市珠江新城周边道路
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-9786

▲广州大学城周边道路  6. 路径规划  例:广州大学校门-中山大学校门路径规划先来看百度地图的检索结果:模式选择步行,因为我们后面OSMnx获取的数据为可步行道路。百度地图选择的最佳路径长度是5.2km。

基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-9652

OSMnx运行结果:① 首先以广州大学为中心,获取方圆5km的步行道路数据;
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-4499

② 首先输入广大与中大校门坐标作为OD,获得路径规划结果;
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-6928

放大显示:
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-3909

③ 输出规划路径的长度(默认单位为米)
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-2217

④ 对比结果
基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-6440

百度地图路径规划长度为5.2km(左图),使用OSMnx的路径规划长度为5.224km(右图),虽推荐路径不一,但最短距离结果较为一致。 实现代码:
import osmnx as ox

import networkx as nx

G = ox.graph_from_address("广州大学", distance=6000,network_type='all') #第一步,获取道路数据

ox.plot_graph(G)

origin_point = (23.039506,113.364664) #广州大学校门坐标

destination_point = (23.074058,113.386148) #中山大学校门坐标

origin_node = ox.get_nearest_node(G, origin_point) #获取O最邻近的道路节点

destination_node = ox.get_nearest_node(G, destination_point) #获取D最邻近的道路节点

route = nx.shortest_path(G, origin_node, destination_node, weight='length') #请求获取最短路径

distance = nx.shortest_path_length(G, origin_node, destination_node, weight='length') #并获取路径长度

fig, ax = ox.plot_graph_route(G, route, origin_point=origin_point, destination_point=destination_point) #可视化结果

print(str(distance)) #输出最短路径距离

提示:若进行大量OD计算,编写循环结构即可。
OSMnx路径规划优缺点

优点:路径规划不需注册,无配额限制,而著名地图API路径规划一般每天限额几千次,要进行大规模研究时可适当考虑。
缺点:图商的路径规划通常会考虑到实际交通情况,但OSMnx做不到,只能考虑物理几何最短路径,高精度分析需求时需注意这一点。
注意:OSM系列数据不能用于涉及我国国境线的地图表达,须遵守法律法规,使用正确、合法的数据。

期待合作
商业合作、投稿等,请联系客服微信号,加好友必须备注:合作+姓名

基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-7364

更多服务

基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-8373

基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-8028

基于OpenStreetMapPython接口(OSMnx)的GIS数据获取与网络分析教程(附代码注释)-5615

已绑定手机
发表于 2024-12-13 20:39:34 | 显示全部楼层
学习了,谢谢大佬分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

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