【问题标题】:Postgresql postgis ST_DWithin always return truePostgresql postgis ST_DWithin 总是返回 true
【发布时间】:2017-06-09 07:12:42
【问题描述】:

我需要计算一个点与另一点的距离是否不超过给定半径。我使用了函数ST_DWithin,在谷歌地图中,​​我使用两点的“这里是什么”部分得到了 lanLot。第一个:(43.2137617, 76.8598076),第二个(43.220109 76.865100)。他们之间的距离是1.25公里。我的查询

SELECT ST_DWithin (
   ST_GeomFromText('POINT(76.8598076 43.2137617)',3857),
   ST_GeomFromText('POINT(76.865100 43.220109)',3857),
   100
);

而且它总是返回 true。我认为我将半径设置为 100 米并使用 SRID 3875 来使用米。怎么了?

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

    您使用的坐标不在 CRS 3857 中,而是在经纬度上未投影,即 CRS 4326,因此您正在寻找彼此相距 100 度以内的点。 您需要在 4326 中创建点,使用 ST_Transform 在 3857 中投影,然后以米为单位进行距离计算。

    SELECT ST_DWithin (
       ST_Transform(ST_GeomFromText('POINT(76.8598076 43.2137617)',4326),3857),
       ST_Transform(ST_GeomFromText('POINT(76.865100 43.220109)',4326),3857),
       100
    );
    

    CRS 3857 是一种投影,当您远离赤道时,它不会保留距离。您可能想改用ST_Distance_Sphere。比较这两种方法,第一种是1134m,第二种是825m……差别很大!

    SELECT ST_Distance_Sphere (
       ST_GeomFromText('POINT(76.8598076 43.2137617)',4326),
       ST_GeomFromText('POINT(76.865100 43.220109)',4326))
       <= 100;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-06
      • 2017-05-10
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多