sql >> Database >  >> RDS >> PostgreSQL

vind de dichtstbijzijnde locatie op lengte- en breedtegraad in postgresql

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)



  1. Een niet-gedefinieerde index krijgen tijdens het ophalen van de kolomwaarde van mysql

  2. Zoek uit of een object een tabelwaarde-functie is in SQL Server met OBJECTPROPERTY()

  3. Maak een trigger die waarden invoegt in een nieuwe tabel wanneer een kolom wordt bijgewerkt

  4. mySQL-tabellen met Wildcard laten vallen met alleen SQL-instructie?