понедельник, 17 марта 2008 г.

Картографические приложения с помощью библиотеки OpenLayers

Гора не сходится с горой,
Но жизнь свершает круг,
И старый недруг нам порой
Милей, чем новый друг.
Вадим Шефнер
"Лачуга должника"


Некоторое время тому назад мы уже знакомились с технологией создания картсервера с помощью одноименного приложения mapserver. И все было хорошо - великолепная отрисовка множества векторных и растровых слоев, работа с разнообразными проекциями и источниками данных. Пользовательских интерфейсов для mapserver тоже хватает - и на яваскрипт, и флэшовые, и на ява-аплетах, не говоря уже про простой хтмл. Сложность только одна - где бы взять необходимые нам векторные данные, широко доступное изобилие которых наблюдается на территории западных стран? Вот эта мелочь и является камнем преткновения. Ну еще чисто технические сложности - нужны подготовленные к публикации данные, файл проекта с описанием свойств карты и всех слоев (map-файл), что в общем тоже требует много времени. Сегодня мы поговорим о решениях для бизнеса - есть у нас задача по визуализации сети торговых точек, или трэков со спутниковых навигаторов или... Рассмотрим прикладной аспект - есть данные с географической привязкой, которые надо отобразить на карте и как можно меньше заморачиваясь на саму карту и все с ней связанное. Бизнес сегодня успешно глобализуется, так что карты города уже мало, нужно работать как минимум с картой региона, а то и страны или картой всей планеты. да и деловая жизнь все ускоряется - пользователю необходим простой и вместе с тем функциональный и надежный инструмент. И такой инструмент уже есть, нужно лишь научиться с ним обращаться.

Начнем с постановки задачи: требуется полнофункциональный кроссплатформенный и веб-ориентированный интерфейс (ajax), работа с картой должна быть быстрой и не заставлять ждать загрузки очередной карты и не нагружать сервер даже при одновременной работе многих пользователей (растровая мозаика), а также возможность отображать и изменять произвольные векторные данные (асинхронная подгрузка данных в форматах kml,georss,wkt). Все это доступно при использовании клиентской библиотеки OpenLayers, которая на самом деле умеет намного больше. Но сегодня мы не будет интересоваться интеграцией своих карт с картами гугл и работой с mapserver (да, можно и его карты использовать, да еще и разными способами - как запрашивая через cgi-интерфейс нужные картинки и метаинформацию, так и взаимодействуя со встроенными WMS/WFS серверами), а ограничимся самым простым и эффективным решением нашей задачи.

Вот пример, иллюстрирующий использование растровой подложки для интерактивного отображения так называемых "точек интересов" (POI). Элементы мозаики, на которые разделен растр, являются обычными статичными изображениями, и их может эффективно публиковать практически любой веб-сервер (aolserver, nginx, lighttpd, thttpd, etc.) и кэшировать прокси-сервер и сам браузер пользователя. Таким образом, достаточно любого хостинга и нет требований к ресурсам сервера (разве что к объему жесткого диска, но в наше время терабайтных винчестеров карта размером в сотни мегабайт кажется сущей безделицей). Отображение точек интересов происходит интерактивно - при переходе к просмотру очередной части карты отправляется асинхронный запрос к серверу на получение файла со списком нужных объектов для отображаемых квадрантов карты. Этот файл может быть как статическим, так и динамическим - в любом случае его размер обычно невелик по сравнению с размером растровой подложки карты. Работая с сервером в локальной сети или через прокси можно комфортно перемещаться по карте и масштабировать ее, не тратя время на ожидание загрузки данных.

Для любознательных - протестировав отрисовку разных наборов данных (точки, линии, полигоны) я убедился в том, что в течении секунды успевают отрисоваться объекты из многих тысяч точек, так что отображение векторной информации в браузере пользователя не мешает работе. Притом используемый мною браузер Iceweasel (Mozilla Firefox) 2.0.0.11 далеко не самый быстрый на сегодня.

Множество примеров доступно на официальном сайте проекта OpenLayers, там же можно скачать как саму библиотеку, так и примеры.

Замечу еще, что работа с проецированными растрами поддерживается, хотя немного странно, проще всего работать в системе координат EPSG:41001. Для построения пирамиды из растра (файл привязки не обязателен) можно воспользоваться утилитой GDAL2Tiles Project.

Код на яваскрипт для клиентской части занимает одну-две страницы, так что подробно на этом останавливаться смысла не вижу, тем более, что примеров много и они работают :-)

Комментариев нет:


(C) Alexey Pechnikov aka MBG, mobigroup.ru