【问题标题】:Fastest way to calculate minimum distance from a large set of locations to facilties in R/sf计算从大量位置到 R/sf 中设施的最小距离的最快方法
【发布时间】:2020-10-28 15:25:51
【问题描述】:

我有两个 CSV 文件,其中包含位置坐标(1100 万行,三列:“lid”、“lat”、“lon”)和设施(50k 行列“fid”、“lat”、“lon” )。对于每个位置,我需要计算到最近设施的最小距离。

我知道如何在 R 中使用“st_distance”来做到这一点。但是,“st_distance”需要很长时间,因为它首先计算完整的距离矩阵并且两个文件非常大。我尝试将位置文件分解为更小的组,并在 3 个核心上使用“future_map”,这比我预期的要花费更多的时间。有没有办法加快这个过程?

【问题讨论】:

  • sf::st_nearest_feature() 可能会有所帮助。否则,将您的两组完全连接起来,这样每个位置都连接到每个设施。使用geodist 计算每对之间的距离,然后选择每个位置的最小距离。我建议使用data.table 来完成这一切。

标签: r tidyverse geospatial distance sf


【解决方案1】:

您是否考虑过先使用 st_buffer?这将限制您需要搜索的位置数量以找到最近的位置。例如,从 10 英里的半径开始,看看是否捕获了所有数据。如果这不起作用,可以尝试 findNeighbors() 函数。见文档https://www.rdocumentation.org/packages/fractal/versions/2.0-4/topics/findNeighbors

如果您将来提供数据样本也是一件好事。

【讨论】:

  • 感谢您的评论。我没有发布数据,因为它是机密的。
  • 如果您的数据是机密的,您应该制作一个您可以在线发布的小示例。如果其他人可以简单地复制和粘贴要使用的数据集,则问题会更容易回答。
【解决方案2】:

我确信必须有更好的方法来做到这一点,但我就是这样做的。希望对您有所帮助。

library(tidyverse)
library(furrr)


MILLION_1 <- 10^6
K_50 <- 10^4*5

# dummy data --------------------------------------------------------------------

d_1m <- 
  tibble(
    lid_1m = 1:MILLION_1,
    long_1m = abs(rnorm(MILLION_1) * 100),
    lat_1m = abs(rnorm(MILLION_1)) * 100
  )


d_50k <- 
  tibble(
    lid_50k= 1:K_50,
    long_50k = abs(rnorm(K_50) * 100),
    lat_50k = abs(rnorm(K_50) * 100)
  )


# distance calculation for each facility ------------------------------------------

future::plan(multiprocess)

d_distance <- 
  # take one row of facility: long,lat and id as an input
  future_pmap_dfr(d_50k, function(...){
  d50_row <- tibble(...)
  # to calculate distance between one facility location and 1 million other locations 
  d <- tidyr::crossing(d_1m, d50_row)
  
  d %>% 
    mutate(
      #euclidean distance
      distance = sqrt((long_1m - long_50k)^2 + (lat_1m - lat_50k)^2)
      ) %>% 
    # to get the location which is the closest to the facility
    filter(distance == min(distance))

})

【讨论】:

  • 感谢您的建议!从 1000 个位置到单个位置而不是单个位置进行交叉会更有效吗?即使用每一行进行交叉的间接成本有多大。顺便说一句,技术上我想计算每一行位置到最近设施的距离 - 所以我必须从你的代码中翻转名称。
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多