【问题标题】:Finding minimum distance between two sets of points in two sets of R在两组R中找到两组点之间的最小距离
【发布时间】:2015-07-31 08:41:17
【问题描述】:

我有两个数据框,每个数据框都有三个变量:location_idlatitudelongitude。对于第一个数据帧中的每个location_id,除了每个df 的location_id 之间的距离之外,我还必须在第二个数据帧中找到最接近的location_id

我尝试使用expand.grid 将两个数据框组合在一起(有效),但是当我尝试将原始列表中的纬度和经度合并到我的超级列表中时,我用完了内存(第一个数据帧有 7000 个 location_id,第二个数据帧有 5000 个location_ids)。

我能够得到公式来计算堆栈溢出时其他地方的两点之间的距离:

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)
}

但我很难在这个问题的上下文中应用它。任何帮助表示赞赏!

编辑:

数据集看起来完全像这样:

 location_id LATITUDE  LONGITUDE
211099    32.40913     -99.78064
333547    32.45192     -100.39325
369561    32.47458     -99.69176
123141    33.68169     -96.60887
386913    33.99921     -96.40743
123331    31.96173     -83.75830

【问题讨论】:

  • 你能给出一个可重现的例子吗?我认为可能有一个基于outer() 的解决方案来首先测量点对之间的纬度和长距离,然后将它们组合起来(这当然适用于欧几里得距离——sqrt(outer(x1,x2,"-")^2+outer(y1,y2,"-")^2) 但它可能需要更多的工作使其适用于大圆距离)
  • 我猜有一个工具可以将点集(如您的 dfs)构建到多边形中,然后获取多边形之间的距离。这可能是相关的:stackoverflow.com/q/8579913/1191259

标签: r geospatial latitude-longitude


【解决方案1】:

这可能会对您有所帮助。这不是最优雅的答案,但对于适合您大小的 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

【讨论】:

  • 这太棒了!我仍然在搞乱它,但看起来它在与 DB1 中的一个配对后从 DB2 中排除了 location_id。有没有办法让这个匹配过程在替换时发生?
  • 不要这么认为。如您所见,如果您执行 tail(sort(table(DistanceMatrix$DB2ID))),您会从 DB2 中获得不止一个 location_id 的观察结果
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 2013-02-07
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2020-11-17
相关资源
最近更新 更多