Понедельник
06.05.2024, 05:40
Erna
Приветствую Вас Гость | RSS
Главная Каталог статей Регистрация Вход
Меню сайта

Категории раздела
Администрирование [17]
Програмирование [1]
Продвижение сайта [2]
Gentoo [4]

Поиск

Главная » Статьи » Администрирование

Собственный рендерер tile-карт (аналог OSM и тому подобного)

Сырая информация по теме:


http://wiki.openstreetmap.org/wiki/Tile_usage_policy
http://wiki.openstreetmap.org/wiki/Export
http://wiki.openstreetmap.org/wiki/Planet.osm
http://gis-lab.info/projects/osm_dump/index.html
http://tilecache.org/
http://wiki.openstreetmap.org/wiki/Ubuntu_tile_server

Приблизительный план действий
  • Скачать данные с OSM
  • Изучить какие есть сервера и рендереры
  • Поднять это дело на линуксе в виртуалке

Задача номер один - определиться с рендером. Нашла вот что http://switch2osm.org/serving-tiles/manually-building-a-tile-server/ - решила повторить у себя.

Немного теории. Тайл-сервер состоит из нескольких компонентов:

1 - mod_tile - модуль апача, служит для кэширования ячеек и решает надо ли рендерить эту ячейку (в случае если она новая или имеющаяся устарела)
2 - renderd - обеспечивает приоритет при массовой нагрузке, ответ при запросе и сглаживание нагрузки при большом количестве запросов
3 - mapnik - библиотека, которая осуществляет рендеринг и использется renderd-ом.
4 - osm2pgsql - импортирует данные OSM в базу postgreSQL
5 - postgresql/postgis - сервер базы данных

Последовательность обращений и взаимосвязи между компонентами такая:

Мы выкачали данные непосредственно с OSM - при помощи osm2pgsql перегнали скачанные данные (архив bz2 на самом дел) в базу (и сложили там). Затем при обращении через веб-морду к апачу он обращается к mod_tile, тот в свою очередь смотрит в свой кэш, смотрит есть ли уже данные и не устарели ли они. Если данные есть, то апач возвращает их из кэша, если нет, то лезет к renderd за данными. Renderd при помои библиотеки mapnik тянет данные из базы (по координатам точки и масштабу?) и данные из базы превращает в картинку.

А теперь все по полочкам, по пунктам, по порядку.

Ubuntu 10.04 Tekinsoft_tile_server2

  • Установка зависимостей для постгри:
tile@ubtail:~$ sudo apt-get install subversion git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev 
libgeos-dev libpq-dev libbz2-dev proj screen munin-node munin htop
  • Установка postgresql/postgis из репозитория убунты:
tile@ubtail:~$ sudo apt-get install postgresql-8.4-postgis postgresql-contrib-8.4 postgresql-server-dev-8.4
  • создание базы данных, вышли из суперюзера
tile@ubtail:~$ $ sudo -u postgres -i 
postgres:~$ createuser <username=tile> !yes for superuser role
postgres:~$ createdb -E UTF8 -O <owner=tile> <dbname=gis>
postgres:~$ createlang plpgsql gis
postgres:~$ exit
  • устанавливаем PostGIS на postgresql базу данных.

от обычного пользователя

tile@ubtail:~$ psql -f /usr/share/postgresql/8.4/contrib/postgis.sql -d gis

много сток оканчивающиеся

...
CREATE FUNCTION
COMMIT
...
DROP FUNCTION
  • Выдаем права на вновь созданную базу базу нашему пользователю (psql)
tile@ubtail:~$ psql -d gis -c "ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;" 
*tile$ (не должно быть никаких ошибок)*
  • Установка osm2pgsql из исходников
mkdir ~/src
cd ~/src
svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/
cd osm2pgsql
./autogen.sh
./configure
make
sudo make install 
psql -f /usr/local/share/osm2pgsql/900913.sql -d gis
  • Установка библиотеки Mapnik
  • зависимости
tile@ubtail:~$ sudo apt-get install libltdl3-dev libpng12-dev libtiff4-dev libicu-dev libboost-python1.40-dev python-cairo-dev 
python-nose libboost1.40-dev libboost-filesystem1.40-dev libboost-iostreams1.40-dev libboost-regex1.40-dev
libboost-thread1.40-dev libboost-program-options1.40-dev libboost-python1.40-dev libfreetype6-dev libcairo2-dev libcairomm-1.0-dev 
libgeotiff-dev libtiff4 libtiff4-dev libtiffxx0c2 libsigc++-dev libsigc++0c2 libsigx-2.0-2 libsigx-2.0-dev libgdal1-dev 
python-gdal imagemagick ttf-dejavu
  • установка из исходников
