在巨大的 Spark 数据集上扩展 OSMNX 库的“nearest_edges”函数

问题描述 投票:0回答:1

我正在尝试使用纬度和长度列作为创建多重图的输入,在巨大的数据集上缩放从“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
python dataframe pyspark user-defined-functions osmnx
1个回答
0
投票

您的示例没有给我自己尝试的代码,但总的来说,我注意到 OSMnx 不适合大量数据。特别是,

nearest_edges
使用大量 CPU 和 RAM 来构建索引,然后在该索引上进行查询。但是,
nearest_edges
应该可以工作,并且在查询多个点时针对速度进行了优化。我会尝试以下事情:

从较小的数据子集开始

一开始仅使用您绝对需要的数据来测试您的功能。然后,如果它有效,就让它运行所需的时间。

使用 GeoPandas 构建空间索引

如果您只想查询距离几个点最近的边缘,请尝试使用 GeoDataFrame 并在 sindex 中对其进行索引。然后查询靠近您的点的行并使用 shapely 手动计算距离。这可能会更快,因为 sindex 的构建速度可能比 OSMnx 使用的索引更快。

分析您的代码

使用 cprofile 或类似工具运行您的代码,以查看 OSMnx 的哪一部分真正使其变慢,然后从那里开始。

© www.soinside.com 2019 - 2024. All rights reserved.