如何使用 ST_Distance 和 ST_Transform 计算以英里为单位的距离

How to compute distances in miles using ST_Distance and ST_Transform

我的 table 中有 lat/long 个点,我想计算它们之间的距离(以英里为单位)。

显然只是调用 ST_Distance (point1, point2) returns 我不想要的东西(同样 point1 和 point2 在经纬度上)。我被建议使用 ST_Transform ,它允许我进行坐标参考系统转换。但我对这个领域太陌生了,我迷路了。请赐教(希望有一些例子)

一种方法是 select 适合您感兴趣区域的坐标系。其中一些以英尺为单位,另一些以米为单位。在这两种情况下,您都需要将找到的距离转换为英里。

示例,其中 xxxx 是使用米的坐标系,例如 UTM:

select 
  st_distance(
     st_transform(point1.geom, 4326, xxxx),
     st_transform(point2.geom, 4326, xxxx)
  ) *  0.000621371192  as dist_miles;

既然您提到您是新手,select建立正确的坐标系可能有些困难。然后更容易恢复使用 geography 数据类型计算距离,即测量圆形地球上的距离,而不是在它的平面表示上。结果也是以米为单位,需要换算成英里

select 
  st_distance(
     point1.geom::geography,
     point2.geom::geography
  ) *  0.000621371192  as dist_miles;

如果您想使用 library(sf) 走简单的功能路线,这是一种方法。

首先,使用 st_as_sf().

将您的经纬度数据框转换为简单的要素数据框
library(sf)

my_data <- data.frame(
    lat = c(87.5, 88.5),
    lon = c(35, 26),
    name = c("A", "B")
)

my_sf <- st_as_sf(my_data,
         coords = c("lon", "lat"), # x, y (order matters)
         crs = 4326)

然后你可以调用st_distance()并返回一个成对的距离矩阵。

st_distance(my_sf)
Units: m
         [,1]     [,2]
[1,]      0.0 116733.7
[2,] 116733.7      0.0

它以默认单位(米)返回,因为我们在 st_as_sf() 中设置了 crs 参数。

如果您想将单位转换为英里,可以使用 units::set_units()

st_distance(my_sf) %>%
    units::set_units(mi)

Units: mi
         [,1]     [,2]
[1,]  0.00000 72.53493
[2,] 72.53493  0.00000