Итак, понадобилось получить координаты всех административных единиц Московской области. задача не новая, значит кто-нибудь да решал её и скорее всего поделился своими находками. Спрашиваем гугл, в результатах обнаруживаем уже все готовое: http://www.gadm.org/country - радостно скачиваю .kmz, открываю в Google Earth. Сразу видно минусы: нет разбивки по регионам, устаревшие данные, отсутствуют названия. М-да, перспектива редактировать границы, состоящих из множества точек, не радует.
Какие есть еще варианты?
Яндекс карты
Предоставляют данные только по границам регионов, данные берут из OSM
Wikimapia
Проект развивается энтузиастами, карту берут от Google и добавляют свой информацтонный слой. Реализован и придуман двумя разработчиками из России. Вся необходимая инфррмация на карте есть. Но как её получить? Дампов нет, но присутствует API, на число запросов к которому есть ограничение: не более 100 запрос в 5 минут. Тут достаточно подобрать категорию и через place.getbyarea
найти все административные единицы. Список категорий выложил в Gist, либо пользуйтесь category.getall
. Только вот нашел всего ничего объектов по категории 44639 (административная единица второго уровня). Чей глюк не знаю, на карте все правильно отображается. PS Если разберетесь - сообщите, спасибо.
OpenStreetMap
OpenStreetMap - карта, которая редактируется пользоватетями. У проекта есть свой формат XML, с подробной вики по полям. Есть хорошее описание структуры osm файлов на хабре. Последние обновления по России выкладываются на сайте http://gis-lab.info/projects/osm_dump/, есть общий файл по России, а также разбивки по регионам. Но лучше скачать общий файл, так как в разбивках могут отсутствовать некоторые сущности (way, node). Лучше взять пожатый вариант, ибо работать с ним проще и объем много меньше.
Для работы с дампами есть отличные утилиты:
- osmconvert - преобразует формат файла, позволяет оставить определенную географическую область
- osmfilter - удаляет все, что не подпадает под фильтр
Так как меня интересовало только Подмосковье, то задаем крайние точки прямоугольной области (долгота, широта), потом сохраняем ноды, который выходят за пределы выбранной области, потому что могут присутствовать в связах (relations) и немного чистим
osmconvert RU.osm.pbf -b=34.9704,54.2109,40.3537,57.0977 --drop-author --complete-ways --complex-ways --drop-version --out-o5m -o=RU_MO.o5m
Дальше выбираем только административные округа (admin_level=6
), остальное удаляем. Готово.
osmfilter RU_MO.o5m --keep="admin_level=6" -o=RU_MO_bound.osm
Работать с выходным xml-файлом хоть и можно (imposm), но накладно. Для таких случаев есть PostGIS, надстройка PostgreSQL. Позволяет запрашить и хранить географиеские объекты.
После установки и созданием базы, данные из xml требуется перенести в таблицы, это делается, помимо прочих, утилитой osm2pgsql
. Теги, которые следует перенести из файла, задаются в файле *.style
osm2pgsql RU_MO_bound.osm -d osm_db -U postgres -s -S ~/bound.style
Результат
Полезные ссылки
Задание на карте граничного прямоугольника (bbox) Справочник по функциям PostGIS 2.0