Proč ukládáte x,y v oddělených sloupcích? Důrazně vám doporučuji uložit je jako geometry
nebo geography
abyste se vyhnuli zbytečné režii přetypování v době dotazu.
Jak již bylo řečeno, můžete vypočítat a zkontrolovat vzdálenosti v mílích pomocí ST_DWithin
nebo ST_Distance
:
(Testovací data)
CREATE TABLE building (name text, long numeric, lat numeric);
INSERT INTO building VALUES ('Kirk Michael',-4.5896,54.2835);
INSERT INTO building VALUES ('Baldrine',-4.4077,54.2011);
INSERT INTO building VALUES ('Isle of Man Airport',-4.6283,54.0804);
ST_DWithin
ST_DWithin
vrátí hodnotu true, pokud jsou dané geometrie v zadané vzdálenosti od jiné. Následující dotaz vyhledává geometrie v okruhu 5 mil od POINT(-4.6314 54.0887)
:
SELECT name,long,lat,
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 AS distance
FROM building
WHERE
ST_DWithin('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat),8046.72); -- 8046.72 metres = 5 miles;
name | long | lat | distance
---------------------+---------+---------+-------------------
Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
(1 row)
ST_Distance
Funkce ST_Distance
(s geography
parametry typu) vrátí vzdálenost v metrech . Pomocí této funkce vše, co musíte udělat, je nakonec převést metry na míle.
Pozor :Vzdálenosti v dotazech pomocí ST_Distance
se počítají v reálném čase, a proto nepoužívejte prostorový index . Proto se nedoporučuje používat tuto funkci v WHERE
doložka! Použijte jej spíše v SELECT
doložka. Nicméně níže uvedený příklad ukazuje, jak to lze provést:
SELECT name,long,lat,
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 AS distance
FROM building
WHERE
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 <= 5;
name | long | lat | distance
---------------------+---------+---------+-------------------
Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
(1 row)
- Dbejte na pořadí parametrů pomocí
ST_MakePoint
:Je to zeměpisná délka, šířka... ne naopak.
Demo:db<>fiddle
Ekvivalent Amazon Athena (vzdálenost ve stupních):
SELECT *, ST_DISTANCE(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
ST_POINT(long,lat)) AS distance
FROM building
WHERE
ST_Distance(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
ST_POINT(long,lat)) <= 5;