sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo consulto todas las filas dentro de un radio de 5 millas de mis coordenadas?

Quiere "todas las filas dentro de un radio de 5 millas de una coordenada" , entonces esto no exactamente un problema K-vecino más cercano (KNN). Relacionado, pero tu caso es más sencillo. "Encuentra las 10 filas más cercanas a mis coordenadas" sería un problema de KNN.

Convierte tus coordenadas a geography valores:

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

Alternativamente, podría usar la geometry más simple tipo. Considere:
4.2.2. Cuándo usar el tipo de datos geográficos sobre el tipo de datos geométricos

Entonces tenemos una tabla como:

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

Todo lo que necesitas es ST_DWithin() - y un índice espacial para hacerlo rápido:

CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);

Consulta:

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

O puede usar sus columnas originales y crear un índice funcional... Este y otros detalles en esta respuesta estrechamente relacionada en dba.SE:

  • Ordenar por distancia