【问题标题】:Creating matrix of distances in R from lat & long between two dataframes在 R 中创建两个数据帧之间从 lat 和 long 的距离矩阵
【发布时间】:2018-06-20 03:18:57
【问题描述】:

我有两个数据框,每个数据框都由纬度、经度和相应的 ID 组合而成。

我基本上是在尝试做:

 for each_ID in df1:
     for each_ID in df2: 
          calculate distance in miles
 result_df = df1 x df2

     df=data.frame(id  = c('row1','row2','row3'), lat = c(47,57,67), long = c(-80,-80,-80))
     df2 = data.frame(id  = c('col1','col2','col3'), lat = c(47,57,67), long = c(-83,-84,-85))

我想计算 df1 和 df2 之间每个点的距离。我不需要计算 df1 中点之间的距离。我想要矩阵中的所有内容,其中包含相应列名的行名和列名。

我环顾四周,并没有看到一个简单的方法来做到这一点。有人提供一些帮助吗?

【问题讨论】:

标签: r matrix gps distance latitude-longitude


【解决方案1】:

您可以使用geosphere 包中的distm 函数,该函数默认计算Haversine 距离,但您也可以根据需要精确计算其他距离函数。默认情况下,距离以米为单位,但您可以通过乘以转换常数将其转换为英里。

library(geosphere)
res = distm(df1[c("long","lat")],df2[c("long","lat")])*0.0006213712
rownames(res) = df1$id
colnames(res) = df2$id
         col1     col2      col3
row1  141.5143 712.0616 1395.1172
row2  703.2304 150.6708  709.9512
row3 1387.6401 703.4400  135.0994

【讨论】:

    【解决方案2】:
    library(generator)
    
    df1 <- data.frame(id=seq(1:10), lat=r_latitudes(10), lon=r_longitudes(10))
    df2 <- data.frame(id=seq(1:10), lat=r_latitudes(10), lon=r_longitudes(10))
    

    获取function 用于计算经纬度之间的距离:

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

    计算数据框之间的所有距离,并设置为新的数据框:

    distances = NULL
    for(i in 1:nrow(df1)) {
        labels = paste('DF1_long=', df1[i,3], 'DF1_lat=', df1[i,2], 'DF2_long=', df2[i,3], 'DF1_lat=', df2[i,2])
        distances[i] <- lat_lon_dist(df1[i,3], df1[i,2], df2[i,3], df2[i,2])
        }
    
    data.frame(labels, distances)
    

    可能有更准确的距离计算,例如 geosphere 包中提供的那些。不确定您是否希望在最终帧中使用这些标签,但根据需要进行更改。此外,如果这是您想要的最终结果,您可以将此帧转换为矩阵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2014-04-04
      • 2022-11-21
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      相关资源
      最近更新 更多