Однажды мне потребовалось получить из сырых ОСМ данных чистый сабсет города (потому что так удобно, компактно и просто красиво). К моему удивлению я не нашел готового рецепта, из-за чего для выполнения этой задачи потребовалось немного попотеть.
Ввиду вышеизложенного считаю своим долгом поделиться накопленным опытом.
![Кишинев OSM](https://habrastorage.org/r/w1560/getpro/habr/post_images/329/16f/9ad/32916f9ad1c1a1923908d10493be4135.png)
Допустим я хочу получить сабсет Кишинёва (почему? … там тепло, там мой дом, там моя мама)
Planet.osm нас, конечно, не интересует, зато есть geofabrik, но там планета нарезана на достаточно крупные шматки — http://download.geofabrik.de/europe/moldova.html
Значит, граница города есть в сырых данных.
Из отношения несложно получить полигон, делаем это либо руками, либо при помощи любой подходящей утилиты, например, этой.
Иии… теперь в игру вступает osmosis.
У нас есть осм всея Молдовы и ограничивающий полигон Кишинёва, этого вполне достаточно для получения сабсета города из сырого XML (OSM) файла:
Аналогично можно выковырять данные из PBF (Protocolbuffer Binary Format) файла:
Немногим больше про osmosis можно почитать здесь.
Ну а готовый сабсет нужно срочно открывать в JOSM или импортировать в личный проект!
![Кишинев JOSM](https://habrastorage.org/r/w1560/getpro/habr/post_images/e77/e2e/fab/e77e2efabbbb0c11ecc62c1747dd852e.png)
Как заметил zverik, всё вышеперечисленное будет гораздо проще сделать при помощи *osmium-tool* (оф доки)
1. Скачать датасет страны
2. Извлечь из него границу города
3. Извлечь город из датасета
Обратите внимание на флак -s simple
Это стратегия извлечения, и всего их три:
1. -s simple — обрезать дороги по границе
2. -s complete_ways — не обрезать пограничные дороги (по умолчанию)
3. -s smart — извлекать зависимости пограничных дорог
Формат выходного файла определяется его расширением в команде.
OSMIUM — крайне мощный, удобный и полезный инструмент, которым приятно пользоваться.
Ввиду вышеизложенного считаю своим долгом поделиться накопленным опытом.
![Кишинев OSM](https://habrastorage.org/getpro/habr/post_images/329/16f/9ad/32916f9ad1c1a1923908d10493be4135.png)
Допустим я хочу получить сабсет Кишинёва (почему? … там тепло, там мой дом, там моя мама)
Planet.osm нас, конечно, не интересует, зато есть geofabrik, но там планета нарезана на достаточно крупные шматки — http://download.geofabrik.de/europe/moldova.html
Значит, граница города есть в сырых данных.
Из отношения несложно получить полигон, делаем это либо руками, либо при помощи любой подходящей утилиты, например, этой.
Иии… теперь в игру вступает osmosis.
У нас есть осм всея Молдовы и ограничивающий полигон Кишинёва, этого вполне достаточно для получения сабсета города из сырого XML (OSM) файла:
osmosis --read-xml file="moldova.osm" --bounding-polygon file="kishinev.poly" --write-xml file="kishinev.osm"
Аналогично можно выковырять данные из PBF (Protocolbuffer Binary Format) файла:
osmosis --read-pbf file="moldova.osm.pbf" --bounding-polygon file="kishinev.poly" --write-xml file="kishinev.osm"
Немногим больше про osmosis можно почитать здесь.
Ну а готовый сабсет нужно срочно открывать в JOSM или импортировать в личный проект!
![Кишинев JOSM](https://habrastorage.org/getpro/habr/post_images/e77/e2e/fab/e77e2efabbbb0c11ecc62c1747dd852e.png)
UPD:
Как заметил zverik, всё вышеперечисленное будет гораздо проще сделать при помощи *osmium-tool* (оф доки)
1. Скачать датасет страны
2. Извлечь из него границу города
osmium getid -r -t moldova-latest.osm.pbf r1691801 -o kishinev-boundary.osm
3. Извлечь город из датасета
osmium extract -p kishinev-boundary-with-tags.osm moldova-latest.osm.pbf -s simple -o kishinev.osm
Обратите внимание на флак -s simple
Это стратегия извлечения, и всего их три:
1. -s simple — обрезать дороги по границе
2. -s complete_ways — не обрезать пограничные дороги (по умолчанию)
3. -s smart — извлекать зависимости пограничных дорог
Формат выходного файла определяется его расширением в команде.
OSMIUM — крайне мощный, удобный и полезный инструмент, которым приятно пользоваться.