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)
其中mission_shape是多边形,因为我没用过所以不展示效果。

 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(northsoutheastwestnetwork_type='all_private'simplify=Trueretain_all=Falsetruncate_by_edge=Falseclean_periphery=Truecustom_filter=None)

其中north, south, east, west为边框的北纬、南纬、东经、西经
这在单行 Python 代码中获得了一些经纬度边界框内的可驾驶街道网络,然后将其投影到 UTM,然后绘制它:
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)

结果为:

 

 

 

 

 

 

posted @ 2022-05-08 21:10  追·不逝  阅读(5242)  评论(0编辑  收藏  举报