PostGIS
Bewaar lat en lang niet op zo'n tafel. Gebruik in plaats daarvan een PostGIS-geometrie of geografietype .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Als u het nu moet opvragen, kunt u KNN (<->
)
die dit daadwerkelijk op een index zal doen.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
In uw zoekopdracht heeft u expliciet HAVING distance < 5
. U kunt dat ook op de index doen.
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;
Dit zorgt ervoor dat er niets wordt geretourneerd als alle punten buiten distance_in_meters
liggen .
Verder zijn x en y decimale getallen ST_MakePoint(46.06, 14.505)