查找两列之间具有最小欧氏距离的经纬度对

Finding the lat-lon pairs with minimum Euclidean distance between two columns

我正在尝试找到 最有效的方法 来解决 R 中的以下难题 不必使用 嵌套 for 循环(嵌套for 循环将永远存在):

假设我们有 2 个数据帧 d_zone2stops。在它们的列中有三个:latlongzone,,它们描述了地图上某些点的位置,这些点被划分为不同的多边形。 d_zone2中的zone列全部初始化为NA。现在,我想根据以下规则为 d_zone2zone 列中的每个元素分配正确的值:对于 d_zone2 中的每对经纬度,我分配 zone 中的元素 stops 如果这对经纬度对应于 stops 中的 zone 元素与 d_zone2 中的经纬度对具有最小欧氏距离。

我初步想到的方案是在lat的基础上,将数据框stops递增的顺序排列,然后long .然后对于 d_zone2 中的每一对 lat-lon,我可以使用 nested for 循环遍历所有连续的 lat-lon 对确定我的 lat-lond_zone2 中的位置。代码如下:

for(i in 1:nrow(d_zone2)){
   for(j in 1:nrow(stops)){
     if(d_zone2$Lat[i] >= stops$Lat[j] && d_zone2$Long[i] >= stops$Lat[j] && d_zone2$Lat[i]<= stops$Lat[j+1] && d_zone2$Long[i] <= stops$Lat[j+1]){
           d_zone2$X8[i] = stops$X8[j];
    }  
  }
}

然而,我意识到这不是完全正确,因为d_zone2$X8[i]可能属于stops$X8[j+1](因为它的lat-lon可能是更接近 stops$X8[j+1]stops$X8[j] 相比)。因此,我认为 只有 有效的方法是 找到 stopslat-lon 对给出 minimumd_zone2 中一对经纬度的欧氏距离。但是我不知道如何在不使用 nested for() 循环的情况下在 R 中执行此操作。

第二种方法:另一种方法是利用存储在下面zone.csv文件中的多边形列表。现在,解决方案是 select 出 d_zone2stops 中一对 lat-lon 落入的桶,然后只需分配 [=51 中分配的区域编号=] 对于那个特定的 lat-lon 对到 d_zone2 中的元素。

问题:谁能帮我用Euclidean2nd[=89=解决这个难题] 上面演示的方法?我想用dplyr::select(dplyr::left_join(x = d_zone2, y = stops%>% select("Lat", "Long", X8), by = ...),但不知道如何填写by=??

的真实条件

.R 包含数据帧 d_zone2 和停止点的数据文件。 警告:文件很大!

Geo-polygon coordinates

这大约需要 15 秒,因为我们首先过滤掉了重复的点。这给我们留下了 d_zone2 中的 5457 个独特点。对于它们中的每一个,我们计算到所有停靠点的距离并获得具有最小距离的停靠点的索引。之后,您可以通过站点 ID 将区域与所有 19228939 个点相匹配。

library(sp)
library(data.table)

setDT(d_zone2)

stop_points <- as.matrix(stops[, 3:2])
short <- unique(d_zone2, by = c("Long", "Lat"))
short[, ZONE := stops[which.min(spDists(x = stop_points, y = cbind(Long, Lat))),]$X8, by=.(Long, Lat)]