Como faço uma pesquisa de proximidade com o Postgis?

9

Baixei o banco de dados Geonames (cities1000) e escrevi um pequeno programa Ruby para importá-los para minha tabela ( geo_cities). Adicionei a coluna de geografia chamada geog.

Em seguida, converti todos os números lat / lon na coluna geog usando:

update public.geo_cities set geog = st_GeogFromText('SRID=4326;POINT(' || longitude || ' ' || latitude || ')');

As coisas estão bem. Agora, o que eu quero fazer é encontrar todas as cidades a 160 quilômetros de Praga.

Para que eu possa ter Praga como:

select * from geo_cities where asciiname = 'Prague' and countrycode = 'CZ';

Ainda estou aprendendo GIS e Postgres, então alguém poderia me ajudar com a consulta simples?

cbmeeks
fonte

Respostas:

13

Primeiro, verifique se você tem um índice na sua coluna geográfica. Isso acelerará as pesquisas espaciais:

CREATE INDEX geo_cities_geog_idx ON geo_cities USING GIST geog;
VACUUM ANALYZE geo_cities(geog);

Em seguida, você pode usar ST_DWithin (com conversões de milhas para metros) em uma consulta de junção automática:

SELECT gc.*, ST_Distance(gc.geog, pt.geog)/1609.344 AS distance_miles
FROM geo_cities gc, geo_cities pt
WHERE pt.asciiname = 'Prague' and pt.countrycode = 'CZ'
  AND ST_DWithin(gc.geog, pt.geog, 160934.4)
ORDER BY ST_Distance(gc.geog, pt.geog);

Se você está no mercado para um bom livro, consulte o PostGIS in Action .

Mike T
fonte