PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Finden Sie den nächstgelegenen Standort nach Breiten- und Längengrad in postgresql

PostGIS

Bewahren Sie Lat und Long nicht auf einem solchen Tisch auf. Verwenden Sie stattdessen eine PostGIS-Geometrie oder einen Geografietyp .

CREATE EXTENSION postgis;

CREATE TABLE foo (
  geog geography;
);

CREATE INDEX ON foo USING gist(geog);

INSERT INTO foo (geog)
  VALUES (ST_MakePoint(x,y));

Wenn Sie es jetzt abfragen müssen, können Sie KNN (<-> ) was dies tatsächlich auf einem Index tun wird.

SELECT *
FROM foo
ORDER BY foo.geog <-> ST_MakePoint(x,y)::geography;

In Ihrer Abfrage haben Sie explizit HAVING distance < 5 . Sie können das auch auf dem Index machen.

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;

Dadurch wird sichergestellt, dass nichts zurückgegeben wird, wenn alle Punkte außerhalb von distance_in_meters liegen .

Außerdem sind x und y Dezimalzahlen ST_MakePoint(46.06, 14.505)