OSMnx: Python for Street Networks
OSMnx 是一个第三方 Python 库,用于从 OpenStreetMap 检索、建模、分析和可视化街道网络。通过使用OSMnx可仅用一行代码完成下载和建模可步行、可驾驶或可骑自行车的城市网络,然后轻松分析和可视化它们。
例如宝鸡市太白县:
import osmnx as ox
ox.plot_graph(ox.graph_from_place('taibai, Baoji, Shaanxi, China'))
除此之外,OSMnx还可以轻松下载和使用便利设施/兴趣点、建筑物占地面积、高程数据、街道方位/方向和网络路由。如果在工作中使用 OSMnx,请在此处 下载 /引用论文。
如何使用 OSMnx
示例仓库 中有许多使用示例和教程。 这篇文章中演示 OSMnx 的 5 个基本用例:
- 自动下载行政地点边界和 shapefile
- 下载和建模街道网络
- 纠正和简化网络拓扑
- 将街道网络作为 shapefile、GraphML 或 SVG 保存到磁盘
- 分析街道网络:路由、可视化和计算网络统计信息
1. Get administrative place boundaries and shapefiles
使用 OSMnx,可以从 OpenStreetMap(作为 geopandas GeoDataFrames)下载位置形状 - 并将它们投影到 UTM(zone calculated automatically)并进行可视化:
city = ox.geocode_to_gdf( 'Chencang, Baoji, Shaanxi, China' )
ax = ox.project_gdf(city).plot()
_ = ax.axis('off')
geocode_to_gdf() (in module osmnx.geocoder)
osmnx.geocoder.geocode_to_gdf(query, which_result=None, by_osmid=False, buffer_dist=None)
geocoder 模块用于地理编码查询、创建地点边界的 GeoDataFrame 。 geocode_to_gdf 函数通过 Nominatim API 按名称或ID检索,返回GeoDataFrame 。
这里的地理编码是 Nominatim geocoder , Nominatim 是一个开源地址搜索引擎。
project_gdf() (in module osmnx.projection)
osmnx.projection.project_gdf(gdf, to_crs=None, to_latlong=False)
projection 模块用于投影空间几何和空间网络。project_gdf 函数将 GeoDataFrame 从其当前 CRS 投影到另一个。
如果 to_crs 为 None,则投影到 GeoDataFrame 质心所在的 UTM 区域的 UTM CRS。 否则投影到 to_crs 定义的 CRS。 此函数中的简单 UTM 区域计算适用于大多数纬度,但可能不适用于某些极端的北部地区,如斯瓦尔巴群岛或挪威北部。
通过OSMnx也可以轻松获取其他地点类型,例如社区、自治市镇、县、省或国家 - OpenStreetMap 中的任何地点几何:
place1 = ox.geocode_to_gdf('宝鸡文理学院, 宝鸡市')
place2 = ox.geocode_to_gdf('金台区, 宝鸡市, 陕西省')
place3 = ox.geocode_to_gdf('陕西省, 中国')
place4 = ox.geocode_to_gdf('ukraine')
也可以将多个位置传递到单个查询中,以从其几何图形中保存单个 shapefile 或地理包。 可以对市、省、国家或任何其他地理实体执行此操作:
places = ox.geocode_to_gdf(['金台区, 宝鸡市', '渭滨区, 宝鸡市', '陈仓区, 宝鸡市'])
places = ox.project_gdf(places)
ax = places.plot()
_ = ax.axis('off')
2. Download and model street networks
OSMnx 可以下载街道网络数据并构建经过拓扑校正的街道网络、投影和绘制网络,并将街道网络保存为 SVG、GraphML 文件或 shapefile 以供以后使用。街道网络是定向的并保持单向方向性。可以通过向 OSMnx 提供以下任何一项来下载街道网络:
- 一个边界框
- 一个经纬度点加上一段距离
- 地址加距离
- 所需街道网络边界的多边形
- 地名或地名列表
还可以指定几种不同的网络类型:
- 'drive' - 获得可驾驶的公共街道
- 'drive_service' - 获得可驾驶的公共街道,包括服务道路
- 'walk' - 获取行人可以使用的所有街道和路径(这种网络类型忽略单向方向性)
- 'bike' - 获取骑自行车者可以使用的所有街道和路径
- 'all' - 下载所有(非私有)OSM 街道和路径
- 'all_private' - 下载所有 OSM 街道和路径,包括私人访问的
2a) street network from bounding box
以下代码获取经纬度边界框内的可驾驶街道网络,然后将其投影到 UTM,随后绘制:
G = ox.graph_from_bbox(34.345, 34.355, 107.22, 107.23, network_type='drive')
G_projected = ox.project_graph(G)
ox.plot_graph(G_projected)
graph_from_bbox() (in module osmnx.graph)
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)
graph 模块包含用于创建 graph 的函数,graph_from_bbox 函数指定边界框的四边,获取 OSM 该边界框内数据后创建 graph,返回值是 networkx.MultiDiGraph
2b) street network from lat-long point
获得距离经纬度点 0.75 公里(沿网络)内的街道网络:
G = ox.graph_from_point(
ox.geocoder.geocode('天下汇(高新店), 宝鸡'),
dist=750,
network_type='all'