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

Jak wysłać zapytanie do wszystkich wierszy w promieniu 5 mil od moich współrzędnych?

Chcesz „wszystkie wiersze w promieniu 5 mil od współrzędnej” , więc to nie dokładnie problem K-najbliższego sąsiada (KNN). Powiązane, ale twoja sprawa jest prostsza. „Znajdź 10 wierszy najbliżej moich współrzędnych” byłby problemem KNN.

Konwertuj swoje współrzędne na geography wartości:

ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography

Alternatywnie możesz użyć prostszej geometry rodzaj. Rozważ:
4.2.2. Kiedy używać typu danych Geografia zamiast typu danych Geometria

Następnie mamy tabelę typu:

CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);

Wszystko czego potrzebujesz to ST_DWithin() - oraz indeks przestrzenny żeby było szybko:

CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);

Zapytanie:

SELECT *, ST_Distance(c.x, geog) AS distance  -- distance is optional
FROM   tbl t, (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.63 42.06)')) AS c(x)
WHERE  ST_DWithin(c.x, geog, 8045)  -- distance in meter
ORDER  BY distance; -- order is optional, you did not ask for that

Lub możesz użyć swoich oryginalnych kolumn i utworzyć indeks funkcjonalny ... Te i inne szczegóły w tej ściśle powiązanej odpowiedzi na dba.SE:

  • Uporządkuj według odległości


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwania związane ze skalowaniem bazy danych Moodle PostgreSQL

  2. Narzędzie do tłumaczenia Oracle PL/SQL na Postgresql PL/pgSQL

  3. Powiadamianie o zmianach postgres w aplikacji java

  4. Wyszukiwanie pełnotekstowe od PostgreSQL 8.3

  5. heroku, postgreSQL, django, komentarze, deliciouspie:Żaden operator nie pasuje do podanej nazwy i typu argumentu. Może być konieczne dodanie wyraźnych rzutów typu