Как мне выполнить поиск близости с Postgis?

9

Я скачал базу данных Geonames (towns1000) и написал небольшую программу на 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';

Я все еще изучаю ГИС и Postgres, поэтому кто-нибудь может мне помочь с простым запросом?

cbmeeks
источник

Ответы:

13

Во-первых, убедитесь, что у вас есть индекс в вашей колонке географии. Это ускорит пространственные поиски:

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 .

Майк Т
источник