Postgisで近接検索を実行するにはどうすればよいですか?


9

Geonamesデータベース(cities1000)をダウンロードして、テーブルにインポートするための小さなRubyプログラムを作成しました(geo_cities)。次に、という地理列を追加しましたgeog

次に、緯度/経度のすべてをgeog列に変換しました。

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

物事はよく見えています。今、私がやりたいのは、プラハから100マイル以内にあるすべての都市を見つけます。

だから私はプラハを次のように得ることができます:

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

私はまだGISとPostgresを学んでいるので、誰かが簡単なクエリで私を助けてくれませんか?

回答:


13

まず、geography列にインデックスがあることを確認してください。空間検索を高速化します。

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

次に、自己結合クエリでST_DWithin(マイルからメートルへの変換を使用)を使用できます。

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

良い本を探しているなら、PostGIS in Actionをチェックしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.