OSMnx,简称ox,是Python拓展包,OSMnx 建立在 GeoPandas、NetworkX 和 matplotlib 之上,并与 OpenStreetMap 的 API 交互,可用于:
1.下载街道网络(驾车/步行/骑行网络)或其他基础设施,并对其进行建模(方位和方向)。将地点边界、建筑物覆盖区或兴趣点下载为GeoDataFrame。
2.将网络另存为shapefile,geopackage和GraphML等格式;
3.计算和可视化最短路径,以最小化距离,旅行时间,海拔等。
官方文档地址
官方文档的大致介绍
目前我使用的这个包的功能逻辑包括下面这些:
这里下载萧山区范围的路网作为实例
代码如下:
# 爬取萧山的路网拓扑结果并形成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文件中,原来的四个节点也会减少为一个节点。
这个是实现了这样一个需求,也就是已经知道了一系列电警,要把这些电警和交叉口联结起来,联系匹配的方式是根据距离,将电警和距离它距离最小的交叉口联结起来,因此要实现这个就需要得到每个电警与距离它最近的交叉口的编号。要实现这样一个功能,只需要一行代码,调用下下面的函数就行了。
我们的这篇论文是用这个包来爬取路网并做复杂网络分析的,并且已经开源源代码,需要的同学可以自取。用了相应的方法和代码可以考虑引用哦