Python 使用osmnx(openstreetmap)获取城市路网
Python 使用osmnx(openstreetmap)获取城市路网
OSmnx可以用于检索并可视化网络数据,将路段抽象成边,交叉口抽象为点。个人感觉它的功能十分强大,因为道路网络数据很庞大,使用这个库就可以将很多数据下载并进行处理,这个库让我觉得python数据处理是十分的方便。首先介绍osmnx库的下载,并浅尝osmnx获取道路网络。
1.osmnx库的安装
在此说明,我使用的是python3.8。
osmnx库依赖geopandas, matplotlib, networkx, numpy, pandas, pyproj, requests, Rtree, Shapely
先在python库网站https://www.lfd.uci.edu/~gohlke/pythonlibs/下载Rtree, Shapely库,
并pip-intall Rtree pip-install Shapely
最后pip –install osmnx
2.使用osmnx获取城市路网
可以通过向 OSMnx 提供以下任何一项来下载街道网络(在下面的示例中进行了演示):
- 一个边界框
- 一个经纬度点加上一段距离
- 地址加距离
- 所需街道网络边界的多边形
- 地名或地名列表
您还可以指定几种不同的网络类型:
- 'drive' - 获得可驾驶的公共街道(但不是服务道路)
- 'drive_service' - 获得可驾驶的公共街道,包括服务道路
- 'walk' - 获取行人可以使用的所有街道和路径(这种网络类型忽略单向方向性)
- 'bike' - 获取骑自行车者可以使用的所有街道和路径
- 'all' - 下载所有(非私有)OSM 街道和路径
- 'all_private' – 下载所有 OSM 街道和路径,包括私人访问的
a)使用osmnx.graph.
graph_from_place获得道路网络,利用城市名
import osmnx as ox import matplotlib.pyplot as plt streets_graph = ox.graph_from_place('Los Angeles, California', network_type='drive')#address:Los Angeles城市名,California streets_graph = ox.projection.project_graph(streets_graph) streets = ox.graph_to_gdfs(ox.get_undirected(streets_graph), nodes=False, edges=True, node_geometry=False, fill_edge_geometry=True) f, ax = plt.subplots(figsize=(10, 10)) streets.plot(ax=ax, linewidth=0.2) ax.set_axis_off() plt.show()
结果为:
b)来自多边形osmnx.graph.
graph_from_polygon
的街道网络
G
=
ox.graph_from_polygon(mission_shape, network_type
=
'drive'
)
ox.plot_graph(G)
c)来自地址ox.graph_from_address的街道网络,这将获得帝国大厦 1 公里(沿网络)内的街道网络:
import osmnx as ox G = ox.graph_from_address('350 5th Ave, New York, New York', network_type='drive') ox.plot_graph(G)
结果为:
d)经纬度点的街道网络
这将获得距离经纬度点(37.79, -122.41),0.75 公里(沿网络)内的街道网络:
import osmnx as ox G = ox.graph_from_point((37.79, -122.41), dist=750, network_type='all') ox.plot_graph(G)
结果为:
e)来自边界框的街道网络
osmnx.graph.
graph_from_bbox
(north, south, east, west, network_type='all_private', simplify=True, retain_all=False, truncate_by_edge=False, clean_periphery=True, custom_filter=None)
import osmnx as ox G = ox.graph_from_bbox(37.79, 37.78, -122.41, -122.43, network_type='drive') G_projected = ox.project_graph(G) ox.plot_graph(G_projected)
结果为: