Postgresql postgis ST_DWithin总是返回true

时间:2017-06-09 07:12:42

标签: postgresql postgis

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

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

它总是返回true。我认为我把半径100米并使用SRID 3875来使用米。有什么问题?

1 个答案:

答案 0 :(得分:2)

您使用的坐标不在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;