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

时间:2018-08-13 17:08:25

标签: geospatial postgis

我的桌子上有纬度/经度,我想计算它们之间的距离(以英里为单位)。

显然,仅调用ST_Distance(point1,point2)会返回我不想要的内容(再次,point1和point2在经纬度内)。建议我使用ST_Transform,它允许我进行坐标参考系统转换。但是我对这个领域太陌生了,我迷路了。请开导我(希望有一些例子)

2 个答案:

答案 0 :(得分:4)

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

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

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

由于您提到您是新手,因此选择适当的坐标系可能会有些困难。然后,更容易恢复为使用geography数据类型来计算距离,即在圆形地球上而不是在其平面表示上测量距离。结果也以米为单位,需要转换为英里。

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

答案 1 :(得分:0)

如果要使用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

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

如果要将单位转换为英里,可以使用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