从Lat&创建R中的距离矩阵。两个数据帧之间的长度

时间:2018-01-10 21:11:32

标签: r matrix gps distance latitude-longitude

我有两个数据帧,每个数据帧包含纬度,经度和相应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中各点之间的距离。我希望所有内容都包含相应列名的行和列名称的矩阵。

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

2 个答案:

答案 0 :(得分:0)

您可以使用distm包中的geosphere功能,该功能默认情况下会计算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

答案 1 :(得分:0)

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

enter image description here

抓住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)

enter image description here

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

相关问题