You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Osmnx由gdf重建路网图后调用basic_stats出现ValueError如何解决

报错原因
  • 核心问题是ESRI Shapefile格式存在属性名称最大10字符的限制:OSMnx原始路网节点自带的street_count属性(记录每个节点连通的街道数量,是统计功能的依赖属性)存储为Shapefile时会被截断为street_cou,导致后续从本地文件读取节点GeoDataFrame重建路网时,图结构丢失了street_count属性。
  • ox.basic_stats()调用streets_per_node()函数时,依赖节点的street_count属性计算统计值,属性缺失导致返回空序列,触发max() arg is an empty sequence报错。
  • 额外注意你提供的代码存在两处笔误:存储时GeoDataFrame的存储方法是to_file而非save_to_file,重建图的函数是ox.utils_graph.graph_from_gdfs而非ox.utiles_graph.graph_from_gdf,笔误也可能导致属性丢失或功能异常。
解决方法

方法1:更换存储格式(优先推荐)

放弃使用ESRI Shapefile格式,改用无属性名长度限制的格式存储GeoDataFrame,比如GeoJSON或者GPKG(GeoPackage),修改存储代码即可:

# 存储时用GPKG格式
n.to_file("nodes.gpkg", driver="GPKG")
e.to_file("edges.gpkg", driver="GPKG")

# 读取后重建图即可正常计算统计值
import geopandas as gpd
n = gpd.read_file("nodes.gpkg")
e = gpd.read_file("edges.gpkg")
G = ox.utils_graph.graph_from_gdfs(n, e)

方法2:适配Shapefile格式的属性截断问题

如果必须使用Shapefile存储,可以在存储前重命名长属性,读取后恢复:

# 存储前重命名属性
n = n.rename(columns={"street_count": "st_cnt"})
n.to_file("nodes.shp", driver="ESRI Shapefile")
e.to_file("edges.shp", driver="ESRI Shapefile")

# 读取后把属性名改回
n = gpd.read_file("nodes.shp")
n = n.rename(columns={"st_cnt": "street_count"})
e = gpd.read_file("edges.shp")
G = ox.utils_graph.graph_from_gdfs(n, e)

方法3:重建图后手动补全属性

如果已经有存好的Shapefile不想重新导出,可以在重建图后手动计算每个节点的街道数赋值:

G = ox.utils_graph.graph_from_gdfs(n, e)
# 手动计算每个节点的连通街道数
for node, degree in G.degree():
    G.nodes[node]['street_count'] = degree // 2 if G.is_directed() else degree
# 再调用统计函数即可正常运行
ox.basic_stats(G)

内容的提问来源于stack exchange,提问作者Määäx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:54:04