RU:Mapnik/Rendering OSM XML data directly

From OpenStreetMap Wiki
Jump to: navigation, search
Доступные языки — Mapnik: Rendering OSM XML data directly
· Afrikaans · Alemannisch · aragonés · asturianu · azərbaycanca · Bahasa Indonesia · Bahasa Melayu · Bân-lâm-gú · Basa Jawa · Basa Sunda · Baso Minangkabau · bosanski · brezhoneg · català · čeština · corsu · dansk · Deutsch · eesti · English · español · Esperanto · estremeñu · euskara · français · Frysk · Gaeilge · Gàidhlig · galego · Hausa · hrvatski · Igbo · interlingua · Interlingue · isiXhosa · isiZulu · íslenska · italiano · Kiswahili · Kreyòl ayisyen · kréyòl gwadloupéyen · Kurdî · latviešu · Lëtzebuergesch · lietuvių · magyar · Malagasy · Malti · Nederlands · Nedersaksies · norsk bokmål · norsk nynorsk · occitan · Oromoo · oʻzbekcha/ўзбекча · Plattdüütsch · polski · português · română · shqip · slovenčina · slovenščina · Soomaaliga · suomi · svenska · Tiếng Việt · Türkçe · Vahcuengh · vèneto · Wolof · Yorùbá · Zazaki · српски / srpski · беларуская · български · қазақша · македонски · монгол · русский · тоҷикӣ · українська · Ελληνικά · Հայերեն · ქართული · नेपाली · मराठी · हिन्दी · भोजपुरी · অসমীয়া · বাংলা · ਪੰਜਾਬੀ · ગુજરાતી · ଓଡ଼ିଆ · தமிழ் · తెలుగు · ಕನ್ನಡ · മലയാളം · සිංහල · བོད་ཡིག · ไทย · မြန်မာဘာသာ · ລາວ · ភាសាខ្មែរ · ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ‎ · አማርኛ · 한국어 · 日本語 · 中文(简体)‎ · 中文(繁體)‎ · 吴语 · 粵語 · ייִדיש · עברית · اردو · العربية · پښتو · سنڌي · فارسی · ދިވެހިބަސް
Карта отрендеренная из сырых данных OSM, с использованием файла карты из примера. Часть Милана, Италия

Итак, вам захотелось попробовать создать свою карту с помощью mapnik. Значит, это для вас...
Данный туториал описывает базовые шаги с самого начала. Прежде всего, убедитесь, что у вас этот mapnik установлен. Почитайте Mapnik/Installation, если это не так.

В приведённом примере не используется база данных postgresql. Данные берутся прямо из .osm XML файла, что накладывает кое-какие ограничения, но зато позволяет вам быстрее начать.

Мы будем рендерить карту маленького района южной Баварии, Германия. Всё было протестировано на Arch Linux и Ubuntu, но, в принципе, должно работать на любой операционной системе UNIX, где установлены bash, mapnik и python. С другими операционными системами вам придётся разобраться, что надо изменить.


Получение данных

Итак, у вас установлен mapnik и запущена установка python. Следующим шагом будет получение данных из OSM. Вы можете воспользоваться API для скачивания данных небольшой области, а в данном примере мы возьмём данные из www.geofabrik.de. Используем файл, содержащий регион Швабия в Баварии, Германия:

# cd workdir
# wget http://download.geofabrik.de/osm/europe/germany/bayern/schwaben.osm.bz2
# bunzip schwaben.osm.bz2

Создание файла стиля

Далее, создадим главный xml файл, соержащий инструкции для mapnik о содержимом карты, и как его рендерить. Создайте файл mapnik_style.xml со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<Map bgcolor="#f2efe9" srs="+proj=latlong +datum=WGS84">
	<FontSet name="book-fonts">
		<Font face_name="DejaVu Sans Book" />
	</FontSet>
	<Style name="highways">
		<Rule>
			<Filter>[highway] &lt;&gt; ''</Filter>
			<LineSymbolizer>
				<CssParameter name="stroke">#808080</CssParameter>
				<CssParameter name="stroke-width">2</CssParameter>
				<CssParameter name="stroke-linejoin">round</CssParameter>
				<CssParameter name="stroke-linecap">round</CssParameter>
			</LineSymbolizer>
		</Rule>
		<Rule>
			<Filter>[highway] &lt;&gt; ''</Filter>
			<TextSymbolizer name="name" fontset_name="book-fonts"
				size="9" fill="#000" halo_radius="1" placement="line" />
		</Rule>
	</Style>
	<Layer name="highways" status="on" srs="+proj=latlong +datum=WGS84">
		<StyleName>highways</StyleName>
		<Datasource>
			<Parameter name="type">osm</Parameter>
			<Parameter name="file">schwaben.osm</Parameter>
		</Datasource>
	</Layer>
</Map>

