gpt4 book ai didi

Postgresql postgis ST_DWithin 总是返回 true

转载 作者:行者123 更新时间:2023-11-29 12:09:27 38 4
gpt4 key购买 nike

我需要计算一个点与另一点的距离是否不超过给定的半径。我使用了 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 来使用米。怎么了?

最佳答案

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

关于Postgresql postgis ST_DWithin 总是返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44451539/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com