Geosphere/dplyr:创建坐标之间的距离矩阵

Jos*_*cha 5 r geospatial latitude-longitude dplyr geosphere

我想创建多个坐标之间距离的“矩阵”。最好使用 dplyr/geosphere。我已经看到 geosphere 包提供了这个。我设法创建了两个向量之间的距离,但我很难创建完整的矩阵。

这是具有多个坐标的示例表。

df <- data.frame(latitude = c(49.48609,-8.14671,11.28625),
                 longitude = c(8.463678,143.05793,-11.18285))

  latitude  longitude
1 49.48609   8.463678
2 -8.14671 143.057930
3 11.28625 -11.182850
Run Code Online (Sandbox Code Playgroud)

这是我正在寻找的输出:

  latitude    longitude    distance-latlon1    distance-latlon2   distance-latlon3                 
1 49.48609     8.463678    NA                  *latlon2><latlon1  *latlon3><latlon1
2 -8.14671   143.057930    *latlon1><latlon2   NA                 *latlon3><latlon2
3 11.28625   -11.182850    *latlon1><latlon3   *latlon2><latlon3  NA
Run Code Online (Sandbox Code Playgroud)

我尝试使用 geosphere,但我只找到了一种计算两列之间距离的方法(在此代码段中结果为 0)。

library(geosphere) 
df$distance <- distVincentyEllipsoid(df[,c('longitude','latitude')],
                                     df[,c('longitude','latitude')])
Run Code Online (Sandbox Code Playgroud)

Jaa*_*aap 4

您需要-packagedistm的功能geosphere。和:

# create a distance matrix
m <- distm(df[2:1], df[2:1], fun = distVincentyEllipsoid)

# replace the diagonal with NA
diag(m) <- NA

# make column names for the distance matrix
colnames(m) <- paste0('r',1:nrow(df))

# bind the distance matrix to the dataframe
cbind.data.frame(df, m)
Run Code Online (Sandbox Code Playgroud)

你得到:

  latitude  longitude       r1       r2       r3
1 49.48609   8.463678       NA 13792423  4606658
2 -8.14671 143.057930 13792423       NA 17189185
3 11.28625 -11.182850  4606658 17189185       NA
Run Code Online (Sandbox Code Playgroud)