Дисклеймер
Недавно по работе возникла задача генерации тайлов на основе OSM данных. Поискал, прочитал несколько статей, но везде фигурировали *nix-системы, а у меня был в наличии сервер под управлением Windows. В конце-концов, более-менее внятный туториал нашёлся, но он слегка устарел и не везде подробен, посему пришлось повозиться. После удачного завершения подумал, что мой опыт будет полезен.
Кого заинтересовал, прошу под кат.
Вводные
Установка производилась на чистые Windows 7 и 8.1, безо всякого софта. Понадобится следующее:
- PostgreSQL (использовал 9.4.4) — БД для хранения геоинформации из дампа OSM.
- PostGIS (использовал 2.1) — расширение БД для работы с геоинформацией.
- Osm2pgsql — утилита для импорта дамп OSM данных в БД.
- Mapnik (использовал 2.2.0) — утилита для генерации тайлов.
Также понадобятся дополнительные инструменты, без которых, однако, ничего не выйдет:
- Патч для GiST-индексов в PostGIS
- Python 2.х (использовал 2.7.10) — на нём написаны скрипты генерации тайлов.
- PROJ.4 — библиотека картографических проекций.
- SVN-клиент (использовал TortoiseSVN) — для выкачивания скриптов генерации тайлов от OSM, см. ниже.
- Скрипты генерации от OSM (использовал ревизию 31519)
- OSM информация: линии побережья и всё такое.
1. Установка и настройка PostgreSQL
Дистрибутив можно взять с офсайта. Установка достаточно тривиальна, однако, есть пара моментов.
Во-первых, возможно, следует изменить директорию, где хранится БД (может потребоваться до терабайта, в случае использования OSM данных для всей планеты). По умолчанию (для версии 9.4) это C:\Program Files\PostgreSQL\9.4\data
Во-вторых, возможно, следует изменить локаль кластера. В моём случае на Russian, Russia
. При установке у вас также спросят пароль для сервера PostgreSQL, он ещё понадобится, запомните его.
После установки самого PostgreSQL, запустится StackBuilder, мастер установки расширений для БД. Нужно выбрать два расширения: Spatial Extensions -> PostGIS и Database Drivers -> JDBC. Все настройки при установке по-умолчанию. В процессе установки PostGIS будет запрос на создание системной переменной и ещё пара вопросов, соглашайтесь. После этого нужно перезапустить службу PostgreSQL.
Далее добавьте bin
директорию PostgreSQL в PATH
. После добавления нужно выйти из системы и войти заново (logoff-login), чтобы настройки применились.
Проверяем корректность установки, понадобится вспомнить пароль, который вы вводили на этапе установки. Находим в программах pgAdmin III и запускаем. В списке серверов будет единственный localhost:5432
, подключаемся. Если не удаётся, скорее всего, служба не запущена.
Создаём шаблон для базы геоданных:
CREATE DATABASE template_postgis_20 WITH ENCODING='UTF8' OWNER=postgres CONNECTION LIMIT=-1 LC_COLLATE = 'Russian_Russia.1251' LC_CTYPE = 'Russian_Russia.1251' TABLESPACE=pg_default;
Добавляем два расширения в шаблон: postgis
и postgis_topology
. Отключаемся от этой базы.
Создаём базу данных gis
на основе шаблона template_postgis_20
:
CREATE DATABASE gis WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'Russian_Russia.1251' LC_CTYPE = 'Russian_Russia.1251' CONNECTION LIMIT = -1;
Берём патч для PostGIS GiST отсюда. Патчим из командной строки:
C:\Users\red>psql -U postgres -d gis -f legacy-postgis-gist.sql CREATE OPERATOR CLASS
База данных готова.
2. Установка и настройка Osm2pgsql
Можно взять последний релиз с гитхаба и собрать самому, а можно взять готовый артефакт отсюда.
Скачиваем, распаковываем, переименовываем для удобства в osm2pgsql
. Добавляем эту директорию в переменную PATH
. Logoff-login. Проверяем, что всё работает:
C:\Users\red>osm2pgsql -h
Должна вывестись справка. Берём последний default.style
из репозитория на гитхабе.
Всё готово для импорта OSM данных.
Карта планеты в сжатом виде весит ~40 Гб. Для примера можно взять карту Москвы, например, отсюда. Скачиваем.
Для импорта выполняем в командной строке:
C:\Users\red>osm2pgsql -d gis -U postgres -W -H localhost -P 5432 -s -S C:\osm2pgsql\default.style RU-MOW.osm.pbf
Параметр -s
, т.е. slim — режим, при котором временные данные хранятся в БД. Это замедляет процесс, увеличивает использование диска, но уменьшает использование оперативной памяти.
Если всё правильно, будет запрос пароля и начнётся импорт дампа в БД. В первых строчках будут всякие предупреждения, не пугайтесь, всё в порядке. После завершения импорта будет выведено что-то вроде:
Osm2pgsql took 160s overall
Геоданные в базе.
3. Установка Python’а 2.x
Скачиваем дистрибутив x86 (потому что бинарники Mapnik для Windows есть только x86) отсюда. Ставим, настройки по-умолчанию, кроме одного: стоит отметить «Добавить python.exe в PATH», или сделать это ручками после установки. Logoff-login.
Проверяем правильность установки:
C:\Users\red>python Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>
Питон готов.
4. Установка и настройка Mapnik’а
Опять-таки есть два варианта: или собирать самому из исходников с гитхаба, или взять готовые бинарники здесь. Ищем Windows 32 bit Package
, скачиваем, распаковываем в C:\mapnik-v2.2.0
.
У них есть довольно подробный мануал по установке в вики. Вкратце: добавить lib
и bin
директории мапника в PATH
, это раз. Создать новую системную переменную PYTHONPATH
и присвоить ей путь до C:\mapnik-v2.2.0\python\2.7\site-packages
, это два. Поставить этот vcredist, это три. Logoff-login.
Проверяем правильность установки:
C:\Users\red>python Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>import mapnik >>>
Возможные ошибки разобраны в вики. Но помимио этого стоит попробовать перенести пути до lib
и bin
в начало PATH
.
И генерим тестовые тайлы:
C:\Users\red>cd C:\mapnik-v2.2.0\demo\python C:\mapnik-v2.2.0\demo\python>python rundemo.py Pycairo not available... will render Cairo formats using alternative method 12 maps have been rendered in the current directory: - demo.png - demo256.png - demo64_binary_transparency.png - demo128_colors_hextree_no_alpha.png - demo_high.jpg - demo_low.jpg - demo.tif - demo.pdf - demo.ps - demo.svg - demo_cairo_rgb.png - demo_cairo_argb.png Have a look!
Почти всё.
Идём на гитхаб, находим библиотеку PROJ.4, находим бинарники: Prebuilt Win32 executables, DLL including NAD27 grid shift files
. Скачиваем, распаковываем (c:\proj
). В PATH
добавляем путь до bin
, в новую переменную PROJ_LIB
путь до nad
. Logoff-login.
Ещё немного.
Скачиваем скрипты для генерации тайлов из официального svn-репозитория, кладём в c:\mapnik
.
Далее, для работы скрипта нужны береговые линии и всякое такое. Для этого есть скрипт get-coastlines.sh
, однако он написан на баше и под Windows работать не будет. Но он довольно простой и короткий, поэтому просто повторим все действия ручками.
Скачиваем:
Распаковываем все архивы в директорию в c:\mapnik\world_boundaries
.
Последние приготовления. Идём в mapnik\inc
, файл settings.xml.inc.template
переименовываем в settings.xml.inc
.
Файл fontset-settings.xml.inc.template
в fontset-settings.xml.inc
.
Файл datasource-settings.xml.inc.template
в datasource-settings.xml.inc
и правим его:
<Parameter name="type">postgis</Parameter> <Parameter name="password">password</Parameter> <Parameter name="host">localhost</Parameter> <Parameter name="port">5432</Parameter> <Parameter name="user">postgres</Parameter> <Parameter name="dbname">gis</Parameter> <Parameter name="estimate_extent">false</Parameter>
Немного поправим скрипт generate_tiles.py
:
Блок на строке 193:
if __name__ == "__main__": home = os.environ['HOME'] try: mapfile = os.environ['MAPNIK_MAP_FILE'] except KeyError: mapfile = home + "/svn.openstreetmap.org/applications/rendering/mapnik/osm-local.xml" try: tile_dir = os.environ['MAPNIK_TILE_DIR'] except KeyError: tile_dir = home + "/osm/tiles/" if not tile_dir.endswith('/'): tile_dir = tile_dir + '/'
заменяем на
if __name__ == "__main__": try: mapfile = os.environ['MAPNIK_MAP_FILE'] except KeyError: print('MAPNIK_MAP_FILE env var not found! Use default.') mapfile = 'C:/mapnik/osm.xml' #Путь по-умолчанию try: tile_dir = os.environ['MAPNIK_TILE_DIR'] except KeyError: print('MAPNIK_TILE_DIR env var not found! Use default.') tile_dir = 'C:/tiles/' #Путь по-умолчанию if not tile_dir.endswith('/'): tile_dir = tile_dir + '/'
Указываем границы в которых будет производиться генерация тайлов (географические координаты прямоугольника):
На строке 213 перед
bbox = (-180.0,-90.0, 180.0,90.0) render_tiles(bbox, mapfile, tile_dir, 0, 5, "World")
пишем (в нашем случае Москвы)
bbox = (37.32, 55.57, 37.88, 55.92) render_tiles(bbox, mapfile, tile_dir, 17, 17, "Moscow") exit() #Для того, чтобы он не пошёл генерить карту мира
Указываем пути и запускаем генерацию тайлов:
C:\mapnik>generate_tiles.py
Процесс должен пойти.
Займёт от нескольких минут до недель (в случае всего мира и не самой мощной машины).
Ссылки
0. softwaresimian.com/2012/12/02/openstreetmap-osm-install-on-windows-part-i-the-database
1. switch2osm.org/serving-tiles/manually-building-a-tile-server
2. wiki.openstreetmap.org/wiki/PostGIS/Installation
3. wiki.openstreetmap.org/wiki/Osm2pgsql
4. wiki.openstreetmap.org/wiki/Creating_your_own_tiles
5. habrahabr.ru/post/144675
6. habrahabr.ru/post/203212
7. Русификация данных: habrahabr.ru/post/259141
ссылка на оригинал статьи http://habrahabr.ru/post/265329/
Добавить комментарий