Мапинг по квадратам

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

1. В качетсве предисловия

До этого обычным делом была такая ситуация:

Очевидно, что у данной хаотичной отрисовки есть ряд недостатков:

  • Не знаешь точно, насколько детально ты проработал местность. Между такими “скачками” можно запросто пропустить много объектов, иначе нужно возвращаться и все это пересматривать.

  • Хаотичная отрисовка создает видимость, что эта территория уже отрисована другим маппером и поэтому может не привлечь внимания другого энтузиаста.

  • Результирующий changeset “размазан” по большой территории (его bounding-box слабо локализован).

В решении указанных выше проблем (на мой взгляд) лучшим подходом является применение принципа “разделяй и влавствуй” (в реалиях OSM перефразирую на “разделяй и мапь”).

Разделять будем на квадраты.

Для этого понадобится совсем немного:

  1. Полигон интересующей территории в векторном формате.

  2. QGIS

  3. ogr2osm + Git + Python

  4. JOSM

  5. немного времени

Далее детально опишу, как создать сетку квадратов для дальнейшей отрисовки по ним.

2. Область отрисовки

В зону моих интересов входит Тункинский национальный парк. Поэтому я скачиваю архив с полигонами ООПТ (особо охраняемых природных территорий) из темы Открытые данные по границам ООПТ федерального подчинения РФ.


mkdir oopt
cd oopt
wget http://gis-lab.info/data/oopt/pa_russia_utf8.7z
7z x pa_russia_utf8.7z

Примечание: команды выше приведены для пользователей linux, в том числе для себя самого. В Windows все это выполняется в пару действий “скачать” + “извлечь архив”.

В данном архиве полигоны находятся в следующих файлах:

  • np-bcc.shp - национальные парки

  • zp-bcc.shp - заповедники

  • fz-bcc.shp - заказники

Далее открываем QGIS и добавляем в проект слой с нужным файлом (в моем случае np-bcc.shp) выбрав меню:

Слой → Добавить слой → Добавить векторный слой

В появившемся окне нужно выбрать файл с полигонами границ:

Для наглядности, сверки границ и оценки размера квадратов также добавил слой OSM:

Интернет → OpenLayers plugin → OpenStreetMap → OpenStreetMap

Примечание: если у Вас нет этого плагина в меню, его нужно установить.

После данных действий область отображения примет вид:

Будем работать только с одним полигоном Тункинского парка, поэтому его нужно изолировать на отдельном слое.

Для этого на панели инструментов нажимаем кнопку “Выбрать объекты по площади или щелчком мыши” и щелкаем по полигону. Далее в меню выбираем:

Правка → Копировать объекты

и сразу же

Правка → Вставить объекты как → Новый виртуальный слой

После этих действий нужно ввести имя нового слоя. Пусть он будет назваться “Контур”.

3. Создание сетки

Для создания сетки в меню выбираем:

Вектор → Выборка → Регулярная сетка

В появившемся окне нужно выбрать созданный слой (“Контур”) и нажать “Получить из слоя” для загрузки координат границы интересующей области.

Параметры X, Y определяют шаг формируемой сетки. Значение 1 соответствует одному градусу. 1/60 = 1 минута.
Тут каждый может подобрать удобный для себя размер квадрата. Я подбирал таким образом, чтобы область была более-менее обширная и в то же время ее можно замапить в один присест. Также стоит учитывать, что в проекции 1 градус широты по расстоянию в моем случае не соответствует 1 градусу долготы. Поэтому я убрал галку “Зафиксировать соотношение сторон 1:1” и выставил подобрал значение, чтобы у меня получились “квадраты” вместо прямоугольников:
X: 0,0050000000
Y: 0,0033333333

Также нужно выбрать опцию “Создать сетку как полигоны”.

Итоговое окно настроек:

После создания сетки появится новый слой:

Далее в меню выбираем:

Вектор → Пространственный запрос → Пространственный запрос

Примечание: возможно понадобится установить соответствующий плагин.

В появившемся окне указываем, что из слоя созданной сетки “border” нужно выбрать все полигоны (квадраты), которые пересекаются с границей интересующей области (полигон в слое “Контур” - границы Тункинского национального парка).

После того, как нажмем кнопку “Применить” появится новое окно, в котором нужно нажать кнопку “Создать слой из перечисленных объектов” (в правом нижнем углу над кнопкой “Закрыть”) и затем кнопку “Закрыть”.

Появился новый слой, в котором содержатся только квадраты в интересующей области:

Экспортируем данный слой в shapefile. Выбираем слой и в меню:

Слой → Сохранить как

В появившемся окне нужно выбрать имя файла для экспорта и систему координат. По части системы координат - важный момент. Нужно выбрать WGS 84, чтобы последующему софту не пришлось самостоятельно пересчитывать.

Итак, shapefile готов. Далее будем его экспортировать в “родной” osm. Конечно можно открыть shapefile с помощью плагинов, но я столкнулся с ощутимым замедлением быстродействия при их включении. А osm файлы JOSM обрабатывает “на ура”.

Для этого воспользуемся утилитой ogr2osm:

