суббота, 16 июня 2007 г.

Mapserver: движок для публикации растровых и векторных карт

В последний год замечаю значительный интерес к работе с GPS приемниками, электронным картам и сопутствующим вопросам. Тем не менее, информация в сети на эти темы очень скудна, а то, что есть, далеко не полно и многократно дублируется. Все это навело меня на мысль опубликовать собственные наработки за несколько лет, благо материалов накопилось немало. Мною выполнены такие проекты, как разработка картсервера и спутниковой навигационной системы для ГУВД Нижнего Новгорода (лично представлял в рамках проекта "Дозор-Антитеррор" в ГУВД), работа с фондом имени Бортника по программе "Старт", разработка мобильного клиента (мидлета) для просмотра карты и поиска объектов на сотовом телефоне (разработка была показана в местных новостях по инициативе компании Мегафон в рамках выполненного для них проекта по передаче видео на сотовый телефон через сеть EDGE/GPRS) и другие. В проектах участвовали и другие люди, но я всегда был ведущим разработчиком и единственным специалистом по ГИС и готовил отчеты, так что если я не расскажу об этих технологиях, все так и забудется. Коммерческого успеха эти проекты не принесли, то ли ментальность людей в Нижнем Новгороде "совковская", то ли вся Россия такая, но тем не менее, проекты были выполнены, долгое время работали, но за ненужностью были отключены. Разве что в ГУВД картсервер действует до сих пор, но мне это уже не интересно. Время от времени я переписываю "движок" картсервера, поскольку я и мои друзья продолжаем пользоваться собственным вьювером для просмотра карты Нижнего Новгорода и области. За актуальные и подробные карты "для некоммерческого использования" большое спасибо Дурандину Андрею Витальевичу. Единственные карты Нижнего Новгорода и области, которые удовлетворяют мировым стандартам (корректная топология, наличие классификатора атрибутивной информации, формат шейпфайлов) и могут быть загружены в модуль PostGIS... Итак, сначала введение и переводная документация, а потом поделюсь собственными "рецептами" и программами.

Существует множество ГИС, набор их функций бывает как очень скромным (узкоспециализированные проекты), так и совершенно необъятным (GRASS, ESRI ArcInfo, etc.). Но у всех систем есть отличительное свойство - они ориентированы на анализ данных и предоставление результатов в различных видах, но не на электронную публикацию интерактивных карт. И когда появляется задача опубликовать готовую карту в Интернет или Интранет, приходится или смириться с примитивным оформлением или искать другой способ публикации. В этом случае на помощь приходит программный продукт mapserver, который способен не только быстро отобразить векторную, растровую или гибридную карту, но и сделать это красиво. Благодаря полной поддержке шейпфайлов (shapefiles) и интеграции с PostGIS возможен и различного рода пространственный анализ, который позволяет идентифицировать объект на карте, проводить поиск по атрибутам и многое другое, притом, что слои карты могут быть в разных проекциях или без нее. За последние два-три года изменений в mapserver довольно мало, он стабильно работает и имеющихся функций вполне достаточно. Для желающих увеличить функциональность есть модули mapserver для различных языков (например, tcl, python, perl, php). Интеграция с java и платформой .net также присутствует, но о работе mapserver с этими технологиями я вам ничего не расскажу, не пробовал.

Предлагаю Вашему вниманию часть документации, переведенной на русский язык. Перевод я делал 3 года назад, тем не менее, эта информация актуальна и сегодня. Переводил далеко не все материалы, так как в свое время в очень сжатые сроки прочитал больше 1000 страниц англоязычной документации (из них 500 страниц за 1 день), переводить все просто не было времени, к тому же в те времена никто этим проектом не интересовался и не знал о нем. Да и потом много времени занимал поиск различных нетривиальных моментов в форумах и рассылке проекта. Тем не менее, если читатели будут заинтересованы в каких-то разделах документации, переведу. Также расскажу о различных тонкостях, таких, как работа с mapserver из разных языков программирования, наборах символов, проекциях, оптимизации и прочем. Если что интересно, пишите, у меня много исходников накопилось за 3 или 4 года работы с mapserver, разбираться в них долго, да и нужно ли, так что буду ориентироваться на комментарии читателей.


Mapserver: быстрый старт (перевод)

Mapserver: растры (перевод)

Обзоры в интернет

Для интересующихся приведу ссылки на некоторые русскоязычные обзоры mapserver, благо они появились (наконец-то!). Приведу только русскоязычные статьи/проекты, поскольку в России своя специфика и свои проблемы, с которыми никогда не сталкиваются за рубежом (например, отвратительное состояние всех картографических материалов, которые язык не повернется назвать spatial dataset). Также будет полезным сравнение с ArcIMS, коммерческим аналогом от компании ESRI. От себя замечу, что продукты несколько различаются по своей направленности - ArcIMS предназначен для пользователей платформы ESRI ArcGIS и позволяет легко и быстро опубликовать данные, накопленные в рамках этой платформы, в то время как mapserver нацелен на публикацию разнородных данных, в силу чего требует больше времени и усилий (понятно, что уже подготовленные данные опубликовать несравнимо проще, чем сборную "солянку"). Этот момент в сравнениях часто не учитывают, что приводит новичков в недоумение - часто звучит вопрос, почему в mapserver нельзя сделать все так же просто, как и в ArcIMS. Кстати, если у Вас есть данные, уже обработанные в ESRI ArcGIS или ArcView, можно воспользоваться скриптом к ArcView, который по настройкам проекта создаст конфигурационный файл mapserver.

Вот простое сравнение mapserver и ArcIMS:
Создание картографических сервисов с использованием ArcIMS. Введение.
Создание картографических сервисов с использованием MapServer. Введение.

Вот здесь можно почитать об открытых стандартах в области ГИС, которые разрабатывает и продвигает OGC (Open GIS consortium):
Классификация картографических веб-сервисов OGC

Довольно интересная презентация, по уровню не уступает англоязычному оригиналу, плюс авторы рассказали о российской специфике, рекомендую прочитать всем:
phpConf 2007 - слайды MapScript и MapServer


Продолжение следует...

3 комментария:

Анонимный комментирует...

Побольше бы таких блогов) Занес в избранное

Анонимный комментирует...

Уважаемый Алексей! Сейчас занимаюсь разработкой сервиса с помощью MapServer и испытываю острый недостаток в примерах. Больше всего сейчас интересует реализация поиска объекта на карте по критериям (по названию, например) и загрузка фото при нажатии на какой-либо объект (через поле в атрибутивной таблице). Если среди Ваших накопленных примеров есть что-нибудь подобное, большая просьба выслать на адрес lioness535@ya.ru. Заранее спасибо!:-)))

Печников Алексей комментирует...

Если хранить данные в Spatialite или PostGIS, то поиск делается обычными SQL-запросами. Примеров в сети множество, стоит начать с архивов рассылки mapserver-а.

Загрузка фотографии и вовсе к карте отношения не имеет - выполняете идентификацию выделенного элемента, а дальше дело техники. Вот пример идентификации объекта при отрисовки карты из шейпов:
http://mobigroup.ru/files/mapserver/mapinfo.pyОтрисовка карты может выглядеть, к примеру, так:
http://mobigroup.ru/files/mapserver/mapdraw.py


(C) Alexey Pechnikov aka MBG, mobigroup.ru