PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

trova la posizione più vicina per latitudine e longitudine in postgresql

PostGIS

Non conservare lat e long su un tavolo come quello. Utilizzare invece una geometria PostGIS o un tipo geografico .

CREATE EXTENSION postgis;

CREATE TABLE foo (
  geog geography;
);

CREATE INDEX ON foo USING gist(geog);

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

Ora, quando devi interrogarlo, puoi utilizzare KNN (<-> ) che lo farà effettivamente su un indice.

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

Nella tua richiesta, hai esplicitamente HAVING distance < 5 . Puoi farlo anche sull'indice.

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;

Ciò garantisce che non venga restituito nulla se tutti i punti si trovano al di fuori di distance_in_meters .

Inoltre xey sono numeri decimali ST_MakePoint(46.06, 14.505)