Bagaimana cara melakukan pencarian kedekatan dengan Postgis?

9

Saya mengunduh basis data Geonames (cities1000) dan menulis program Ruby kecil untuk mengimpornya ke tabel saya ( geo_cities). Saya kemudian menambahkan kolom geografi yang disebut geog.

Lalu saya mengubah semua nomor lat / lon ke dalam kolom geog menggunakan:

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

Semuanya terlihat bagus. Sekarang yang ingin saya lakukan adalah menemukan semua kota dalam jarak 100 mil dari Praha.

Jadi saya bisa mendapatkan Praha seperti:

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

Saya masih belajar GIS dan Postgres, jadi bisakah seseorang membantu saya dengan pertanyaan sederhana?

cbmeeks
sumber

Jawaban:

13

Pertama, pastikan Anda memiliki indeks pada kolom geografi Anda. Ini akan mempercepat pencarian spasial:

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

Kemudian, Anda dapat menggunakan ST_DWithin (dengan konversi dari mil ke meter) pada kueri yang bergabung sendiri:

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

Jika Anda berada di pasar untuk mendapatkan buku yang bagus, lihat PostGIS dalam Tindakan .

Mike T
sumber