Свободные картографические технологии: рендеры
Содержание:
1.Рендеры (Вы читаете данный раздел);
2. Оффлайн-редакторы;
3. Клиенты для Android.
В этой статье я расскажу о программном окружении OpenStreetMap - стороннем ПО, которое так или иначе связано с проектом. Это рендеры, редакторы и клиенты. Обо всём понемногу и по порядку.
Для OpenStreetMap существует два «официальных» основных рендера: Osmarender и Mapnik. Оба можно использовать в режиме оффлайн, на локальной машине. Osmarender - более простой, поэтому с него и начну.
Osmarender (http://wiki.openstreetmap.org/wiki/Osmarender) - это не отдельная программа, а набор файлов для преобразования картографических данных при помощи XSL (Extensible Stylesheet Language). Грубо говоря, есть данные в формате OpenStreetMap XML, есть набор правил в формате XSL, и при помощи последних данные переводятся в SVG. Обработкой правил могут заниматься различные программы - так называемые XSLT-процессоры. Например, Xalan-J, XRay2, Saxon, и другие. Я остановился на xsltproc. Опишу, как с его помощью отрендерить карту.
1. Скачаем сам «рендер» командой:
2. Получится директория osmarender с подкаталогами. Из этих подкаталогов скопируем файлы osm-map-features-z17.xml, markers.xml и osmarender.xsl в корневой директорию osmarender. Замечу, что «z17.xml» в имени файла обозначает уровень масштаба: чем больше, тем подробнее будет карта. В данном примере - 17, т.е. максимальный уровень.
3. В osm-map-features-z17.xml, для отображения на карте условных знаков, подправим путь к каталогу символов. Меняем строку:
на:
4. С сайта OpenStreetMap сделайте экспорт нужного вам участка карты в формат OpenStreetMap XML, сохранив файл как data.osm (именно под таким именем) в корневую директорию osmarender.
5. Убедитесь, что у вас установлена xsltproc (она входит в libxslt).
6. В корневой директории osmarender выполните:
На выходе будет получен файл map.svg. При его открытии в программе просмотра (например, Inkscape) вы обнаружите, что размер карты в пикселях слишком маленький. Через файлы правил преобразования повлиять на это не получится - надо действовать обходным путем. Например, для увеличения масштаба (пиксельного) в 10 раз даем команду:
Для удобства проще написать bash-скрипт со всеми тремя командами:
Для преобразования из командной строки в PNG можно сделать так:
Теперь рассмотрю вопрос рендеринга названий на карте в нужной локали. Например, для принудительного рендеринга на русском языке потребуется в файле osm-map-features-z17.xml изменить все name на name:ru. Это упрощенный, но вполне рабочий способ - конечно, если все объекты имеют тег name:ru. Еще можно задать такие правила, чтобы при отсутствии локализованного тега использовался тег по умолчанию. Кстати, имя обрабатываемого файла данных (data.osm) можно изменить в том же osm-map-features-z17.xml в параметре data. Через файл правил настраивается практически всё: размер объектов, цвета и т.д.
Таковы основы работы с Osmarender. Теперь - про Mapnik (http://mapnik.org). Mapnik написан на C++, но обычно для взаимодействия с ним используются скрипты на Python. Сам по себе Mapnik не привязан к OpenStreetMap - это отдельный проект, географический рендер, который был приспособлен проектом OpenStreetMap для рендеринга некоторых слоев карты сайта (слои Mapnik, велосипедный слой и так далее). Mapnik может быть использован для рендеринга OSM-данных напрямую при наличии соответствующего плагина, а более традиционный способ заключается в переводе OSM-данных в PostGIS, а уже оттуда - в Mapnik.
В любом случае для создания карты при помощи Mapnik вам придется писать скрипт на Python (можно и программу на C++). Это очень обширная тема для обзорной статьи, поэтому ограничусь несколькими замечаниями, которые помогут в начале пути.
Первое - сборка OSM-плагина. Дело в том, что по умолчанию он не собирается. Во-первых, требуется devel-пакет для libcurl. Во-вторых, в исходном коде Mapnik придется кое-что исправить... В корневом каталоге исходника даем команду:
Создастся файл config.py. Откроем его и в строку «INPUT_ PLUGINS» добавим osm:
Только теперь стоит выполнять scons и scons install. Кстати, если Mapnik потом «не виден», напомню очевидное: добавьте путь к новой библиотеке в ld.so.conf - например, если у вас собранные пользователем библиотеки устанавливаются в /usr/ local/lib, то нужно выполнить (с правами root):
Рендеринг карты состоит из написания скрипта и дополнительного XML-файла со стилями отрисовки. Конечно, потребуется и сам файл с картографическими данными. Всё подробно описано в документации OpenStreetMap (в отличие от работы с OSM-плагином).
Кстати, существует ещё один довольно навороченный и многоплатформенный рендер, причем с графическим интерфейсом - Maperetive (http://maperitive.net). Он написан на C# и, благодаря Mono, хорошо запускается. Однако код Maperetive закрыт.
Ну, а если Вас гораздо больше интересует мастерство создания коллажа в photoshop (http://www.shopvideokurs.ru/product/masterstvo-sozdaniya-kollazha-v-photoshop-i-obrabotka-fotografiy), а не современные картографические технологии, тогда Вам следует в обязательном порядке посетить сайт www.shopvideokurs.ru. Здесь Вы найдете отличный учебный курс, который поможет Вам освоить азы Photoshop'а.
1.
2. Оффлайн-редакторы;
3. Клиенты для Android.
В этой статье я расскажу о программном окружении OpenStreetMap - стороннем ПО, которое так или иначе связано с проектом. Это рендеры, редакторы и клиенты. Обо всём понемногу и по порядку.
Для OpenStreetMap существует два «официальных» основных рендера: Osmarender и Mapnik. Оба можно использовать в режиме оффлайн, на локальной машине. Osmarender - более простой, поэтому с него и начну.
Osmarender (http://wiki.openstreetmap.org/wiki/Osmarender) - это не отдельная программа, а набор файлов для преобразования картографических данных при помощи XSL (Extensible Stylesheet Language). Грубо говоря, есть данные в формате OpenStreetMap XML, есть набор правил в формате XSL, и при помощи последних данные переводятся в SVG. Обработкой правил могут заниматься различные программы - так называемые XSLT-процессоры. Например, Xalan-J, XRay2, Saxon, и другие. Я остановился на xsltproc. Опишу, как с его помощью отрендерить карту.
1. Скачаем сам «рендер» командой:
$ wget -r -np -R index.html -nH --cut-dirs 2
http://svn.openstreetmap.org/applications/
rendering/osmarender/
http://svn.openstreetmap.org/applications/
rendering/osmarender/
2. Получится директория osmarender с подкаталогами. Из этих подкаталогов скопируем файлы osm-map-features-z17.xml, markers.xml и osmarender.xsl в корневой директорию osmarender. Замечу, что «z17.xml» в имени файла обозначает уровень масштаба: чем больше, тем подробнее будет карта. В данном примере - 17, т.е. максимальный уровень.
3. В osm-map-features-z17.xml, для отображения на карте условных знаков, подправим путь к каталогу символов. Меняем строку:
symbolsDir="../stylesheets/symbols"
на:
symbolsDir="./stylesheets/symbols"
4. С сайта OpenStreetMap сделайте экспорт нужного вам участка карты в формат OpenStreetMap XML, сохранив файл как data.osm (именно под таким именем) в корневую директорию osmarender.
5. Убедитесь, что у вас установлена xsltproc (она входит в libxslt).
6. В корневой директории osmarender выполните:
$ xsltproc osmarender.xsl osm-map-features-z17.xml > map.svg
На выходе будет получен файл map.svg. При его открытии в программе просмотра (например, Inkscape) вы обнаружите, что размер карты в пикселях слишком маленький. Через файлы правил преобразования повлиять на это не получится - надо действовать обходным путем. Например, для увеличения масштаба (пиксельного) в 10 раз даем команду:
$ sed -i 's/(svg .*height=»[0-9]+).([0-9])/12./' map.svg
$ sed -i 's/(svg .*width=»[0-9]+).([0-9])/12./' map.svg
$ sed -i 's/(svg .*width=»[0-9]+).([0-9])/12./' map.svg
Для удобства проще написать bash-скрипт со всеми тремя командами:
$ xsltproc osmarender.xsl osm-map-features-z17.xml > map.svg
$ sed -i 's/(svg .*height=»[0-9]+).([0-9])/12./' map.svg
$ sed -i 's/(svg .*width=»[0-9]+).([0-9])/12./' map.svg
$ sed -i 's/(svg .*height=»[0-9]+).([0-9])/12./' map.svg
$ sed -i 's/(svg .*width=»[0-9]+).([0-9])/12./' map.svg
Для преобразования из командной строки в PNG можно сделать так:
$ inkscape -D -e output.png map.svg
Теперь рассмотрю вопрос рендеринга названий на карте в нужной локали. Например, для принудительного рендеринга на русском языке потребуется в файле osm-map-features-z17.xml изменить все name на name:ru. Это упрощенный, но вполне рабочий способ - конечно, если все объекты имеют тег name:ru. Еще можно задать такие правила, чтобы при отсутствии локализованного тега использовался тег по умолчанию. Кстати, имя обрабатываемого файла данных (data.osm) можно изменить в том же osm-map-features-z17.xml в параметре data. Через файл правил настраивается практически всё: размер объектов, цвета и т.д.
Таковы основы работы с Osmarender. Теперь - про Mapnik (http://mapnik.org). Mapnik написан на C++, но обычно для взаимодействия с ним используются скрипты на Python. Сам по себе Mapnik не привязан к OpenStreetMap - это отдельный проект, географический рендер, который был приспособлен проектом OpenStreetMap для рендеринга некоторых слоев карты сайта (слои Mapnik, велосипедный слой и так далее). Mapnik может быть использован для рендеринга OSM-данных напрямую при наличии соответствующего плагина, а более традиционный способ заключается в переводе OSM-данных в PostGIS, а уже оттуда - в Mapnik.
В любом случае для создания карты при помощи Mapnik вам придется писать скрипт на Python (можно и программу на C++). Это очень обширная тема для обзорной статьи, поэтому ограничусь несколькими замечаниями, которые помогут в начале пути.
Первое - сборка OSM-плагина. Дело в том, что по умолчанию он не собирается. Во-первых, требуется devel-пакет для libcurl. Во-вторых, в исходном коде Mapnik придется кое-что исправить... В корневом каталоге исходника даем команду:
$ scons configure
Создастся файл config.py. Откроем его и в строку «INPUT_ PLUGINS» добавим osm:
INPUT_PLUGINS = 'osm,postgis,raster,shape'
Только теперь стоит выполнять scons и scons install. Кстати, если Mapnik потом «не виден», напомню очевидное: добавьте путь к новой библиотеке в ld.so.conf - например, если у вас собранные пользователем библиотеки устанавливаются в /usr/ local/lib, то нужно выполнить (с правами root):
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
# ldconfig
Рендеринг карты состоит из написания скрипта и дополнительного XML-файла со стилями отрисовки. Конечно, потребуется и сам файл с картографическими данными. Всё подробно описано в документации OpenStreetMap (в отличие от работы с OSM-плагином).
Кстати, существует ещё один довольно навороченный и многоплатформенный рендер, причем с графическим интерфейсом - Maperetive (http://maperitive.net). Он написан на C# и, благодаря Mono, хорошо запускается. Однако код Maperetive закрыт.
Ну, а если Вас гораздо больше интересует мастерство создания коллажа в photoshop (http://www.shopvideokurs.ru/product/masterstvo-sozdaniya-kollazha-v-photoshop-i-obrabotka-fotografiy), а не современные картографические технологии, тогда Вам следует в обязательном порядке посетить сайт www.shopvideokurs.ru. Здесь Вы найдете отличный учебный курс, который поможет Вам освоить азы Photoshop'а.