tile@ubtail:~/home$ mkdir ~/src
 cd ~/src
 git clone git://github.com/mapnik/mapnik
 cd mapnik
 git branch 0.7 origin/0.7.x
 git checkout 0.7

 python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/
 python scons/scons.py
 sudo python scons/scons.py install
 sudo ldconfig

Убедитесь что Mapnik стал коректно:

python
>>> import mapnik
>>>

Усли pyton ответил приглашением командной строки >>>> без ошибок, значит библиотека MApnik найдена питоном. Поздравляем!

  • Установка mod_tile и renderd
  • установка зависимостей
tile@ubtail:~$ sudo apt-get install apache2 apache2-threaded-dev apache2-mpm-prefork apache2-utils libagg-dev
  • собрать mod_tile из исходников
cd ~/src
svn co http://svn.openstreetmap.org/applications/utils/mod_tile
cd mod_tile
./autogen.sh
./configure
make
sudo make install
sudo make install-mod_tile
sudo ldconfig
  • Установка стилистической таблицы mapnik

следующее что нам надо сделать - это установить mapnik-tools которые включают в себя файлы дефолтного стиля и вспомогательные утилиты для рендерингаданных OSM Мапником

cd ~/src
svn co -r 27279 http://svn.openstreetmap.org/applications/rendering/mapnik mapnik-style

Mapnik uses prepared files to generate coastlines and ocean areas for small scale maps since it is faster than reading the entire database for this information. Downloading the coastline data requires about 400Mb of download.

cd ~/src/mapnik-style
sudo ./get-coastlines.sh /usr/local/share
  • Конфигурирование установленного ПО
  • настройка mapnik-style

Папка стилей по умолчанию ~/src/mapnik-style, там должна быть папка inc. Несколько файлов надо скапировать:

cd inc
cp fontset-settings.xml.inc.template fontset-settings.xml.inc
cp datasource-settings.xml.inc.template datasource-settings.xml.inc
cp settings.xml.inc.template settings.xml.inc
  • изменяем настройки в этих файлах:
  • файл settings.xml.inc

заменить

<ENTITY symbols "%(symbols)s">

на

<ENTITY symbols "symbols">

заменить

<!ENTITY osm2pgsql_projection "&srs%(epsg)s;">

на (в случае использования настройки по умолчанию 900913)

<!ENTITY osm2pgsql_projection "&srs900913;">

заменить

<!ENTITY dwithin_node_way "&dwithin_%(epsg)s;">

на (в случае использования настройки по умолчанию 900913)

<!ENTITY dwithin_node_way "&dwithin_900913;">

заменить

<!ENTITY world_boundaries "%(world_boundaries)s">

на (в случае использования настройки по умолчанию 900913)

<!ENTITY world_boundaries "/usr/local/share/world_boundaries">

заменить

<!ENTITY prefix "%(prefix)s">

на (в случае использования настройки по умолчанию 900913)

<!ENTITY prefix "planet_osm">

именно planet даже если только 1-на страна иначе не увидит базу
  • файл datasource-settings.xml.inc

В этом файле надо ввести настройки базы данных. Мы запускаем postgresql на той же машине что и рендер, поэтому надо

1 - закоментировать строки с параметрами "password”, "host” и "port” (стиль HTML <!-- -->). Это разрешит библиотеке mapnik использовать локального пользователя для аутентификации.

2 - изменить "dbname” с "%(dbname)s” на "gis”, "estimate_extent” на "false”, и "extent” на "20037508,-19929239,20037508,19929239"

Файл в итоге будет выглядеть приблизительно так:

<!--
Settings for your postgres setup.

Note: feel free to leave password, host, port, or use blank
-->

<Parameter name="type">postgis</Parameter>
<!-- <Parameter name="password">%(password)s</Parameter> -->
<!-- <Parameter name="host">%(host)s</Parameter> -->
<!-- <Parameter name="port">%(port)s</Parameter> -->
<!-- <Parameter name="user">%(user)s</Parameter> -->
<Parameter name="dbname">gis</Parameter>
<!-- this should be 'false' if you are manually providing the 'extent' -->
<Parameter name="estimate_extent">false</Parameter>
<!-- manually provided extent in epsg 900913 for whole globe -->
<!-- providing this speeds up Mapnik database queries -->
<Parameter name="extent">-20037508,-19929239,20037508,19929239</Parameter>
  • файл fontset-settings.xml.inc

