OSMnx包的使用

一、OSMnx

OSMnx,简称ox,是Python拓展包,OSMnx 建立在 GeoPandas、NetworkX 和 matplotlib 之上,并与 OpenStreetMap 的 API 交互,可用于:
1.下载街道网络(驾车/步行/骑行网络)或其他基础设施,并对其进行建模(方位和方向)。将地点边界、建筑物覆盖区或兴趣点下载为GeoDataFrame。
2.将网络另存为shapefile,geopackage和GraphML等格式;
3.计算和可视化最短路径,以最小化距离,旅行时间,海拔等。

官方文档地址
官方文档的大致介绍

1.该包的大致使用逻辑

目前我使用的这个包的功能逻辑包括下面这些:

  1. 路网下载,使用osmnx.graph module进行路网下载,并会自动帮助整理成networkx的格式,且依然保留经纬度信息。
  2. 投影转换,在进行节点的聚合或可视化过程中,都可能需要投影转换,这就用到了osmnx.projection module模块。
  3. 可视化,osmnx.plot module这个模块是进行拓扑可视化,但是没有地图,osmnx.folium module这个模块是借助folium进行可视化,有地图底图。
  4. 进行拓扑简化处理,osmnx.simplification module主要进行路网拓扑简化,比如进行节点聚合。
  5. 一些其他的基于拓扑的分析,目前使用到的主要是osmnx.distance module,主要是用来计算关于距离的一些拓扑特性或关系。
  6. 其他的一些模块目前还没用到,比如进行特定路网区域选取等等,官方文档写的也比较清楚了。

二、使用方法

1.引入库并下载路网

这里下载萧山区范围的路网作为实例
代码如下:

# 爬取萧山的路网拓扑结果并形成networkx的数据结构
import osmnx as ox
G = ox.graph_from_bbox(30.255904285611525,30.141649815003344,120.2972282472983, 120.2239798312058, network_type='drive')
# 形成路网图
G = ox.projection.project_graph(G)
plt.rcParams['figure.dpi'] = 400
fig=plt.figure(figsize=(10,6)) #设置画布大小
ax = plt.gca()
ox.plot.plot_graph(G,ax=ax,figsize=(8*4),bgcolor='white',node_color='blue',edge_color='grey',show=True,edge_linewidth=0.3,node_size=5,node_alpha=0.5)

在这里插入图片描述

# 以openstreetmap底图为背景绘图
G_84 = ox.projection.project_graph(G , to_crs='EPSG:4326')
ox.folium.plot_graph_folium(G_84, tiles='openstreetmap',kwargs={'width':0.1})

在这里插入图片描述
局部放大图
在这里插入图片描述
OSMnx中的道路类型分为未分隔道路与双向分隔道路(divided roads)。一条双向分隔道路(divided road)与另一条双向分隔道路(divided road)的交叉点将会创建4 个节点。如果要将同一个交叉口的所有节点合并,可用以下代码实现,这里需要注意一点,在进行合并时,一个比较重要的参数是tolerance,这个也就是说对将这个范围内的node进行合并,因此在进行这一步之前需要进行投影变换,变换为单位为m的投影,也就是墨卡托投影,G = ox.projection.project_graph(G),这行代码就是实现这个效果,没有设置转化为什么投影就默认是到墨卡托投影,墨卡托投影就是以m为单位:

# 将同一个交叉口的所有nodes合并
G = ox.simplification.consolidate_intersections(G,tolerance=25, rebuild_graph=True, dead_ends=False, reconnect_edges=True)

合并后的局部放大图
在这里插入图片描述
此局部放大图中,建设一路与市心北路交叉口由原来的四个节点合并为四个节点质心处的一个节点,reconnect_edges参数为True时,可以根据新节点重建拓扑。在合并之后的shp文件中,原来的四个节点也会减少为一个节点。
在这里插入图片描述

2.进行节点映射

这个是实现了这样一个需求,也就是已经知道了一系列电警,要把这些电警和交叉口联结起来,联系匹配的方式是根据距离,将电警和距离它距离最小的交叉口联结起来,因此要实现这个就需要得到每个电警与距离它最近的交叉口的编号。要实现这样一个功能,只需要一行代码,调用下下面的函数就行了。
在这里插入图片描述

三、实操案例和代码获取

我们的这篇论文是用这个包来爬取路网并做复杂网络分析的,并且已经开源源代码,需要的同学可以自取。用了相应的方法和代码可以考虑引用哦

  • 20
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 38
    评论
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值