Press "Enter" to skip to content

使用OSMnx进行地理空间数据分析

学习如何使用Python下载、分析和可视化OpenStreetMap数据

Denys Nevozhai在Unsplash上的照片

这是有关地理空间数据分析的系列文章中的第四篇:

  1. 使用QGIS进行地理空间数据分析
  2. 开始使用OpenStreetMap的指南
  3. 使用GeoPandas进行地理空间数据分析
  4. 使用OSMnx进行地理空间数据分析(本文)

在之前的教程中,我介绍了地理空间数据分析的各个方面。我从不使用任何代码展示地理空间数据的实际示例,来使您深入理解相关概念。地理空间数据分析是一种普遍存在的领域,用于处理一种特殊类型的数据,即地理空间数据。

它包括将位置添加到非地理数据中。它充满了例子。您可以想到咖啡馆、医院、道路、河流、卫星图像等等。即使当您使用Google地图搜索一个地方时,您也正在与地理空间数据交互。

这次,我将专注于从OpenStreetMap下载、可视化和分析数据,这是最大的免费和可编辑的地理数据库,来自世界各地的志愿者共同参与这个巨大的项目。所有这些教程都是可能的,因为有一个名为OSMnx的Python包。让我们开始吧!

目录:

  • OSMnx简介
  • 下载和可视化OSM数据
  • 将图形转换为GeoDataframe
  • 提取兴趣点
  • 查找最短路径

OSMnx简介

OSMnx是一个从OpenStreetMap下载、分析和可视化网络数据的库。它依赖于两个库,即NetworkX和GeoPandas。特别地,它利用了NetworkX库中的graph模块来检索网络数据。

此外,它允许我们与两个OpenStreetMap API进行交互:

  • Nomatism用于地理编码,即通过名称和地址查找位置。
  • Overpass API用于提取兴趣点,如高速公路、学校和公园。

下载和可视化OSM数据

我们可以直接使用OSMnx而不是手动从网站或Geofabrik下载数据。

首先,我们需要导入四个库,它们将在本教程后面使用:

import osmnx as oximport foliumimport contextily as cximport matplotlib.pyplot as plt

除了OSMnx和matplotlib之外,我们还将利用folium,这是一个创建交互式叶片地图的功能强大的库,并使用contextily添加背景地图。这一方面非常重要,以获得逼真的地图。

像上次一样,我们读取并可视化意大利最大的城市之一博洛尼亚的OSM街道网络数据。

PLACE_NAME = 'Bologna, Italy'G = ox.graph_from_place(PLACE_NAME, network_type='drive')ox.plot_graph(G) 
博洛尼亚的黑白可视化

从黑白可视化中,我们可以观察到表示节点的点和描绘路线的线。与OpenStreetMap的网站相比,它可能看起来非常静态和基础。folium通过其强大且可解释的地图来拯救我们:

ox.plot_graph_folium(G)
使用Folium获得的博洛尼亚地图

这样做会好得多,不是吗?明亮的颜色和与地图的交互可能是使用Google Maps前往未知地点时至关重要的特点。

如果您更好地检查OpenStreetMap网站,您会注意到标准图层是默认的。除了标准图层之外,还有其他图层,例如Cycle Map和Transport Map。令人难以置信的是,我们可以根据我们的目的利用不同的图层。

使用OSMnx进行地理空间数据分析 数据科学 第4张

如果我们热爱自行车,我们会更感兴趣Cycle Map。这总是可以用一行代码实现:

G = ox.graph_from_place(PLACE_NAME, network_type='bike')

在下一节中,我们将考虑标准图。

将图形转换为GeoDataframe

处理图形不像处理Dataframes和GeoDataframes一样直观。因此,我们可能想将图形转换为GeoDataframe:

area,edges = ox.graph_to_gdfs(G)area.head()

使用OSMnx进行地理空间数据分析 数据科学 第5张

edges.head()

