¿Cómo realizo una búsqueda de proximidad con Postgis?

9

Descargué la base de datos Geonames (cities1000) y escribí un pequeño programa Ruby para importarlos a mi tabla ( geo_cities). Luego agregué la columna de geografía llamada geog.

Luego convertí todos los números lat / lon en la columna geog usando:

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

Las cosas se ven bien. Ahora lo que quiero hacer es encontrar todas las ciudades dentro de las 100 millas de Praga.

Entonces puedo obtener Praga como:

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

Todavía estoy aprendiendo SIG y Postgres, ¿alguien podría ayudarme con la consulta simple?

cbmeeks
fuente

Respuestas:

13

Primero, asegúrese de tener un índice en su columna de geografía. Acelerará las búsquedas espaciales:

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

Luego, puede usar ST_DWithin (con conversiones de millas a metros) en una consulta unida:

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);

Si está buscando un buen libro, consulte PostGIS en acción .

Mike T
fuente