PostGIS
Neskladujte lat a long na takovém stole. Místo toho použijte geometrii PostGIS nebo typ geografie .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Nyní, když se potřebujete dotazovat, můžete použít KNN (<->
)
který to ve skutečnosti provede na indexu.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
V dotazu máte explicitně HAVING distance < 5
. Můžete to udělat i na indexu.
SELECT *
FROM foo
WHERE ST_DWithin(foo.geog, ST_MakePoint(x,y)::geography, distance_in_meters)
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
To zajistí, že se nic nevrátí, pokud všechny body leží mimo distance_in_meters
.
Navíc x a y jsou desetinná čísla ST_MakePoint(46.06, 14.505)