【问题标题】:Find closest neighboring point and list of neighbors within a given radius, coordinates lat-long查找给定半径内最近的相邻点和邻居列表,坐标经纬度
【发布时间】:2022-01-24 14:54:26
【问题描述】:

我正在尝试匹配/链接 2 个数据集,每个数据集都有一个纬度。我想为第一个数据集中的每个给定坐标按距离生成最接近的 n 个匹配项。我能够得到最接近的匹配,但不知道如何扩展它以获得 n 个匹配。

数据集看起来像这样- table_1

id_1 lat_1 lon_
a1 50.8613159 1.2483
d7 50.8526967 1.2566349
s2 50.8666 1.2433232

table_2

id_2 lat_2 lon_2
x2 50.8713562548622 1.24447448004003
r1 50.8548464 1.2402125971721
o9 50.87906755026 1.2453153747299

我用来确定最接近匹配的代码是从 RANN 包中找到欧几里得分布。

table_1[, c(3, 4)] <- as.data.frame(RANN::nn2(table_1[, c("lat_1", "lon_1")],
                                              table_2[, c("lat_2", "lon_2")], k=1))

返回一个索引号和距离。理想情况下,我希望我的输出看起来像-

对于 3 个最接近的匹配项:

id_1 lat_1 lon_1 index_no
a1 50.8613159 1.2483 3
a1 50.8613159 1.2483 2
a1 50.8613159 1.2483 1

其中最后一列 index_no 提供了 table_2 中最近坐标的索引号,并填充 id_1 3 次以提供以 km 或 m 为单位的 dist 以任意顺序提供的 3 个最接近的匹配项。

【问题讨论】:

  • 你试过把 k 改成 3 吗?

标签: r gis geospatial


【解决方案1】:

使用apply()"dat1" 的每一行都使用k=3cbind。请注意,要在其中找到邻居的数据应放在第一位(为了说明,我将您的第二个数据集扩展了一行)。

r <- RANN::nn2(dat1[, c("lat_1", "lon_1")], 
               dat2[, c("lat_2", "lon_2")], k=4)$nn.idx |>
  apply(1, cbind, dat1) |>
  do.call(what=rbind) |>
  {\(.) {names(.)[1] <- 'index_no';.[order(.$id), c(2:3, 1)]}}()  ## optional step, 
                                                                  ## sort and 
                                                                  ## rename cols

r
#   id_1    lat_1 index_no
# 1   a1 50.86132        2
# 4   a1 50.86132        4
# 7   a1 50.86132        1
# 2   d7 50.85270        1
# 5   d7 50.85270        2
# 8   d7 50.85270        2
# 3   s2 50.86660        4
# 6   s2 50.86660        1
# 9   s2 50.86660        3

注意:对于|&gt; 管道,您需要至少 4.1 的 R 版本。如果您注定要使用旧的 R 版本,请尝试:

do.call(apply(RANN::nn2(dat1[, c("lat_1", "lon_1")], 
                        dat2[, c("lat_2", "lon_2")], k = 4)$nn.idx, 
              1, cbind, dat1), what = rbind)

数据:

dat1 <- structure(list(id_1 = c("a1", "d7", "s2"), lat_1 = c(50.8613159, 
50.8526967, 50.8666), lon_1 = c(1.2483, 1.2566349, 1.2433232)), class = "data.frame", row.names = c(NA, 
-3L))

dat2 <- structure(list(id_2 = c("x2", "r1", "o9", "xy"), lat_2 = c(50.8713562548622, 
50.8548464, 50.87906755026, 50.85), lon_2 = c(1.24447448004003, 
1.2402125971721, 1.2453153747299, 1.25)), class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

  • 很抱歉,$nn.idx |> 部分到底是什么意思?我想我理解这种方法,但我对代码有点困惑
  • @AamashHaroon 这是新的基管,请看更新。你能把你的 R 更新到 >= 4.1 吗?
猜你喜欢
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 2020-11-05
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多