使用OSMnx进行地理空间数据分析 数据科学 第6张

您可以注意到我们已经获得了两个GeoDataframes,一个用于节点,一个用于边缘。如果您看一下几何图形,这一点是很清楚的。区域地理数据框只有一对坐标,即纬度和经度,而包含边缘的地理数据框中有两对坐标。

提取兴趣点

在处理数据科学项目时,我们尝试通过在Internet上搜索开放数据来向我们的数据集中添加信息。从OSM数据中,可以提取出兴趣点(POI),这些地方在我们的分析目的上可能会发现有趣。例如,餐厅,教堂,博物馆和公园。

例如,我们想分析博洛尼亚的交通情况,以优化和降低交通成本。在这种情况下,了解高速公路,加油站,停车场和其他与可能的瓶颈有关的地方将非常有用。

让我们获取城市中的所有加油站。这可以通过将燃料作为amenity键的值来实现。

fuel_stations = ox.geometries_from_place(    PLACE_NAME,    {"amenity": "fuel"},)fuel_stations.head()

使用OSMnx进行地理空间数据分析 数据科学 第7张

由于我们提取了所有加油站,了解它们位于何处,并可视化地图会更有用。此外,我们可以添加基础地图以更好地将我们的结果置于上下文中。

area_crs = area.to_crs('3857')edges_crs = edges.to_crs('3857')fuel_stations_crs = fuel_stations.to_crs('3857')fig, ax = plt.subplots(figsize=(10, 14))area_crs.plot(ax=ax, facecolor='white')edges_crs.plot(ax=ax, linewidth=1, edgecolor='blue')fuel_stations_crs.plot(ax=ax, color='red', alpha=0.9, markersize=12)plt.tight_layout()cx.add_basemap(ax,crs=area_crs.crs.to_string())

使用OSMnx进行地理空间数据分析 数据科学 第8张

太好了!我们可以看到大部分加油站都集中在市中心的周边地区。此外,我们还可以区分不同的服务站群组,在测量中心外的交通时应该考虑到这些群组。

找到最短路径

OSMnx库的另一个有用功能是可以计算两点之间的最短路径。

origin = (    ox.geocode_to_gdf("Parco della Montagnola, Bologna, Italy")     .to_crs(edges.crs)      .at[0, "geometry"]      .centroid  )destination = (    ox.geocode_to_gdf("Esso, Bologna, Italy")    .to_crs(edges.crs)    .at[0, "geometry"]    .centroid )origin_node_id = ox.nearest_nodes(G, origin.x, origin.y)destination_node_id = ox.nearest_nodes(G, destination.x, destination.y)

使用 shortest_path() 方法可以实现这一点,该方法默认使用 Dijkstra算法 计算源节点和目标节点之间的路径。

route = ox.shortest_path(G, origin_node_id, destination_node_id)route#[400881920,# 250763178,# 250763179,# 250763533, ...# 1694666466]

我们还可以尝试在同一张地图上可视化图和最短路径:

ox.plot_route_folium(G, route, route_linewidth=6, node_size=0)

使用OSMnx进行地理空间数据分析 数据科学 第9张

Et voilà!就像我们使用 Google 地图找路一样,但我们利用 OSMnx 库的功能来寻找它。

最后的想法:

这是一个使用 Python 处理 OSM 数据的指南。我发现 OSMnx 是处理 OpenStreetMap 数据最完整的 Python 库。当然,它更适合探索规模较小的地方,如城市。如果有更大的数据集,最好使用更专业的软件,如 QGIS,来可视化它们。您尝试过其他处理 OSM 数据的库吗?如果您知道,请在评论中留言。在此处查看代码。感谢阅读!祝您有美好的一天!

有用的资源:

  • OSMnx文档
  • 兴趣点
  • OSMnx:用于街道网络的Python库
  • 自动化GIS处理
Leave a Reply

Your email address will not be published. Required fields are marked *