PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

znajdź najbliższą lokalizację według szerokości i długości geograficznej w postgresql

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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usuń zduplikowaną kolumnę po zapytaniu SQL

  2. Hibernacja :Wyodrębnij kolumnę zawierającą dane binarne, które nie powinny być ładowane

  3. PostgreSQL — odwołania do kluczy obcych wzajemnie wykluczające się tabele

  4. Rails ActiveRecord:Jak używać zmiennych bind z podwójnymi cudzysłowami w jsonb?

  5. Agregat produktów w PostgreSQL