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

用户名

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

假设我们有2个数据帧d_zone2stops在他们的柱是三个一:latlong并且zone,其描述地图划分为不同的多边形上的某些点的位置。中的zoned_zone2全部初始化为NA现在,我想通过以下规则为in中的每个元素分配正确的值:对于zonein中d_zone2的每对lat-lon d_zone2如果对应于in中的那个lat-lon的对具有最小的Euclidean ,我就分配zoneinstopszone元素stops到中的一对经纬度的距离d_zone2

我想到的初始解决方案是基于,然后stops递增顺序排列数据帧然后对于每对in ,我可以使用嵌套循环遍历所有连续的对,以确定my in的位置。代码如下:latlonglat-lond_zone2 forlat-lonlat-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])。因此,我认为唯一有效的方法是找到lat-loninstops中的给出与一对latlon最小欧几里得距离d_zone2但是我不知道如何在不使用嵌套 for()循环的情况下在R中执行此操作

第二种方法:另一种方法是利用存储在以下zone.csv文件中的创建的多边形列表现在,解决方案是从中选择一对lat-lonind_zone2stops掉入其中的存储桶,然后将stops$X8为该特定lat-lon分配的区域号分配给中的元素d_zone2

问题:有人可以用上面介绍欧几里得方法第二种方法来帮助我解决这个难题吗?我想使用dplyr::select(dplyr::left_join(x = d_zone2, y = stops%>% select("Lat", "Long", X8), by = ...),但是我不确定如何填写by=??

.RData文件包含两个数据帧d_zone2和停止。警告:文件很大!

地理多边形坐标

马丁·施梅泽(Martin Schmelzer)

这大约需要15秒钟,因为我们首先过滤掉重复的点。这给我们留下了5457个独特点d_zone2对于它们中的每一个,我们计算到所有停靠点的距离,并以最小距离获取停靠点的索引。之后,您可以通过停止标识将区域与所有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)] 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章