OpenStreetMap

Конвертируем OSM в другие форматы

В JOSM появилась возможность экспортнуть осм в гео-джейсон и это прекрасно, но если вам нужно конвертировать большой набор данных (размером с Москву например) делать это через JOSM неудобно.

Выгрузки

Если вам нужна область среднебольших размеров, можно воспользоваться готовыми выгрузками гислаба, геофабрики.

Выгрузки - это отлично но, иногда вам нужен другой набор атрибутов или другой набор слоев данных. В общем что делать если возникло желание сделать выгрузку самому.

Можно сделать выгрузки самому, например используя postgis и какой либо способ импорта данных осм в postgis, благо их немало. Но нужно ставить postgis, что не всегда хочется делать, и писать конфиг для импортера.

Qgis

В кугис есть возможность импортировать данные osm но с некоторыми оговорками. Основная проблема - отсутсвие поддержки мультиполигонов. Можно конечно импортровать границы как линии и полигонизировать их. Но это муторно.

Gdal

Следующий в списке - gdal. Если у вас стоит Qgis скорее всего у вас установлен и gdal. Среди поддерживаемых этой прекрасной библиотекой форматов есть и osm. http://www.gdal.org/drv_osm.html

У меня не получилось конвертировать osm сразу же в набор shape файлов или geojson, возможно это мжно сделать если отредактировать файл с настройками импорта osm для gdal. Но можно сделать и по другому.

geopackage

На первом этапе конвертируем osm в geopackage:

bzcat osm.xml.bz2 | ogr2ogr -f GPKG osm.geopackage /vsistdin/

Затем открываем его как источник данных в qgis, кнопка называется “добавить векторный слой”. Там просто выбираем наш osm.geopackage остальное qgis сделает сам. В сгенерированном geopackage’е будет 5 или 6 слоев. С полигонами/мультиполигонами, веями, точками, веями собранными из отношений маршрутов, и слой с прочей геометрией из других отношений.

Фильтрация и экспорт

Теперь отфильтруем данные, например домики с адресами. В слое с мультиполигонами есть поле building но нет addr:housenumber. Открываем свойства слоя, в источнике данных добавляем фильтрацию “building” = yes. Вообще geopackage это определенным образом структурированный файл spatiallite (sqlite) то-есть, можно работать с ним как с базой данных.

Остальные теги так же записаны, но простым текстом, поэтому придется их разбирать. Формат записи: "key"=>"value", "key2"=>"value2" (Это постгрешный hstore)

Чтобы получить например подписи к зданиям, можно использовать выражение

regexp_substr(more_tags, '"addr:housenumber"=>"([\\d]+)"')

Так же его можно использовать в калькуляторе полей чтобы получить отдельную колонку, с разобранными данными.

Дальше полученный слой можно сохранить в любом понравившемся вам формате.

Итоги

Не сказать чтобы способ всем хорош, либо куча ручного труда, в прочем с постоянным визуальным контролем, либо надо писать конфиг для gdal либо скрипты. Это не так сложно но пока вы готовите данные придется постоянно перенарезать данные.

Тоесть постоянно запускать ogr2ogr ждать пока он перенарежет все слои, потом открыв это в qgis вы понимаете что что-то забыли и вам надо снова все повторять. Если импорт разовый и вы не планируете как-то это автоматизировать, то проще “нарезать” нужные слои с атрибутами в qgis.

Discussion

Comment from freeExec on 3 February 2017 at 09:48

Зачем регулярки когда это ищется проще

like('%"amenity"=>"police"%', other_tags)

У меня не получилось конвертировать osm сразу же в набор shape файлов

Тут предварительно надо нашинковывать osm на слои с одним типом геометрии, ну и за одно с одной группой тегов. Т.е. отфильтруем только линии с highway - получим шейп дорог.

Comment from d1g on 3 February 2017 at 12:15

Кому не шейпфайлы нужны, здесь другие форматы: http://wiki.openstreetmap.org/wiki/Converting_map_data_between_formats

Comment from dkiselev on 3 February 2017 at 13:42

@freeExec не, у тебя подзапрос для фильтрации, а у меня для значения тега.

Да можно нашинковать, это далеко не оптимальный способ в плане автоматизации. Просто часто хочется быстро посмотреть какой-то срез данных по дампу, без канители со скриптами и конфигами.

Comment from freeExec on 3 February 2017 at 13:49

Да, тут я проглядел суть. А поглядеть обычно беру и вырезанный кусок превращаю в osm и в josm.

Иногда просто хватает банального поиска по файлу, чтобы убедится что нужных данных не хватает.

Log in to leave a comment