从不同长度的不同数据集中查找纬度和经度的最近点

use*_*352 4 r

我有两个不同站的数据集.数据基本上是具有坐标,经度和纬度的数据框架.给定第一个数据集(反之亦然),我想找到其他数据集中每个站的最近站.我的主要问题是坐标没有排序,数据集的长度不同.例如,第一个包含2228个站,第二个包含1782个.所以,我不知道如何处理这个.我知道函数rdist.earth,我试图使用它.这是一个简短的例子:

      #First data set of stations
        set1 <- structure(list(lon = c(13.671114, 12.866947, 15.94223, 11.099736,  
         12.958342, 14.203892, 11.86389, 16.526674, 16.193064, 17.071392
        ), lat = c(48.39167, 48.148056, 48.721111, 47.189167, 47.054443, 
         47.129166, 47.306667, 47.84, 47.304167, 48.109444)), .Names = c("lon", 
       "lat"), row.names = c(NA, 10L), class = "data.frame")

      #Second data set
      set2 <- structure(list(lon = structure(c(14.4829998016357, 32.4000015258789, 
      -8.66600036621094, 15.4670000076294, 18.9160003662109, 19.0160007476807, 
      31.0990009307861, 14.3660001754761, 9.59899997711182, 11.0830001831055
       ), .Dim = 10L), lat = structure(c(35.8499984741211, 34.75, 70.9329986572266, 
      78.25, 69.6829986572266, 74.515998840332, 70.3659973144531, 67.265998840332, 
       63.6990013122559, 60.1990013122559), .Dim = 10L)), .Names = c("lon", 
      "lat"), row.names = c(NA, 10L), class = "data.frame")
       #computing distance
       dd<- rdist.earth(set1,set2,miles=FALSE)
Run Code Online (Sandbox Code Playgroud)

现在我有矩阵dd,距离..但我不知道如何找到每个点的信息.我的意思是,例如,从数据集1,第一点,第二个数据集中最近的站点是什么?任何的想法??

非常感谢.

joh*_*nes 17

这是另一种可能的解决方案:

library(rgeos)
set1sp <- SpatialPoints(set1)
set2sp <- SpatialPoints(set2)
set1$nearest_in_set2 <- apply(gDistance(set1sp, set2sp, byid=TRUE), 1, which.min)

head(set1)
       lon      lat nearest_in_set2
## 1 13.67111 48.39167              10
## 2 12.86695 48.14806              10
## 3 15.94223 48.72111              10
## 4 11.09974 47.18917               1
## 5 12.95834 47.05444               1
## 6 14.20389 47.12917               1
Run Code Online (Sandbox Code Playgroud)


Man*_*les 5

您可以使用一系列apply命令来执行此操作。请注意,函数中的x和y是指set1和set2而不是纬度坐标-纬度坐标指定为p1和p2。[注意:已编辑以更正set1和set2在计算中的顺序-该顺序确定您是在计算set2中的值是否最接近set 1中的每个值,反之亦然)

distp1p2 <- function(p1,p2) {
    dst <- sqrt((p1[1]-p2[1])^2+(p1[2]-p2[2])^2)
    return(dst)
}

dist2 <- function(y) min(apply(set2, 1, function(x) min(distp1p2(x,y))))

apply(set1, 1, dist2)
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要的是距离最近的站点而不是最小距离的站点,请在dist2()中将min更改为which.min

dist2b <- function(y) which.min(apply(set2, 1, function(x) min(distp1p2(x,y))))
apply(set1, 1, dist2b)
Run Code Online (Sandbox Code Playgroud)

并获得该站的位置

set2[apply(set1, 1, dist2b),]
Run Code Online (Sandbox Code Playgroud)