Wie führe ich mit Postgis eine Proximity-Suche durch?

9

Ich habe die Geonames-Datenbank (Towns1000) heruntergeladen und ein kleines Ruby-Programm geschrieben, um sie in meine Tabelle ( geo_cities) zu importieren . Ich habe dann eine geografische Spalte namens hinzugefügt geog.

Dann habe ich alle Lat / Lon-Zahlen in die Geog-Spalte konvertiert, indem ich:

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

Die Dinge sehen gut aus. Jetzt möchte ich alle Städte innerhalb von 100 Meilen von Prag finden.

So kann ich Prag bekommen wie:

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

Ich lerne immer noch GIS und Postgres. Könnte mir jemand bei der einfachen Abfrage helfen?

cbmeeks
quelle

Antworten:

13

Stellen Sie zunächst sicher, dass Sie einen Index für Ihre Geografiespalte haben. Dies beschleunigt die räumliche Suche:

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

Anschließend können Sie ST_DWithin (mit Umrechnungen von Meilen in Meter) für eine selbst verknüpfte Abfrage verwenden:

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

Wenn Sie auf dem Markt nach einem guten Buch suchen, schauen Sie sich PostGIS in Aktion an .

Mike T.
quelle