求两组R中两组点之间的最小距离

求两组R中两组点之间的最小距离,r,geospatial,latitude-longitude,R,Geospatial,Latitude Longitude,我有两个数据帧,每个数据帧有三个变量:location\u id,纬度和经度。对于第一个数据帧中的每个location\u id,除了location\u id与每个df之间的距离外,我还必须在第二个数据帧中找到最近的location\u id 我曾尝试使用expand.grid将两个数据帧的所有可能组合在一起(有效),但当我尝试将原始列表中的纬度和经度合并到超级列表中时,我的内存不足(第一个数据帧中有7000个位置ID,第二个数据帧中有5000个位置ID) 我能够得到公式来计算堆栈溢出上两点之

我有两个数据帧,每个数据帧有三个变量:
location\u id
纬度
经度
。对于第一个数据帧中的每个
location\u id
,除了
location\u id
与每个df之间的距离外,我还必须在第二个数据帧中找到最近的
location\u id

我曾尝试使用
expand.grid
将两个数据帧的所有可能组合在一起(有效),但当我尝试将原始列表中的纬度和经度合并到超级列表中时,我的内存不足(第一个数据帧中有7000个位置ID,第二个数据帧中有5000个位置ID)

我能够得到公式来计算堆栈溢出上两点之间的距离:

earth.dist <- function (long1, lat1, long2, lat2)
{
rad <- pi/180
a1 <- lat1 * rad
a2 <- long1 * rad
b1 <- lat2 * rad
b2 <- long2 * rad
dlon <- b2 - a2
dlat <- b1 - a1
a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1 - a))
R <- 6378.145
d <- R * c
return(d)
}

这可能会对你有所帮助。这不是最优雅的答案,但对于适合你尺寸的data.frame来说,这应该可以做得相当好

require(geosphere)
require(dplyr)

DB1 <- data.frame(location_id=1:7000,LATITUDE=runif(7000,min = -90,max = 90),LONGITUDE=runif(7000,min = -180,max = 180))
DB2 <- data.frame(location_id=7001:12000,LATITUDE=runif(5000,min = -90,max = 90),LONGITUDE=runif(5000,min = -180,max = 180))

DistFun <- function(ID){
 TMP <- DB1[DB1$location_id==ID,]
 TMP1 <- distGeo(TMP[,3:2],DB2[,3:2])
 TMP2 <- data.frame(DB1ID=ID,DB2ID=DB2[which.min(TMP1),1],DistanceBetween=min(TMP1)      ) 
 print(ID)
 return(TMP2)
}

DistanceMatrix <- rbind_all(lapply(DB1$location_id, DistFun))



head(DistanceMatrix)

Source: local data frame [6 x 3]

  DB1ID DB2ID DistanceBetween
1     1  9386        24907.35
2     2 11823       264295.86
3     3  9118        12677.62
4     4 11212       237730.78
5     5 11203        26775.01
6     6  7607        83904.84
require(地球圈)
需要(dplyr)

DB1你能给出一个可重复的例子吗?我认为可能有一个基于
outer()
的解决方案,首先测量点对之间的横向距离和长距离,然后将它们组合起来(这当然适用于欧几里德距离--
sqrt(outer(x1,x2,“-”^2+outer(y1,y2,“-”^2)
但可能需要更多的工作才能使其在大圆周距离下工作)我猜有一种工具可以构建点集(如dfs)这可能是相关的:这太棒了!我还在胡闹,但看起来它在DB2中排除了一个位置id,因为它与DB1中的一个位置id配对。有没有一种方法允许这个匹配过程通过替换发生?不要认为它会发生。正如您所看到的,如果您这样做的话(sort(table(DistanceMatrix$DB2ID)))您可以从DB2获得对某个位置的多个观察
require(geosphere)
require(dplyr)

DB1 <- data.frame(location_id=1:7000,LATITUDE=runif(7000,min = -90,max = 90),LONGITUDE=runif(7000,min = -180,max = 180))
DB2 <- data.frame(location_id=7001:12000,LATITUDE=runif(5000,min = -90,max = 90),LONGITUDE=runif(5000,min = -180,max = 180))

DistFun <- function(ID){
 TMP <- DB1[DB1$location_id==ID,]
 TMP1 <- distGeo(TMP[,3:2],DB2[,3:2])
 TMP2 <- data.frame(DB1ID=ID,DB2ID=DB2[which.min(TMP1),1],DistanceBetween=min(TMP1)      ) 
 print(ID)
 return(TMP2)
}

DistanceMatrix <- rbind_all(lapply(DB1$location_id, DistFun))



head(DistanceMatrix)

Source: local data frame [6 x 3]

  DB1ID DB2ID DistanceBetween
1     1  9386        24907.35
2     2 11823       264295.86
3     3  9118        12677.62
4     4 11212       237730.78
5     5 11203        26775.01
6     6  7607        83904.84