Скачиваем ее с репозитория:


  git clone git://github.com/pnorman/ogr2osm.git
  cd ogr2osm
  git submodule update --init

И для удобства делаем ссылку в директории bin:


sudo ln -s /home/developer/oopt/ogr2osm/ogr2osm.py /usr/local/bin

Теперь конвертация в формат osm выполняется простой командой:


ogr2osm.py map_polygons.shp

Примечание: указанные команды специфичны для linux систем, однако сама программа ogr2osm представляет собой обычный скрипт, написанный на языке Python, интерпретатор которого без проблем устанавливается на Windows системах. Если данный этап вызывает проблемы, то я его дополню инструкциями для Windows-пользователей (напишите в комментарии).*

4. Мапинг по квадратам в JOSM

Теперь открываем получившийся файл в JOSM и видим такую картину:

Весь участок территории, который мы мапим, разбит на квадраты. На большем увеличении при активном слое данных линии квадратов еле заметны, но в то же время дают знать, когда мы “зашли слишком далеко”.

Данный слой никогда не попадет в базу данных OSM (только если по ошибке вы не решите загрузить его и при этом проигнорируете предупреждение).

Поэтому можно использовать его в своих интересах и ставить любые теги. Например я помечаю тегом building:yes квадраты, в которых велась (или ведется) какая-либо работа по отрисовке. Тегом name можно прописывать краткие комментарии. А тегом natural:wood отмечаю квадраты, работа по которым полностью завершена.


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

5. В качестве послесловия

Описываемый подход не претендует на статус единственно верного. Это просто лайфхак осмера, которым решил поделиться с сообществом. Хотелось бы услышать возможные недостатки данного подхода или альтернативные (возможно более легкие) способы разбивки области на квадраты.

Данную тему постарался описать наиболее подробно и пошагово, так как не найдя подобной пришлось изобретать (возможно велосипед). Но отдача от этого подхода явно есть: теряются сомнения в том, что что-то пропустил на квадрате, так как перед тем, как пометить его “зеленым”, еще раз просматриваешь его. По моим квадратам я работаю “в одиночку” и стараюсь выбирать такие, где только мимо проходила мышка осмера. Но данный подход можно развить до коллективной работы: добавить его под контроль версий и тем самым синхронизировать статус работы над квадратами.

Ссылки по теме:

Создание регулярных сеток в QGIS, gis-lab.info
Создание и оформление градусной сетки с минутным и секундным шагами в QGIS, gis-lab.info
ogr2osm, openstreetmap.org

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

Вот только потом с этим лесом-по-квадратам невозможно работать. Хочешь поправить, потом смотришь на это … и думаешь, а ну его нафиг.

Наверно стоит квадраты побольше брать. Конкретно в этом районе кусок леса я монолитно нарисовал, не уверен правильно ли тогда поступил.

Конечно есть! Идея уже реализована: есть проект OSM Tasking Manager где используется подобный подход (скорее в топике подобное описывается). Но это способ коллективной организации. То, что предлагаю я - скорее просто организация собственной деятельности.

Лес по квадратам - это не лучший выход. В некоторых рендерах (например OpenTopoMap) такая граница отображается явно и все эти склейки видны. Но на мой взгляд это более лучший подход к тому, как разбить большой полигон на меньшие. Квадрат под лес получается немаленький (примерно 3 км 600 метров сторона квадрата).

У меня такая-же проблема была, когда мне попадались полигоны, сшитые в огромные отношения не понятно каким образом (по какому принципу). Вся “склейка” представляла из себя лоскутное одеяло из комбинации полигонов леса с неупорядоченной последовательностью линий. В рассматриваемом способе хотя бы логика понятна. Конечно можно делить эти полигоны по административно-территориальному делению, но не хочется, чтобы сущность “лес” была завязана на сущность “граница района”.

В общем правильный вопрос Вы подняли: “А как правильно мапить большие массивы леса?”.

квадрат - наипростейшее шинкование на задания, штампуется элементарно , потому и пользуется HOTом, никому видать мудрить с пирогом неинтересно - очертил необходимое место и скинул в скрипт, делов-то.
при этом такая шинковка никак не связана с реальностью. карельские квадратики видели все я думаю.

леса сотнями км2 не рисовал, но сколь не ковырял вполне хватало местных линейных объектов чтобы адекватно собрать полигоны.

Резать по просекам или дорогам, в этом хоть какой-то смысл.

Для чего, городить огород с QGIS? Для JOSM есть возможность делать сетку через Command Line - https://wiki.openstreetmap.org/wiki/JOSM/Plugins/CommandLine. Либо развернул себе локально Таск Менеджер https://github.com/hotosm/osm-tasking-manager2 и нарезай задания сам себе - хочешь квадратами, хочешь произвольними полигонами.

Если есть просеки - то лучше по ним. Я так делал, но надолго меня не хватило:
http://openstreetmap.ru/#map=14/63.8457/57.3983&layer=M

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

Но да, как уже писали, получить сетку можно путями попроще. Один из самых простых вариантов - плагин gridlayer.

Раскраску по степени готовности можно реализовать тут: mapcraft.nanodesu.ru, вот пример

Возможно, будет интересен доклад про технику рисования больших лесов с ОМММ: видео.