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
相关产品推荐
相关产品推荐

