首页 > 解决方案 > 尝试制作网络节点的 GeoDataFrame 时出错

问题描述

我需要在道路网络上制作一些节点的 GeoDataFrame(使用 OSMnx 从 OpenStreetMap 中提取)。在下面的代码中,graph_proj是我正在使用其节点的图,点是start_pointend_point

import osmnx as ox
import geopandas as gpd
nodes_proj, edges_proj = ox.graph_to_gdfs(graph_proj, nodes=True, edges=True)

# Finding the nodes on the graph nearest to the points
start_node = ox.nearest_nodes(graph_proj, start_point.geometry.x, start_point.geometry.y, return_dist=False)
end_node = ox.nearest_nodes(graph_proj, end_point.geometry.x, end_point.geometry.y, return_dist=False)
start_closest = nodes_proj.loc[start_node]
end_closest = nodes_proj.loc[end_node]

# Create a GeoDataBase from the start and end nodes
od_nodes = gpd.GeoDataFrame([start_closest, end_closest], geometry='geometry', crs=nodes_proj.crs)

在最后一步(“# Create a GeoDataBase...”等)中,会引发错误。显然,它与传递给 GeoDataFrame 函数的 3 维数组有关。我传入位置([start_closest, end_closest])的方式会导致 3D 数组,这对吗?(错误消息显示,'必须通过二维输入。shape=(2, 1, 7)')我尝试转置此数组,但 GeoPandas 无法找到“几何”列。我如何以一种可以接受的方式传递这个论点?

标签: pythonarraysdataframegeopandasosmnx

解决方案


好的,所以我能够通过将每个节点写入其自己的 GeoDataFrame 然后合并两个 GeoDataFrame 来解决这个问题,如下所示:

od_nodes1 = gpd.GeoDataFrame(start_closest, geometry='geometry', crs=nodes_proj.crs)
od_nodes2 = gpd.GeoDataFrame(end_closest, geometry='geometry', crs=nodes_proj.crs)
od_nodes = od_nodes1.append(od_nodes2)

但是,肯定有一种更优雅的方式可以将多个特征写入 GeoDataFrame 吗?


推荐阅读