PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como faço para consultar todas as linhas dentro de um raio de 5 milhas das minhas coordenadas?


Você quer "todas as linhas em um raio de 5 milhas de uma coordenada" , então isso não exatamente um problema do vizinho mais próximo (KNN). Relacionado, mas seu caso é mais simples. "Encontre as 10 linhas mais próximas das minhas coordenadas" seria um problema KNN.

Converta suas coordenadas para geography valores:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography

Alternativamente, você pode usar a geometry mais simples tipo. Considere:
4.2.2. Quando usar o tipo de dados Geography sobre o tipo de dados Geometry

Então temos uma tabela como:
CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);

Tudo que você precisa é de ST_DWithin() - e um índice espacial para agilizar:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);

Inquerir:
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

Ou você pode usar suas colunas originais e criar um índice funcional ... Este e outros detalhes nesta resposta intimamente relacionada no dba.SE:
  • Ordenar por distância