我有一个包含 100 个坐标的数据集(长/纬度格式),并且能够使用 ggmap 绘制它们;它们有不同的类别(例如杂货店与加油站)。
我现在需要计算每个类别的坐标之间的平均距离(以比较杂货店与加油站之间的空间分布);我怎样才能在 R 中做到这一点?
已经看到很多关于计算两个空间点之间的距离的答案,但正在寻找考虑到这些多个点的分布并对它们进行平均的方法。使用与 R 不同的语言来做这件事是否更有意义?
最简单的方法是自己计算距离并计算其平均值。使用
sf::st_distance()
您可以计算点之间的距离,例如:
(p是波兰Trzebnica商店的点坐标,取自OpenStreetMap)
bb <- osmdata::getbb("Trzebnica, dolnośląskie")
s <- osmdata::opq(bb, timeout = 25*60) |>
osmdata::add_osm_feature(key = "shop") |>
osmdata::osmdata_sf()
p <- s$osm_points |>
subset(!is.na(shop))
nrow(p)
#> [1] 36
sf::st_distance(p[1:3, ,], p[1:3, ,])
#> Units: [m]
#> [,1] [,2] [,3]
#> [1,] 0.0000 85.6592 219.1792
#> [2,] 85.6592 0.0000 134.9195
#> [3,] 219.1792 134.9195 0.0000
sf::st_distance()
计算所有/每个点之间的距离并创建对称矩阵。我们应该从中删除 0 来计算平均值:
m <- sf::st_distance(p, p)
m[m == units::as_units(0, "m")] <- NA
m[1:3, 1:3]
#> Units: [m]
#> [,1] [,2] [,3]
#> [1,] NA 85.6592 219.1792
#> [2,] 85.6592 NA 134.9195
#> [3,] 219.1792 134.9195 NA
m |>
mean(na.rm = TRUE)
#> 1018.374 [m]