我需要计算一个点是否与另一个点的给定半径相距不远。我使用了函数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来使用米。有什么问题?
答案 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;