Настал момент, когда от хаотичной отрисовки в стиле “фримаппинг” (по аналогии с фрирайдингом - где хочу, там и рисую) решил перейти к плановой отрисовке по квадратам. В теме описывается, как создать свой слой в JOSM с полигонами-квадратами, которые можно использовать для фрагментирования области отрисовки.
1. В качетсве предисловия
До этого обычным делом была такая ситуация:
Очевидно, что у данной хаотичной отрисовки есть ряд недостатков:
-
Не знаешь точно, насколько детально ты проработал местность. Между такими “скачками” можно запросто пропустить много объектов, иначе нужно возвращаться и все это пересматривать.
-
Хаотичная отрисовка создает видимость, что эта территория уже отрисована другим маппером и поэтому может не привлечь внимания другого энтузиаста.
-
Результирующий changeset “размазан” по большой территории (его bounding-box слабо локализован).
В решении указанных выше проблем (на мой взгляд) лучшим подходом является применение принципа “разделяй и влавствуй” (в реалиях OSM перефразирую на “разделяй и мапь”).
Разделять будем на квадраты.
Для этого понадобится совсем немного:
-
Полигон интересующей территории в векторном формате.
-
QGIS
-
ogr2osm + Git + Python
-
JOSM
-
немного времени
Далее детально опишу, как создать сетку квадратов для дальнейшей отрисовки по ним.
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