利用OSMnx进行城市路网数据的速度与通行时间推算及分析

本文还是以广州市路网为例,通过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(通行时间)。

具体的分组和聚合操作如下:

  1. 分组(groupby):通过''highway''列进行分组,意味着会将所有具有相同''highway''值的行(即边)归为一组。

  2. 聚合(agg):对每个分组执行聚合操作。这里对''speed_kph''列计算了平均值''mean'',表示该''highway''类型下所有边的平均速度;同样地,也对''travel_time''列计算了平均值,但需要注意,这个平均值可能不是直接基于实际测量得出的旅行时间,而可能是基于某种假设或计算得出的。

  3. 四舍五入(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结果如下;

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值