Jak przeprowadzić wyszukiwanie zbliżeniowe za pomocą Postgis?

9

Pobrałem bazę danych Geonames (cities1000) i napisałem mały program Ruby, aby zaimportować je do mojej tabeli ( geo_cities). Następnie dodałem kolumnę geograficzną o nazwie geog.

Następnie przekonwertowałem wszystkie liczby lat / lon na kolumnę geog, używając:

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

Sprawy wyglądają dobrze. Teraz chcę znaleźć wszystkie miasta w promieniu 100 mil od Pragi.

Mogę zdobyć Pragę w następujący sposób:

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

Wciąż uczę się GIS i Postgres, więc czy ktoś mógłby mi pomóc z prostym zapytaniem?

cbmeeks
źródło

Odpowiedzi:

13

Najpierw upewnij się, że masz indeks w kolumnie geograficznej. Przyspieszy wyszukiwanie przestrzenne:

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

Następnie możesz użyć ST_DWithin (z konwersjami z mil na metry) w samozłączonym zapytaniu:

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

Jeśli szukasz dobrej książki, sprawdź PostGIS w akcji .

Mike T.
źródło