Используя параметры типа geography
, вы получите возвращенное расстояние в метрах, поэтому вам нужно преобразовать его в мили, если вы предпочитаете работать с этой единицей измерения. Если вы можете справиться с градусами, просто придерживайтесь geometry
.
WITH locations (geolocation) AS (
VALUES ('POINT (52.6323202 1.2947649)'),
('POINT (52.6294342 1.2936336)'),
('POINT (52.6277909 1.2909079)'),
('POINT (52.6260535 1.2952051)')
)
SELECT *
FROM locations
WHERE ST_DWithin(
geoLocation::geography,
'POINT(52.6219322 1.2630061)'::geography, 1609*2.2) ;
geolocation
------------------------------
POINT (52.6294342 1.2936336)
POINT (52.6277909 1.2909079)
(2 Zeilen)
EDIT : @JGH указал, что ST_Distance
не использует пространственный индекс, и моим предыдущим предложением было использовать его вместо ST_DWithin
. Это означает, что я ошибся в своем предпочтении ST_Distance
:) В любом случае, вот как можно добиться аналогичных результатов с ST_Distance
для тех, кто все еще хочет его использовать:
WITH locations (geolocation) AS (
VALUES ('POINT (52.6323202 1.2947649)'),
('POINT (52.6294342 1.2936336)'),
('POINT (52.6277909 1.2909079)'),
('POINT (52.6260535 1.2952051)')
)
SELECT *
FROM locations
WHERE ST_Distance(
geoLocation::geography,
'POINT(52.6219322 1.2630061)'::geography) * 0.000621371 > 2.2 ;
geolocation
------------------------------
POINT (52.6323202 1.2947649)
POINT (52.6260535 1.2952051)
(2 Zeilen)
Дальнейшее чтение: Getting all Buildings in range of 5 miles from specified coordinates