Оффлайн рендеринг карт OpenStreetMap с помощью Maperitive и MOBAC
Поскольку целью написания статьи было описание способа автоматизации оффлайнового рендеринга карт OSM, далее буду описывать действия во встроенной в программу Maperitive собственной командной строке. Порядок действий:
1) Скачиваем и устанавливаем программу Maperitive http://maperitive.net/download/Maperitive-latest.zip
2) Скачиваем файл с данными OSM требуемой нам географической области, например файл с данными по Украине http://download.geofabrik.de/europe/ukraine-latest.osm.bz2 Данное действие можно произвести введя в окне Maperitive команду:
download-file url=http://download.geofabrik.de/europe/ukraine-latest.osm.bz2
где url=http://download.geofabrik.de/europe/ukraine-latest.osm.bz2 - это адрес в интернете скачиваемого файла
3) Поскольку мы скачали архив, то распаковываем файл OSM с помощью какого-либо подходящего архиватора, например 7-zip http://www.7-zip.org/ Помещаем распакованый файл в папку с программой Maperitive.
4) Очищаем экран от лишних слоёв карт командой
clear-map
5) Загружаем файл с данными OSM в программу Maperitive командой
load-source file=ukraine-latest.osm
где file=ukraine.osm - путь к файлу, в данном случае файл расположен в корневой папке программы, но можно указать любой путь
Так же возможна загрузка в Maperitive файлов .bz2:
load-source file=ukraine-latest.osm.bz2
6) Экспортируем требуемую нам область карты в новый файл OSM, например участок соответствующий Луганской области, командой
export-osm file=lugansk.osm bounds=37.82,47.75,40.28,50.11 index=1
где file=lugansk.osm - путь к создаваемому файлу, bounds=37.82,47.75,40.28,50.11 - географические координаты экспортируемой области расположенные в следующем порядке з.д,ю.ш.,в.д.,с.ш. их удобно брать со страницы http://www.openstreetmap.org/ на вкладке "Экспорт", index=1 - номер слоя карты, поскольку перед этим карта была очищена, то индекс равен 1.
Экспорт можно производить также с помощью программы osmconvert.exe http://m.m.i24.cc/osmconvert.exe Программа работает из командной строки. Экспорт заданной области можно выполнить командой:
osmconvert.exe ukraine-latest.osm -b=37.82,47.75,40.28,50.11 >Lugansk.osm
где osmconvert.exe - путь к исполняемому файлу программы, ukraine.osm - путь к файлу из которого извлекаются данные, Lugansk.osm - путь к файлу в который экспортируются данные. В данном случае все три файла находятся в одной папке и командная строка запущена из той же папки. -b=37.82,47.75,40.28,50.11 -координаты границ экспортируемой области, определяются как описано выше. Такой способ быстрее чем экспорт из программы Maperitive и требует меньше ресурсов компьютера.
7) Снова очищаем экран от ненужной нам теперь карты Украины и загружаем экспортированый файл данных Луганской области командами
clear-map
load-source file=lugansk.osm
8) Далее на карте можно сгенерировать рельеф и контуры высот состветственно командами
generate-relief-igor intensity=7
generate-contours
Рендеринг карты с рельефом и контурами высот будет занимать значительно больше времени.
9) Создаём папку Tiles, например на диске D:\ . Генерируем тайлы в эту папку в формате понятном программе MOBAC командой
generate-tiles bounds=37.82,47.75,40.28,50.11 maxzoom=16 minzoom=5 tilesdir="D:\Tiles"
где maxzoom=16 minzoom=5 - максимальный и минимальный зум создаваемого хранилища карт, то есть будут созданы карты с зумом от 5 до 16, tilesdir="D:\Tiles" - путь к создаваемому хранилищу, bounds=37.82,47.75,40.28,50.11 - географические координаты области которую необходимо отрендерить, можно указать любую область в пределах загруженных данных.
10) Скачиваем и устанавливаем программу MOBAC http://mobac.sourceforge.net/
11) Переходим в папку с этой программой. В папке mapsources создаём файл source.xml со следующим содержанием source.xml
Причём в строке
необходимо указать путь к папке со сгенерированными тайлами.
12) Запускаем MOBAC, выбираем в качестве источника карт MY_SOURCE и пользуемся программой как обычно.
Maperitive поддерживает выполнение скриптов с собственными командами. Для этого создаём текстовый файл со списком команд Maperitive внутри него, например script.txt, помещаем его в папку с программой и выполняем его командой
run-script file=script.txt
Есть возможность запуска скриптов написанных на языке Python, что например позволяет распаковывать файлы из архивов, или выполнять любую из команд операционной системы. Если создать файл python_script.py, поместить его в папку с программой, то запустить его можно командой
run-python file=python_script.py
Если в python_script.py внести строки следующего содержания
import os
os.system('7z.exe e ukraine-latest.osm.bz2 -y')
то этим скриптом можно распаковать архив с файлом OSM, предварительно надо установить архиватор 7-zip, и скопировать его исполняемый файл 7z.exe в папку с программой Maperitive. Скрипт со следующим содержанием позволит экспортировать заданную область с помощью программы osmconvert.exe:
import os
os.system('D:\osm\osmconvert.exe ukraine-latest.osm -b=37.82,47.75,40.28,50.11 >Lugansk.osm')
В данном случае файл osmconvert.exe находится в папке D:\osm, в этой же папке лежит исходный файл ukraine-latest.osm и сюда же записывается экспортируемый файл Lugansk.osm
Файл с расширением .mscript после двойного клика будет выполняться в Maperitive как список команд. Команды можно комментировать с помощью двойного знака дроби //
Привожу свой вариант скрипта для рендеринга тайлов:
1) Устанавливаем архиватор 7-zip
2) Переходим в папку с Maperitive (у меня это папка C:\Program Files (x86)\Maperitive), создаём в ней 4 новых текстовых файла, переименовываем их в unpack.py, bounds.py, delete.py, poff.py, MOBAC_TILES.mscript
3) Создаём папку D:\Tiles в которой будут хранится сгенерированные тайлы.
4) Открываем в текстовом редакторе файл unpack.py и записываем в него следующее:
import os
os.system('7z.exe e ukraine-latest.osm.bz2 -y')
5) Открываем в текстовом редакторе файл bounds.py и записываем в него следующее:
import os
os.system('"C:\Program Files (x86)\Maperitive\osmconvert.exe" ukraine-latest.osm -b=37.82,47.75,40.28,50.11 >Lugansk.osm')
6) Открываем в текстовом редакторе файл delete.py и записываем в него следующее:
import os
os.system('del "C:\Program Files (x86)\Maperitive\ukraine-latest.osm"')
os.system('del "C:\Program Files (x86)\Maperitive\ukraine-latest.osm.bz2"')
7) Открываем в текстовом редакторе файл poff.py и записываем в него следующее:
import os
os.system('shutdown /s')
8) Открываем в текстовом редакторе файл MOBAC_TILES.mscript и записываем в него следующее:
download-file url=http://download.geofabrik.de/openstreetmap/europe/ukraine-latest.osm.bz2
run-python file=unpack.py
clear-map
run-python file=bounds.py
run-python file=delete.py
load-source file=lugansk.osm
//generate-relief-standard
//generate-contours
generate-tiles bounds=37.82,47.75,40.28,50.11 maxzoom=16 minzoom=5 tilesdir="D:\Tiles"
run-python file=poff.py
Последняя строка отключает компьютер по окончании работы скрипта, поскольку процесс генерации тайлов может занять длительное время.