我正在尝试使用纬度和长度列作为创建多重图的输入,在巨大的数据集上缩放从“nearest_edges”函数(来自 OSMNX 库)返回的距离值。它需要永远运行并且有时返回 null。还有其他解决办法吗?我创建了一个用户定义的函数(下面的代码),因此我可以使用该数据集的长纬度列将该函数应用于数据集。
我的代码如下: 将 osmnx 导入为 ox @udf(returnType=T.DoubleType()) def get_distance_to_road (lat_dd=无,long_dd=无,dist_bbox=无): 尝试: 位置 = (lat_dd,long_dd)
G = ox.graph_from_point(
center_point=location,
dist=dist_bbox, #meter
simplify=True,
retain_all=True,
truncate_by_edge=True,
network_type='all'
)
Gp = ox.project_graph(G)
point_geom_proj, crs = ox.projection.project_geometry(Point(reversed(location)), to_crs=Gp.graph['crs'])
distance = np.round(ox.nearest_edges(Gp, point_geom_proj.x, point_geom_proj.y, return_dist=True)[1],2).item()
except Exception:
distance = None
return distance #meter
您的示例没有给我自己尝试的代码,但总的来说,我注意到 OSMnx 不适合大量数据。特别是,
nearest_edges
使用大量 CPU 和 RAM 来构建索引,然后在该索引上进行查询。但是,nearest_edges
应该可以工作,并且在查询多个点时针对速度进行了优化。我会尝试以下事情:
一开始仅使用您绝对需要的数据来测试您的功能。然后,如果它有效,就让它运行所需的时间。
如果您只想查询距离几个点最近的边缘,请尝试使用 GeoDataFrame 并在 sindex 中对其进行索引。然后查询靠近您的点的行并使用 shapely 手动计算距离。这可能会更快,因为 sindex 的构建速度可能比 OSMnx 使用的索引更快。
使用 cprofile 或类似工具运行您的代码,以查看 OSMnx 的哪一部分真正使其变慢,然后从那里开始。