Come eseguo una ricerca di prossimità con Postgis?


9

Ho scaricato il database Geonames (cities1000) e ho scritto un piccolo programma Ruby per importarli nella mia tabella ( geo_cities). Ho quindi aggiunto la colonna di geografia chiamata geog.

Quindi ho convertito tutti i numeri lat / lon nella colonna geog usando:

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

Le cose stanno andando bene. Ora quello che voglio fare è trovare tutte le città a meno di 100 miglia da Praga.

Quindi posso ottenere Praga come:

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

Sto ancora imparando GIS e Postgres, quindi qualcuno potrebbe aiutarmi con la semplice query?

Risposte:


13

Innanzitutto, assicurati di avere un indice nella colonna geografica. Accelererà le ricerche spaziali:

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

Quindi, puoi utilizzare ST_DWithin (con conversioni da miglia a metri) su una query auto-unita:

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 sei nel mercato per un buon libro, dai un'occhiata a PostGIS in azione .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.