Postgis ile nasıl yakınlık araması yapabilirim?


9

Geonames veritabanını (Cities1000) indirdim ve bunları tabloma aktarmak için küçük bir Ruby programı yazdım ( geo_cities). Sonra adlı coğrafya sütununu ekledim geog.

Sonra tüm lat / lon sayılarını kullanarak geog sütununa dönüştürdüm:

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

İşler iyi görünüyor. Şimdi yapmak istediğim, Prag'a 100 mil mesafedeki tüm şehirleri bulmak.

Prag'ı şöyle elde edebilirim:

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

Hâlâ CBS ve Postgres öğreniyorum, bu yüzden birisi basit sorguyla bana yardımcı olabilir mi?

Yanıtlar:


13

İlk olarak, coğrafya sütununuzda bir dizin bulunduğundan emin olun. Mekansal aramaları hızlandıracak:

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

Ardından, kendinden birleştirilmiş bir sorguda ST_DWithin'i ( milden metreye kadar dönüşümlerle) kullanabilirsiniz :

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

İyi bir kitap almak için pazardaysanız PostGIS in Action'a göz atın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.