Этот файл содержит настройки шрифтов и информацию как изменять настройки по умолчанию. Рекомендуется не изменять их сейчас.

  • настройка renderd

Исправляем настройки renderd изменив файл /usr/local/etc/renderd.conf таким образом: (помните что надо
заменить username именем вашего пользователя):

socketname=/var/run/renderd/renderd.sock 
plugins_dir=/usr/local/lib/mapnik/input
font_dir=/usr/share/fonts/truetype/ttf-dejavu
XML=/home/tile/src/mapnik-style/osm.xml
HOST=localhost

Create the files required for the mod_tile system to run (помните что надо
заменить username именем вашего пользователя):

sudo mkdir /var/run/renderd
sudo chown tile /var/run/renderd
sudo mkdir /var/lib/mod_tile
sudo chown tile /var/lib/mod_tile
  • настройка mod_tile

Теперь мы должны сообщить веб серверу о том что mod_tile установлен, создав файл /etc/apache2/conf.d/mod_tile следующего содержания:

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

Кроме этого апачевский конфигурационный файл сайта по умолчанию должен быть изменен для того, чтобы включить туда настройки mod_tile. Исправляем файл /etc/apache2/sites-available/default, добавляем туда следующие строки, сразу после e-mailа администратора:

LoadTileConfigFile /usr/local/etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30
  • Усовершенствуем нашу сисстему:

A tile server can put a lot of load on hard- and software. The default settings may therefore not be appropriate and
a significant improvement can potentially be achieved through tuning various parameters.

  • postgresql

Дефолтная конфигурация для PostgreSQL 8.4 нуждается в усовершенствовании под те данные которые мы собираемся использовать.
Исправляем файл /etc/postgresql/8.4/main/postgresql.conf следующим образом:

shared_buffers = 128MB
checkpoint_segments = 20
maintenance_work_mem = 256MB
autovacuum = off

Эти изменения требуют изменений в настройках ядра, которые войдут в действие после рестарта сисемы. Правим файл
под рутом /etc/sysctl.conf добавляем следующие строки в начале файла, после других настроек ядра "kernel”:

# Increase kernel shared memory segments - needed for large databases
kernel.shmmax=268435456

Перезагружаем компьютер, запускаем следующую команду:

sudo sysctl kernel.shmmax

и убедитесь что результат таков: 268435456.

mkdir belarus
cd belarus
wget http://download.geofabrik.de/osm/europe/belarus.osm.bz2
  • Импортировать данные в базу

с помощью конвертирующей тулзины. Следующая команда встатвит данные OSM которые мы скачали в базу. Это долго особенно если
конвертировать всю планету.

tile@ubtail:~$osm2pgsql --slim -d gis -C 1024 ~/belarus/belarus.osm.bz2
Completed planet_osm_polygon
Completed planet_osm_line
Stopped table: planet_osm_ways

Osm2pgsql took 86400s overall

The number of nodes, ways and relations processed will obviously differ by the size of the data extract you are using and the
date of the data dump. The numbers shown here are not reflective of the full planet import, which is substantially larger.

  • Запуск тайлсервера

Now that everything is installed, set-up and loaded, you can start up your tileserver and hopefully everything is working. We’ll
run it interctively first, just to make sure that everything’s working properly:

Теперь когда все установлено, настроено и загружено, мы можем запустить свой тайлсервер и надеятся что все работает. Первый запуск будет в интерактивном режиме - чтобы видеть все ошибки.

sudo mkdir /var/run/renderd
sudo chown tile /var/run/renderd
renderd -f -c /usr/local/etc/renderd.conf

И в другом сеансе:

sudo /etc/init.d/apache2 restart

Если есть к-л FATAL errors вам надо дважды проверить правильно ли вы делали все то что описано ранее.

Если нет, попробуйте загрузить http://yourserveraddress/osm_tiles2/0/0/0.png для того чтобы увидеть маленькую карту мира.

Если сработает, вы можете остановить интерактивный renderd и настроить его для автоматической загрузки как демона.

sudo cp ~/src/mod_tile/debian/renderd.init /etc/init.d/renderd
sudo chmod u+x /etc/init.d/renderd

