使用R语言找到最近的X,Y坐标

8

我刚开始学习R语言,但是希望能尽快完成项目。这是一个相对简单的任务:我有一个X列和一个Y列,分别包含X坐标和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

3
欢迎来到 Stack Overflow!请提供一个小的样本数据集(我对 NAD27 坐标系统不熟悉,我想其他人可能也不熟悉)。另外,请包含您尝试执行此操作的任何代码。 - josliber
4
sp::spDistsrgeos::gDistance应该会有所帮助,但你需要先尝试一些东西(人们不会只为你写代码)。 - hrbrmstr
2
一个明显的方法是使用距离矩阵。虽然这可能会占用大量内存,但可以采用以下方法: ds <- as.matrix(dist(dat, diag=TRUE, upper=TRUE)); diag(ds) <- Inf; apply(ds, 1, which.min)。不过也可能有更巧妙的方法。 - Rorschach
2
这真的取决于程序员在时间/内存/计算时间权衡方面所做的决定。 @ bunk 关于快速和肮脏方法是正确的。 搜索“r查找最近点”会给您很多选择。 'sqrt(rowSums(sweep(mydata [-i,],MARGIN = 1,FUN =“-”,mydata [i,])^ 2))'会为您提供从点'i'到所有其他点的距离... - Ben Bolker
1
k-d树也可以是一个选项:https://dev59.com/Rorda4cB1Zd3GeqPSeY3#30263451 - josliber
显示剩余6条评论
1个回答

10

这里有一种方法,使用RANN包。该方法类似于此帖子中所示的方法,但是适用于单个点集(链接的帖子是关于在集合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
这看起来很棒。只是为了确认我的理解,1号坐标最靠近的点是8号坐标?2号坐标也是如此,最靠近的点是6号坐标等等? - jhenson
@jhenson - 这是正确的(嗯,最接近坐标1的点是坐标1,第二接近的是8,但是没错,你明白了) - jbaums
1
太好了!非常感谢,目前它已经与我的数据完美配合。 - jhenson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接