Встраивание кэширующего TMS-сервиса в собственное приложение

Материал из GIS-Lab
Версия от 09:13, 17 июля 2013; Denis Rykov (обсуждение | вклад) (Новая страница: «{{Статья|Черновик}} {{Аннотация|Рассмотрена процедура встраивания TileCache в собственное при…»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


Рассмотрена процедура встраивания TileCache в собственное приложение, а также приведет пример создания кэша на базе PostgreSQL.

Введение

Предположим, что вы разрабатываете клиент-серверную Веб-ГИС и вам требуется отображать на клиенте некоторую растровую подложку, которая создается на базе данных хранилища (БД), к которому имеет доступ серверная компонента. Стандартным решением подобной задачи является опубликование данных по протоколу TMS и подключение их на клиенте. TMS-сервис может функционировать в одном из двух режимов: статическом и динамическом. И если вы планируете в дальнейшем тиражировать свое приложение, то использование статического TMS будет заключаться либо в предварительном создании набора тайлов (в случае, если данные, на основе которых будет создаваться TMS-слой, одинаковы для всех инсталляций приложения, например, данные о государственных границах) и распространении их вместе с приложением (что может привести к недопустимому росту размера приложения), либо в предоставлении пользователю инструмента по генерированию тайлов "на месте". Последний вариант в принципе не плох, но его недостаток заключается в том, что пользователю для того чтобы начать работать с вашим приложением потребуется время на заполнение кэша (может занимать от нескольких часов до нескольких дней). Выходом из данного положения служит использование динамического TMS-сервиса, генерирующего тайлы по запросу. И тут возникает проблема. Существующее ПО для создания динамических TMS-сервисов (TileCache, MapProxy) является самостоятельным программным обеспечением и изначально не предназначено для использования в качестве встраиваемых решений. Использовать же MapProxy или TileCache по их прямому назначению в данном случае - не вариант, так как это сводится к тому, что пользователь должен помимо установки вашего приложения установить и настроить тайловый сервер, что может оказаться ему не под силу, да и это очень неудобно. Поэтому решение данной задачи сводится к написанию собственного TMS-сервиса и интеграции его в приложение. Пример решения подобной задачи был рассмотрен в статье Основы работы динамических TMS-сервисов, но основным недостатком получившегося там сервиса является то, что он не поддерживает процедуру кэширования, что очень важно при разработке реального приложения.

В рамках данной статьи рассмотрим создание кэширующего TMS-сервиса на базе классов, предоставляемых TileCache. В качестве рендерера будем использовать - Mapnik. TileCache был выбран в качестве базовой системы в виду того, что он имеет довольно простую и понятную архитектуру в отличие от того же MapProxy, хотя по функционалу в целом значительно уступает последнему.

В качестве языка программирования будем использовать Python, операционная система - Debian GNU/Linux 7.0.

Создание каркаса приложения

Во избежание написания большого количества служебного кода в качестве каркаса нашего приложения будем использовать Веб-фреймворк Pyramid.

Создание каталога будущего проекта

mkdir ~/cache
cd ~/cache

Создание виртуального окружения

virtualenv --no-site-packages env

Установка Pyramid

source env/bin/activate
pip install pyramid

Генерирование структуры проекта

pcreate -s alchemy cache

В файл ~/cache/cache/setup.py в массив requires к имеющимся пакетам добавляем имена пакетов, которые будут использоваться в нашем проекте: psycopg2 и TileCache.

Установка проекта в режиме разработки

cd cache
python setup.py develop

Установка Mapnik

Идейно верное решение - это указать Mapnik как зависимость в файле setup.py для его автоматической установки, но на практике установка Mapnik в виртуальное окружение представляет собой довольно сложную задачу, поэтому для перехода к следующему шагу установите Mapnik в систему, после чего сделайте симлинк на директорию с Python-пакетами виртуального окружения. Для того, чтобы узнать, куда был установлен Mapnik, запустите системный Python и выполните следующие команды:

import mapnik
mapnik.__file__
'/usr/lib/python2.7/dist-packages/mapnik/__init__.py'

Как можно видеть, в нашем случае Mapnik был установлен в каталог /usr/lib/python2.7/dist-packages/mapnik. Находясь в активном виртуальном окружении, создаем симлинк:

ln -s /usr/lib/python2.7/dist-packages/mapnik $VIRTUAL_ENV/lib/python2.7/site-packages/mapnik

Теперь, если запустить Python в виртуальном окружении и дать команду:

import mapnik

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