Исправте /etc/init.d/renderd от root:

DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="-c /usr/local/etc/renderd.conf" 

Еще вы должны изменить ссылки к www-data здесь должен быть ваш пользователь tile – измените "www-data”
так же как вы "username” в других файлах.

do_start()
{
 mkdir -p /var/run/renderd
 chown tile:tile /var/run/renderd
 # Return
 # 0 if daemon has been started
 # 1 if daemon was already running
 # 2 if daemon could not be started
 start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid tile --exe$
 || return 1
 start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid tile --exe$
 $DAEMON_ARGS \
 || return 2 я

Теперь вы можете запустить mapnik следующе командой:

sudo /etc/init.d/renderd start

а остановить:

sudo /etc/init.d/renderd stop

Теперь лог пишется в /var/log/daemon.log вместо терминала.

Добавте ссылку в интерактивную стартовую папку, для того чтобы он стартовал автоматически:

sudo ln -s /etc/init.d/renderd /etc/rc2.d/S20renderd

теперь перезагрузите сервре и заййдите на http://yourserveraddress/osm_tiles2/0/0/0.png все должно заработать!
Также вы можете зайти на страницу http://yourserveraddress/mod_tile которая отображает некоторую статистику вашего tileserver.

Для настройки OpenLayers (http://wiki.openstreetmap.org/wiki/HowTo_mod_tile)

Возможно вы хотите настроить дефолтную карту:

sudo nano /var/www/map.html

скрипт для OpenLayers:

<html> 
 <head> 
 <title>OpenLayers Demo</title>
 <style type="text/css">
 html, body, #basicMap {
 width: 100%;
 height: 100%;
 margin: 0;
 }
 </style>
 <script src="http://www.openlayers.org/api/OpenLayers.js"></script>
 <script>
 function init() {
 var options = {
 projection: new OpenLayers.Projection("EPSG:900913"),
 displayProjection: new OpenLayers.Projection("EPSG:4326"),
 units: "m",
 maxResolution: 156543.0339,
 maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34,
 20037508.34, 20037508.34),
 numZoomLevels: 20,
 controls: [
 new OpenLayers.Control.Navigation(),
 new OpenLayers.Control.PanZoomBar(),
 new OpenLayers.Control.Permalink(),
 new OpenLayers.Control.ScaleLine(),
 new OpenLayers.Control.MousePosition(),
 new OpenLayers.Control.KeyboardDefaults()

 ]
 };
 map = new OpenLayers.Map("basicMap",options);
 var newL = new OpenLayers.Layer.OSM("Default", "/osm_tiles2/${z}/${x}/${y}.png", {numZoomLevels: 19});
 map.addLayer(newL);
 map.zoomIn();
 }
 </script>
 </head>
 <body onload="init();">
 <div id="basicMap"></div>
 </body>
</html>

Теперь проверте работате ли она (скрестите пальцы!):

http://YOURSERVER/map.html

Можно скачать скрипт (http://www.openlayers.org/api/OpenLayers.js) и положить локально рядом с map.html, указать путь <script src="/var/www/OpenLayers.js"></script> (или просто <script src="OpenLayers.js"></script>)

дополнение:

<osm cache="osm_local" width="640000" height="640000" maxzoom="18"> <urls> <url>http://192.168.240.26/osm_tiles2/%d/%d/%d.png</url> </urls> </osm>


Источник: http://switch2osm.org/serving-tiles/manually-building-a-tile-server/
Категория: Администрирование | Добавил: Erna (10.07.2013)
Просмотров: 5768 | Теги: Manual, modtile, tile, Ubuntu 10.04, OSM, mapnik, render
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Тэги
установка console cmd Command Joomla Manual Far hot keys cms Turbo Pascal интернет-магазин ИП регестрация ИП хостинг Latex резюме Windows regedit task meneger FastReport XP для чайников Kubuntu redmine backup mysql пренос базы Ubuntu route Gentoo TightVNC root skype Ubuntu 10.04 Proxy server Ubuntu proxy Ubuntu proxy server при наличии дву Убунту прокси-сервер для двух прова nginx web-server веб-сервер Ubuntu-nginx веб-сервер своими руками сайт-визитка свой веб-сервер MC пользовательский минимум openSUSE inslall VMware trouble install Linux mageia 2 mapnik modtile OSM render tile

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Copyright MyCorp © 2024