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

R 从不同长度的数据集中查找最近的经纬度点,r,R,我有两个不同站点的数据集。数据基本上是带有坐标、经度和纬度的数据帧。给定第一个数据集(反之亦然),我想为另一个数据集中的每个站点找到最近的站点。我这里的主要问题是坐标没有排序,数据集有不同的长度。例如,第一个包含2228个站点,第二个包含1782个站点。所以,我不知道如何处理这件事。 我知道rdist.earth函数,并尝试使用它。这是其中的一个简短示例: #First data set of stations set1 <- structure(list(lo

我有两个不同站点的数据集。数据基本上是带有坐标、经度和纬度的数据帧。给定第一个数据集(反之亦然),我想为另一个数据集中的每个站点找到最近的站点。我这里的主要问题是坐标没有排序,数据集有不同的长度。例如,第一个包含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)
#站点的第一个数据集

set1您可以使用一系列apply命令来执行此操作。请注意,函数中的x和y指的是set1和set2,而不是lat lon坐标-lat lon坐标指定为p1和p2。[注:编辑以更正计算中set1和set2的顺序-顺序决定您是在计算set2中最接近集合1中每个值的值,还是在计算集合1中每个值的值)


我不知道你想要什么,但也许这会给你一些提示
如果要获取每列的最小值

  dd <- as.data.frame(dd)
  sapply(dd, min)
  paste(rownames(dd), ":", apply(dd,2,which.min)) #or

dd以下是另一种可能的解决方案:

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
库(rgeos)

set1sp如果您有非常大的数据集,使用距离命令可能会很麻烦,因为它必须为参考数据中的每个点计算到备选数据中所有点的距离。“yaImpute”包中的“ann”命令是一个非常快速的近似近邻例程,适用于大距离计算。它将返回所需的“最近”记录数(k值)以及到每个记录的距离

注意:尽管是一个近似的近邻,结果在相同数据的重复运行中是稳定的。它不包括点的随机选择或任何东西。请参阅文档

FWIW,我真的不是在开玩笑说快。我用它来寻找两个矩阵的knn距离,每个矩阵都有数百万个点。为这个矩阵做一个距离矩阵或者一行一行地迭代,要么是不可行的,要么是非常缓慢的

快速示例:

# Hypothetical coordinate data
set.seed(2187); foo1 <- round(abs(data.frame(x=runif(5), y=runif(5))*100))
set.seed(2187); foo2 <- round(abs(data.frame(x=runif(10), y=runif(10))*100))
foo1; foo2

# the 'ann' command from the 'yaImpute' package
install.packages("yaImpute")
library(yaImpute)

# Approximate nearest-neighbour search, reporting 2 nearest points (k=2)
# This command finds the 3 nearest points in foo2 for each point in foo1
# In the output:
#   The first k columns are the row numbers of the points
#   The next k columns (k+1:2k) are the *squared* euclidean distances
knn.out <- ann(as.matrix(foo2), as.matrix(foo1), k=3)
knn.out$knnIndexDist

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    5    4  729 1658 2213
[2,]    2    3    7   16  100 1025
[3,]    9    7    5   40   81  740
[4,]    4    1    6   16  580  673
[5,]    5    7    9    0  677  980
假设坐标数据
seed(2187);foo1s2包中的函数s2_-nextest_-feature()从不同的数据集中查找最近的点

例如,使用您的数据:

库(s2)
set1_s2 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
#> 7  11.86389 47.30667       1
#> 8  16.52667 47.84000       1
#> 9  16.19306 47.30417       1
#> 10 17.07139 48.10944       1

这听起来类似于232行参考和14124行备选方案的问题系统时间比较:1)应用方法=3.89秒2)ann方法=0.02秒我有相同的问题,但此解决方案不适用于我。我收到错误消息:错误在
$
  dd <- as.data.frame(dd)
  sapply(dd, min)
  paste(rownames(dd), ":", apply(dd,2,which.min)) #or
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
# Hypothetical coordinate data
set.seed(2187); foo1 <- round(abs(data.frame(x=runif(5), y=runif(5))*100))
set.seed(2187); foo2 <- round(abs(data.frame(x=runif(10), y=runif(10))*100))
foo1; foo2

# the 'ann' command from the 'yaImpute' package
install.packages("yaImpute")
library(yaImpute)

# Approximate nearest-neighbour search, reporting 2 nearest points (k=2)
# This command finds the 3 nearest points in foo2 for each point in foo1
# In the output:
#   The first k columns are the row numbers of the points
#   The next k columns (k+1:2k) are the *squared* euclidean distances
knn.out <- ann(as.matrix(foo2), as.matrix(foo1), k=3)
knn.out$knnIndexDist

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    5    4  729 1658 2213
[2,]    2    3    7   16  100 1025
[3,]    9    7    5   40   81  740
[4,]    4    1    6   16  580  673
[5,]    5    7    9    0  677  980