PostGIS
Opbevar ikke lat og long på sådan et bord. Brug i stedet en PostGIS-geometri eller geografitype .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Når du nu skal forespørge på det, kan du bruge KNN (<->
)
som faktisk vil gøre dette på et indeks.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
I din forespørgsel har du eksplicit HAVING distance < 5
. Du kan også gøre det på indekset.
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;
Dette sikrer, at intet returneres, hvis alle punkter ligger uden for distance_in_meters
.
Ydermere er x og y decimaltal ST_MakePoint(46.06, 14.505)