Давайте немного разберём это:

  • Mapnik создаст карту со светло-бежевым фоном, в сферической проекции Меркатора (задано в параметре srs).
  • Элемент FontSet описывает шрифты, которые будут использоваться на карте, указанием символического имени. Наш пример использует только один шрифт.
  • Стиль highways указывает Mapnik как рендерить дороги:
    • Элемент Filter в каждом правиле указывает, к каким объектам это правило применяется. Здесь мы выбрали все дороги, т.е. все элементы с непустым тегом highway. Для фильтрации можно использовать любые теги. Так же допускаются Булевы выражения.
    • Дороги будут рендериться как серые линии шириной 2 пикселя.
    • Надписи будут располагаться над каждой дорогой. Тескт надписи будет содержать значение тега "name", используемый шрифт мы описали выше, 9 пунктов с белой (в 1 пиксель) обводкой букв.
  • Элемент Layer указывает Mapnik, откуда брать данные: OSM файл с именем schwaben.osm. Он также указывает, что его содержимое должно рендериться стилем highways. Вместо локального файла OSM, мы также можем указать URL (API, XAPI и TRAPI) и ограничивающий прямоугольник, заставляющий Mapnik брать данные напрямую с сервера. Установите параметр srs, как показано в данном примере.

Вы можете добавить больше правил и фильтров, чтобы определить все элементы карты, какие пожелаете.

Рендеринг карты

Наконец, мы командуем mapnik рендерить карту, используя файл стиля. Чтобы сделать это, мы воспользуемся Python API mapnik. Создайте python скрипт render.py со следующим содержимым и запустите его. В зависимости от операционной системы, может потребоваться сделать скрипт исполняемым.

#!/usr/bin/env python2

from mapnik import *

mapfile = 'mapnik_style.xml'
map_output = 'mymap.png'

m = Map(4*1024,4*1024)
load_map(m, mapfile)
bbox=(Envelope( 10.0,47.5,11.1,48.1 ))

m.zoom_to_box(bbox)
print "Scale = " , m.scale()
render_to_file(m, map_output)

Данный скрипт указыват mapnik рендерить mymap.png размером 4096x4096 пикселей из файла стиля mapnik_style.xml. Карта будет содержать данные области в прямоугольнике (сферическом) от 47.5° N 10.0° E до 48.1° N 11.1° E. Note that the units taken by the Envelope constructor совпадают с теми, что описаны в разделе srs файла mapnik_style.xml, т.е. srs="+proj=longlat" в данном случае. Скрипт также напечатает масштаю карты и создаст png файл с картой.
Если хотите, можете поступить проще, используя Mapnik Viewer: всё, что вам нужно, это файл карты и файл OSM. Запустите viewer и откройте файл карты - он автоматически центрируется и приблизится к области, содержащей данные. Вы можете приближаться и отдаляться, перемещаться, включать и отключать отдельные уровни, либо изменять файл карты и обновлять просмотр.

В Ubuntu, просто установите пакет mapnik-viewer. В других ОС ищите похожий пакет. Если его нет, вы можете найти инструкции по сборке в Mapnik wiki.

Доработка

Теперь попробуем немного изменить карту: перепишите элемент LineSymbolizer следующим образом:

                        <LineSymbolizer>
                                <CssParameter name="stroke">black</CssParameter>
                                <CssParameter name="stroke-width">4</CssParameter>
                                <CssParameter name="stroke-opacity">1.0</CssParameter>
                        </LineSymbolizer>
                        <LineSymbolizer>
                                <CssParameter
                                        name="stroke">red</CssParameter>
                                <CssParameter
                                        name="stroke-width">3.0</CssParameter>
                        </LineSymbolizer>

Будет нарисована черная линия шириной 4, и, поверх нее, красная линия шириной 3. В результате, получим обведенную красную дорогу.

Теперь можете добавить еще элементов на вашу карту, смотрите Mapnik Example для примеров и используйте xml schema reference.

Ограничения

Несмотря на то, что данный способ хорош для быстрого импровизированного рендеринга карты или для проверки новых стилей, он имеет несколько ограничений:

  • Каждый слой включает всебя все точки и линии в файле OSM и рендерится со стилями, определёнными для них - это отличие от использования базы данных в качестве источника (где вы можете использовать запрос, чтобы получить только подмножество данных). Вам нужно фильтровать объекты, определяя элемент Filter в каждом вашем стиле - имейте это в виду, когда копируете стили из файла карты, созданной для других видов источников данных.
  • Стили в равной степени применяются и к точкам и к линиям, если они соответствуют Filter - и нет способа отделить одно от другого. Это, однако, возможно для отделения областей от линий проверкой наличия тега area, либо иных тегов, специфичных для областей.
  • Отношения в OSM будут игнорироваться. Информация, содержащаяся в отношениях (route, multipolygon), не может быть отрендерена таким методом.
  • Нет возможности постобработки данных на лету (например, поиск центроида области, автоматическое приведение тегов к определенному виду, сортировка объектов и рендеринг только первых из них) - such advanced processing is done in the data source and requires a database.
  • While you can use OSM files downloaded with JOSM for that purpose, objects with changes that have not been uploaded will not show up correctly in the map.