PostGIS
Nie przechowuj lat i długich na takim stole. Zamiast tego użyj geometrii PostGIS lub typu geograficznego .
CREATE EXTENSION postgis;
CREATE TABLE foo (
geog geography;
);
CREATE INDEX ON foo USING gist(geog);
INSERT INTO foo (geog)
VALUES (ST_MakePoint(x,y));
Teraz, gdy chcesz o nie zapytać, możesz użyć KNN (<->
)
który faktycznie zrobi to na indeksie.
SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;
W zapytaniu masz wyraźnie HAVING distance < 5
. Możesz to zrobić również w indeksie.
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;
Zapewnia to, że nic nie zostanie zwrócone, jeśli wszystkie punkty leżą poza distance_in_meters
.
Ponadto x i y są liczbami dziesiętnymi ST_MakePoint(46.06, 14.505)