【问题标题】:How to compute distances in miles using ST_Distance and ST_Transform如何使用 ST_Distance 和 ST_Transform 以英里为单位计算距离
【发布时间】:2019-01-20 11:33:45
【问题描述】:

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

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

【问题讨论】:

    标签: geospatial postgis


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 你能举个xxxx的例子吗?
    • @pyramation 你可以得到 epsg 代码here,例如 26901
    【解决方案2】:

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

    首先,使用 st_as_sf() 将您的 lat-lon 数据框转换为简单的要素数据框。

    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
    

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      相关资源
      最近更新 更多