Подготовка карт для соревнований
Краткое how-to, как на основе OSM подготовить картинку, издалека похожую на карту спортивного ориентирования.
Как известно, «внутри» OSM векторные данные, и для печати необходимо перевести их в растр.
Я знаю несколько рендеров:
- mapnik. Большая и толстая софтина. Данные забирает из базы pgsql. Описание стилей рендера довольно запутанное, насколько я понимаю. В связи со сложностью установки не пользовался. Примеры картинки — на osm.org
- maperitive. Данные забирает непосредственно из файла OSM. Описание стилей на официальном сайте достаточно подробное, однако готового стиля «для ориентировщиков» нет. Занимается только рендером, для редактирования карты необходимо править исходные данные. Помимо этого, программа больше предназначена для подготовки онлайн-карт, при печати вылезают мелкие косяки. Примеры картинки — карты ЗГ до 2018 включительно.
- OpenOrienteering. Бесплатный аналог OCAD’а — софтины, в которой рисуют все «настоящие» спорткарты. Не умеет напрямую работать с OSM, необходим конвертер. Из преимуществ — готовый стиль спорткарт, возможность редактировать почти готовую карту. Недостатки — стиль несколько не соответствует реалиям любительских велогонок, его необходимо доделывать. Пример картинки — карта ЗГ 2019, 2021, 2022.
Наиболее перспективным и удобным считаю последний вариант, его и рассмотрим.
Получение данных
Для начала нам нужны собственно данные.
- скачиваем редактор JOSM (josm.ru)
- скачиваем данные в нужном квадрате (с запасом в километр-другой во все стороны, обрежется потом). Примечание DIVa: если переусердствовать и выбрать слишком много, то будут возникать ошибки при конвертации из OSM в xmap и при печати картинки карты.
- докачиваем мультиполигоны, попавшие на границу скачивания: выбираем их (Ctrl-F, в строке запроса вводим type:relation multi ) и для каждого неполного полигона в окошке выделенных объектов тыкаем правой кнопкой и говорим «скачать». Примечание DIVa: если мультиполигон начинается со слова «маршрут», а в рабочей области есть жд — не надо его скачивать! Инчае можно скачать маршрутную сеть РЖД от Мурманска и Питера до Казахстана, и тогда дальнейшая работа обрастет весьма забавными подробностями…
- сохраняем файл
Попутно не забываем дорисовывать пропущенные грунтовки и кусты, расставлять типы покрытий на дорогах, домики в деревнях и проч., проч., проч… Примечание DIVa: вики OSM с рекомендациями по типам объектов + горячие клавиши JOSM.
Конвертер
Скачиваем конвертер (отдельное спасибо Семёну Якимову за эту замечательную программу!). Распаковываем, запускаем (commandline, да), получаем файл в формате xmap.
Редактор
Скачиваем OpenOrienteering, устанавливаем, читаем инструкцию (без инструкции — не работает). Примечание DIVa: на 3-4 заход методом тыка — вполне себе работает 🙂
- Устанавливаем корректный масштаб (Карта — Изменить масштаб). Если масштабировать объекты сразу, то можно получить очень мелкую карту; лучше их не менять сразу, а потом подогнать нужные объекты под читабельность.
- Удаляем совсем уж лишние объекты, чтобы не мешались.
- Вручную присваиваем корректный тип объектам, для которых конвертер не подобрал нужную заливку (TODO список: поля, что ещё?)
- Присваиваем более корректные цвета (Символы — Настройка цветов). TODO попробовать экспортировать из файла ЗГ 2019
- Расставляем точки КП, старта-финиша. Примечание DIVa: или загружаем их из gpx с конвертацией точек в кружки 702.
- Экспортируем в картинку (Файл — Экспорт).
- Прифотошопливаем баннеры-логотипы-космоснимки.
- Проверяем. В случае мелких косяков можно править непосредственно карту orienteering’а, в случае больших — вся история начинается заново, с правки OSM и выгрузки свежих данных.
- Перед отпракой на печать переводим цвета в CMYK!!!
Примечание DIVа: В OpenOrienteering есть очень удобная штука — слои. Можно заранее нарисовать на отдельном слое мосты, на втором аэродромы, в третий загрузить горизонтали, в четвертый забить названия населенных пунктов и т.п. Потом удалить слой карты и сохранить в отдельный файл слои с накладными объектами. Тогда после правки карты в OSM будет достаточно 1) конвертнуть карту из OSM в xmap и 2) импортировать все накладные объекты из заранее припасенного файла вместе с их слоями. Важно только заранее согласовать масштабы и набор условных знаков.
А еще можно менять масштаб каждого элемента карты по отдельности, например уменьшить толщину обводки реки, или одним движением убрать с карты все стены определенного формата
TODO файлы стилей от ЗГ2019, файлы стилей от Семёна (Владимирский Рогейн).
Высоты (дополнение от DIVa)
Можно прикрутить к карте горизонтали от srtm, если не пугает их кривость и изломанность.
- Определяем долготу и широту границ района. Можно взять из названия файла osm который сохранит JOSM, например для planet_37.71,55.118_38.275,55.415.osm долгота западная 37.71, восточная 38.275; широта юг 55.118 широта север 55.415
- Берем откуда-нибудь данные srtm в формате hgt на свой район. Например отсюда скачиваем архив для квадрата N37 и из него берем подходящий по координатам файл или файлы если район на границе. Например для ЗГ21 это N55E037.hgt и N55E038.hgt
- Скачиваем с http://www.gisinternals.com/ пакет gdal под свою разрядность в виде архива бинарников. Что интересно, на 64разрядной системе 32разрядный пакет не заработал, не смог подгрузить свою же dll. Пакет распаковываем в папку с простым путем типа d:\temp\gdal, сюда же переписываем наши hgt
- Создаем в этой же папке батник такого вида
path %PATH%;d:\temp\gdal\bin\
d:\temp\gdal\bin\gdal\apps\gdal_contour.exe -i 5 -snodata 32767 -a height d:\temp\N55E037.hgt d:\temp\N55E037.shp
d:\temp\gdal\bin\gdal\apps\gdal_contour.exe -i 5 -snodata 32767 -a height d:\temp\N55E038.hgt d:\temp\N55E038.shp
d:\temp\gdal\bin\gdal\apps\ogr2ogr -clipsrc 37.71 55.11 38.27 55.45 -f GPX -lco FORCE_GPX_TRACK=YES N55E037.gpx N55E037.shp
d:\temp\gdal\bin\gdal\apps\ogr2ogr -clipsrc 37.71 55.11 38.27 55.45 -f GPX -lco FORCE_GPX_TRACK=YES N55E038.gpx N55E038.shp
pause
Первой строкой даем экзешнику путь к dll
Второй -третьей преобразуем hgt в промежуточный формат shp с шагом горизонталей 5 метров.
Четвертой-пятой преобразуем shp в треки-маршруты внутри gpx. При этом преобразованиии надо указать границы района в команде
ogr2ogr -clipsrc ДолготаЗапад ШиротаЮг ДолготаВосток ШиротаСевер -f GPX -lco FORCE_GPX_TRACK=YES <выходной файл>.gpx <промежуточный файл>.shp
Команда ogr2ogr страшно ругается, что не находит проект proj.db, не может записать в gpx какие-то поля; эту ругань игнорируем. Главное, правильно указать границы района для конвертации.
- Правим: грузим полученные gpx в JOSM; окошко слои — выбрать слой gpx — преобразовать в слой данных; загрузить подложку; поправить линии; сохранить как gpx.
- В OpenOrienteering Mapper создаем новый слой «горизонтали», выбираем его, импортируем полученные gpx. При импорте преобразуем линии в горизонтали 101, жирные горизонтали 102 или полугоризонтали 103
Если нужно чтобы каждая пятая горизонталь была жирной, повторяем шаги начиная с создания батника, только устанавливаем шаг не 5м а 25, и при импорте в OpenOrienteering Mapper выбираем горизонталь 102
Пример для района Звездной 21
Можно прикрутить к карте горизонтали от Завьяловских карт
- Определяем листы необходимых карт, идем на https://slazav.xyz/maps/podm.htm#h1 и скачиваем нужные листы в векторном формате MP.
- Скачиваем ExctractSlazavHorizontal.zip и натравливаем его на векторный файл. Входные параметры: 1) путь к завьяловскому mp 2) номер слоя горизонталей (20 — полугоризонталь, 21 — горизонталь, 22 — жирная горизонталь). Если нужны исходники — обращаться к DIVу.
- Имя для выходного gpx формируется из имени mp и добавления к нему номера слоя; файл создается рядом с исходным.
- Правим: грузим полученные gpx в JOSM; окошко слои — выбрать слой gpx — преобразовать в слой данных; загрузить подложку; поправить линии; сохранить как gpx.
- В OpenOrienteering Mapper создаем новый слой «горизонтали», выбираем его, импортируем полученные gpx. При импорте преобразуем линии слоя 21 в горизонтали 101, линии слоя 22 в жирные горизонтали 102, линии слоя 20 в полугоризонтали 103
- При необходимости можно извлечь из mp линии оврагов 25, но они не всегда хорошо ложатся на OSMную подоснову.
- При желании можно извлечь реки, слой
Пример для района Звездной 21