【问题标题】:Find the nearest X,Y coordinate using R使用 R 查找最近的 X,Y 坐标
【发布时间】:2015-12-13 15:38:03
【问题描述】:

我刚开始学习 R,但希望项目尽快完成。这很简单:我有一个 X 列和一个由 X 坐标和 Y 坐标组成的 Y 列。 (在 NAD27 坐标系中工作)。从第一个坐标开始,我想找到数据集中最近的点,然后移动到下一个坐标并找到它在同一数据集中的最近点。理想情况下,它将遍历每个点并确定最近的点。

point x         y
1     1601774   14544454
2     1616574   14579422
3     1608698   14572922
4     1602948   14572990
5     1607355   14573871
6     1615336   14578178
7     1603398   14574495
8     1605153   14570727
9     1606758   14573845
10    1606655   14570953

【问题讨论】:

  • 欢迎来到 Stack Overflow!请包括一个小样本数据集(我不熟悉 NAD27 坐标系,我认为其他人也可能如此)。进一步请包括您尝试执行此操作的任何代码。
  • sp::spDistsrgeos::gDistance 应该会有所帮助,但您需要先尝试一些事情(人们不只是要编写代码)
  • 一个明显的方法是使用距离矩阵。不过,这可能会占用大量内存,ds <- as.matrix(dist(dat, diag=TRUE, upper=TRUE)); diag(ds) <- Inf; apply(ds, 1, which.min)。但可能还有更聪明的方法。
  • 这真的取决于程序员时间/内存/计算时间的权衡。 @bunk 关于快速和肮脏的方法是正确的。谷歌搜索“r 查找最近点”为您提供了很多选择。 sqrt(rowSums(sweep(mydata[-i,],MARGIN=1,FUN="-",mydata[i,])^2)) 为您提供从点 i 到所有其他点的所有距离...
  • k-d 树也可以是一个选项:stackoverflow.com/a/30263451/3093387

标签: r coordinates spatial


【解决方案1】:

这是一种方法,使用 RANN 包。该方法类似于this post 中显示的方法,但适用于单个点集(链接的帖子是关于在集合 A 中找到与集合 B 中的每个点最近的点)。

xy <- read.table(text='point x         y
1     1601774   14544454
2     1616574   14579422
3     1608698   14572922
4     1602948   14572990
5     1607355   14573871
6     1615336   14578178
7     1603398   14574495
8     1605153   14570727
9     1606758   14573845
10    1606655   14570953', header=TRUE, row.names=1)

library(RANN)
closest <- nn2(data=xy, k=2)[[1]]

在上面,我们将您的一组点xy 提供给data 参数,并指定我们希望nn2 找到离每个点最近的两个 点(因为最近的点是焦点本身)。 nn2 函数返回一个包含两个元素的列表:每个k 最近点(对于每个查询点)的索引向量(在本例中为矩阵);以及距离的向量(矩阵)。我假设我们对距离不感兴趣,所以在上面我们将结果子集到第一个元素。

对于我们的问题,结果是一个双列矩阵,第一列给出查询点的索引,第二列给出最近点的索引。

closest

##       [,1] [,2]
##  [1,]    1    8
##  [2,]    2    6
##  [3,]    3    5
##  [4,]    4    7
##  [5,]    5    9
##  [6,]    6    2
##  [7,]    7    4
##  [8,]    8   10
##  [9,]    9    5
## [10,]   10    8

要获得最近点的坐标矩阵,您可以使用:

xy[closest[, 2], ]

默认情况下 nn2 使用 kd 树 - 您可能想尝试使用 treetype='bd'

【讨论】:

  • 这看起来很棒。只是为了确保我理解正确,最接近坐标 1 的点是坐标 8?坐标 2,坐标 6,等等?
  • @jhenson - 这是正确的(好吧,最接近坐标 1 的点是坐标 1,第二近的点是 8,但是是的,你明白了)
  • 对!非常感谢,到目前为止,它对我的​​数据非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2016-08-28
  • 2019-07-31
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
相关资源
最近更新 更多