查找两列之间具有最小欧氏距离的经纬度对
Finding the lat-lon pairs with minimum Euclidean distance between two columns
我正在尝试找到 最有效的方法 来解决 R 中的以下难题 而 不必使用 嵌套 for
循环(嵌套for
循环将永远存在):
假设我们有 2 个数据帧 d_zone2
和 stops
。在它们的列中有三个:lat
、long
和zone,
,它们描述了地图上某些点的位置,这些点被划分为不同的多边形。 d_zone2
中的zone
列全部初始化为NA
。现在,我想根据以下规则为 d_zone2
中 zone
列中的每个元素分配正确的值:对于 d_zone2
中的每对经纬度,我分配 zone
中的元素 stops
如果这对经纬度对应于 stops
中的 zone
元素与 d_zone2
中的经纬度对具有最小欧氏距离。
我初步想到的方案是在lat
的基础上,将数据框stops
按递增的顺序排列,然后long
.然后对于 d_zone2
中的每一对 lat-lon
,我可以使用 nested for
循环遍历所有连续的 lat-lon
对确定我的 lat-lon
在 d_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]
相比)。因此,我认为 只有 有效的方法是 找到 stops
中 lat-lon
的 对给出 minimum 到 d_zone2
中一对经纬度的欧氏距离。但是我不知道如何在不使用 nested for()
循环的情况下在 R 中执行此操作。
第二种方法:另一种方法是利用存储在下面zone.csv
文件中的多边形列表。现在,解决方案是 select 出 d_zone2
和 stops
中一对 lat-lon
落入的桶,然后只需分配 [=51 中分配的区域编号=] 对于那个特定的 lat-lon
对到 d_zone2
中的元素。
问题:谁能帮我用Euclidean或2nd[=89=解决这个难题] 上面演示的方法?我想用dplyr::select(dplyr::left_join(x = d_zone2, y = stops%>% select("Lat", "Long", X8), by = ...)
,但不知道如何填写by=??
的真实条件
这大约需要 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)]
我正在尝试找到 最有效的方法 来解决 R 中的以下难题 而 不必使用 嵌套 for
循环(嵌套for
循环将永远存在):
假设我们有 2 个数据帧 d_zone2
和 stops
。在它们的列中有三个:lat
、long
和zone,
,它们描述了地图上某些点的位置,这些点被划分为不同的多边形。 d_zone2
中的zone
列全部初始化为NA
。现在,我想根据以下规则为 d_zone2
中 zone
列中的每个元素分配正确的值:对于 d_zone2
中的每对经纬度,我分配 zone
中的元素 stops
如果这对经纬度对应于 stops
中的 zone
元素与 d_zone2
中的经纬度对具有最小欧氏距离。
我初步想到的方案是在lat
的基础上,将数据框stops
按递增的顺序排列,然后long
.然后对于 d_zone2
中的每一对 lat-lon
,我可以使用 nested for
循环遍历所有连续的 lat-lon
对确定我的 lat-lon
在 d_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]
相比)。因此,我认为 只有 有效的方法是 找到 stops
中 lat-lon
的 对给出 minimum 到 d_zone2
中一对经纬度的欧氏距离。但是我不知道如何在不使用 nested for()
循环的情况下在 R 中执行此操作。
第二种方法:另一种方法是利用存储在下面zone.csv
文件中的多边形列表。现在,解决方案是 select 出 d_zone2
和 stops
中一对 lat-lon
落入的桶,然后只需分配 [=51 中分配的区域编号=] 对于那个特定的 lat-lon
对到 d_zone2
中的元素。
问题:谁能帮我用Euclidean或2nd[=89=解决这个难题] 上面演示的方法?我想用dplyr::select(dplyr::left_join(x = d_zone2, y = stops%>% select("Lat", "Long", X8), by = ...)
,但不知道如何填写by=??
这大约需要 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)]