Як здійснити пошук близькості за допомогою Postgis?


9

Я завантажив базу даних Geonames (Cities1000) і написав невелику програму Ruby, щоб імпортувати їх у свою таблицю ( geo_cities). Потім я додав стовпчик географії під назвою geog.

Потім я перетворив усі номери lat / lon у стовпчик 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, щоб хтось міг мені допомогти з простим запитом?

Відповіді:


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 в дії .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.