本文还是以广州市路网为例,通过osmmx调用ox.add_edge_speeds(G)时,该函数会遍历图G 中的每条边(即每条街道),并基于一些预设的规则或街道属性(如街道类型、是否为主要道路、是否有速度限制等)来估算车辆在这条街道上行驶的平均速度。然后,这个速度值会被添加为边的属性,命名为 ''speed_kph''(表示速度,单位为公里/小时),并增加"travel_time"(表示通行时间,单位为秒)。
完整代码#运行环境 Python 3.11
# 导入osmnx库,用于处理地理空间数据和网络分析
import osmnx as ox# 定义地点名称,这里是广州市,位于中国广东省
place_name = "guangzhou, Guangdong, China"# 使用osmnx的graph_from_place函数,根据地点名称下载并构建该地区的街道网络图
G = ox.graph_from_place(place_name)# 为图G中的边添加速度信息。如果边缺少速度数据,osmnx会尝试根据道路类型自动估计速度
G = ox.add_edge_speeds(G)# 根据已添加的速度信息,计算图中每条边的预估旅行时间(以秒为单位)
G = ox.add_edge_travel_times(G)# 将图G转换为GeoDataFrame,仅包含边的信息(不包含节点)
# GeoDataFrame是geopandas库中的一种数据结构,专为地理空间数据设计
edges = ox.graph_to_gdfs(G, nodes=False)# 确保'higwhay'列的数据类型为字符串,以便后续的分组操作
edges["highway"] = edges["highway"].astype(str)# 对不同道路类型进行分组,并计算每种类型道路的平均长度、平均速度(千米/小时)和平均旅行时间(秒)
# 使用.round(1)对结果进行四舍五入,保留一位小数
grouped_stats = edges.groupby("highway")[["length", "speed_kph", "travel_time"]].mean().round(1)# 将处理好的街道网络图G保存为GeoPackage格式的文件,文件保存路径为"E:/data/guangzhou_network.gpkg"
ox.save_graph_geopackage(G, filepath="E:/data/guangzhou_network.gpkg")
导入ArcGISpro进行展示,并以speed作为颜色分级标签,分级方法选择''自然间断点分段法'',分了5个层级;
分级结果如图所示;
可以发现核心区的道路限速还是比较严重的,最畅通的还是高速公路;
引用summary_stats 这个变量对路网速度进行分类汇总,通过对 edges_gdf 这个GeoDataFrame进行分组和聚合操作得到的。edges_gdf 包含路段信息,包括它们所属的highway类型(如高速公路、主干道、次干道等)、每条边的speed_kph(速度,单位:公里/小时)和travel_time(通行时间)。
具体的分组和聚合操作如下:
-
分组(groupby):通过''highway''列进行分组,意味着会将所有具有相同''highway''值的行(即边)归为一组。
-
聚合(agg):对每个分组执行聚合操作。这里对''speed_kph''列计算了平均值''mean'',表示该''highway''类型下所有边的平均速度;同样地,也对''travel_time''列计算了平均值,但需要注意,这个平均值可能不是直接基于实际测量得出的旅行时间,而可能是基于某种假设或计算得出的。
-
四舍五入(round(1)):最后,将计算出的平均速度和平均旅行时间四舍五入到小数点后一位。
完整代码#运行环境 Python 3.11
import osmnx as ox
import pandas as pd # 新增导入pandas库用于数据处理和导出Excel
import matplotlib.pyplot as plt# 设置下载和分析的城市地点
place_name = "guangzhou, Guangdong, China"# 下载并构建指定城市的街道网络图
G = ox.graph_from_place(place_name)# 为图中缺失速度信息的边添加默认速度数据,依据道路类型进行估算
G = ox.add_edge_speeds(G)# 根据每条边的速度数据,计算并添加预估的旅行时间(以秒为单位)
G = ox.add_edge_travel_times(G)# 将原始地理坐标系下的图投影到UTM坐标系,这一步骤便于进行距离相关的计算
G_projected = ox.project_graph(G)# 将投影后的图转换为只包含边信息的GeoDataFrame,GeoDataFrame是geopandas库中用于处理地理数据的数据结构
edges_gdf = ox.graph_to_gdfs(G_projected, nodes=False)# 确保'highway'列的数据类型为字符串,便于接下来的分组操作
edges_gdf["highway"] = edges_gdf["highway"].astype(str)# 按照道路类型对边进行分组,并计算每种类型道路的平均速度(千米/小时)和平均旅行时间(秒),结果四舍五入到一位小数
summary_stats = edges_gdf.groupby("highway").agg({"speed_kph": "mean", "travel_time": "mean"}).round(1)
print(summary_stats)# 导出计算结果到Excel文件
# 指定导出的文件路径和名称
output_file = "Guangzhou_Road_Speeds_and_Travel_Times.xlsx"
# 将summary_stats DataFrame导出为Excel文件
summary_stats.to_excel(output_file, index=True)
print(f"数据已成功导出到 {output_file}")
导出的路网速度进行分类汇总xlsx结果如下;
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。