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



我的表中有经纬度/经度点,我想以英里为单位计算它们之间的距离。

显然,只是调用ST_Distance(point1,point2(返回我不想要的东西(再次点1和点2在纬度和经度中(。建议我使用ST_Transform它允许我进行坐标参考系统转换。但我对这个领域太陌生了,我迷路了。请启发我(希望有一些例子(

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

例如,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;

如果你想走简单的特征路线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

最新更新