GIS-LAB

Географические информационные системы и дистанционное зондирование

Использование WMS MapServer в Google Maps

Краткая аннотация

Обсудить в форуме Комментариев — 0

В отличие OpenLayers, специально предназначенного на работу с данными получаемых с других серверов, программный интерфейс (API) к Google Maps по умолчанию не поддерживает работу с WMS слоями, что очень неудобно. Так же, Google Maps не предоставляет возможности использовать свои данные через WMS. К счастью, есть способ "научить" API Google Maps работать с WMS слоями, например поставляемыми с помощью MapServer.

Создание WMS сервиса на базе Mapserver подробно рассматривается в специальной статье. Для работы с основой Google понадобится небольшая модификация, которую мы обсудим после описания примера javascript-скрипта показывающего слой WMS на Google Maps.

Альтернативой предложенному подходу является использоваться OpenLayers, предоставляющего удобный интерфейс для использования данных сервисов Google, самостоятельных слоев векторных и растровых данных и слоев WMS. Недостатком данного подхода является необходимость загрузки дополнительной библиотеки и использования OpenLayers API вместо Google API, что не всегда удобно. Данный способ не противоречит лицензионному соглашению с Google, так как использование сервисов реализовано через Google Maps API.

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

Код для Google Maps

Получение фрагментов

Следующий код целиком можно посмотреть в исходном коде этой страницы, подробности использования Google Maps на страницах своего сайта рассматриваются в специальной статье и подразумевается, что читатель с ними знаком. Если это не так, то рекомендуем сначала ознакомиться с ней.

Итак, "трюк" с наложением слоя WMS состоит из двух частей. Создадим новый слой типа GTileLayer и GCopyrightCollection, расширенные интерфейсы Google Maps API, предназначенные для наложения пользовательских изображений, таких как копирайты. Как видно, в примере, одним из главных параметров, передаваемых этому слою является адрес нашего сервиса WMS, созданного заранее.

var tile= new GTileLayer(new GCopyrightCollection(""),1,17);
tile.myLayers='WMS';
tile.myFormat='image/png';
tile.myBaseURL='http://gis-lab.info/cgi-bin/wmsworld?';
tile.getTileUrl=CustomGetTileUrl;

После указания некоторых дополнительных параметров, URL каждого фрагмента слоя с помощью фукнции CustomGetTileUrl. Эта функция содержится в специальной программе на javascript, созданной John Deck. Разумеется, нужно не забыть подключить этот javascript:

<script src="wms236.js" type="text/javascript"></script>

Этот скрипт предназначен для формирования с помощью javascript специальных запросов к WMS серверам с учетом системы координат, неоходимой для правильного показа данных в Google Maps. Если взглянуть на фрагмент генерируемого запроса, то можно увидеть, что представляет собой URL с некоторыми параметрами (выдержка из скрипта):

var lURL=this.myBaseURL;
lURL+="&REQUEST=GetMap";
lURL+="&SERVICE=WMS";
lURL+="&VERSION=1.1.1";
lURL+="&LAYERS="+this.myLayers;
lURL+="&STYLES="+this.myStyles;
lURL+="&FORMAT="+this.myFormat;
lURL+="&BGCOLOR=0xFFFFFF";
lURL+="&TRANSPARENT=TRUE";
lURL+="&SRS="+lSRS;
lURL+="&BBOX="+lBbox;
lURL+="&WIDTH=256";
lURL+="&HEIGHT=256";
lURL+="&reaspect=false";

Пример подобного запроса в полном виде будет выглядеть следующим образом:

http://gis-lab.info/cgi-bin/wmsworld?&REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=WMS&STYLES=&FORMAT=image/png&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&SRS=EPSG:54004&BBOX=-10018754.017583234,0.05233327391523142,0,9979519.992591204&WIDTH=256&HEIGHT=256&reaspect=false

Вот что получится, если открыть эту ссылку с помощью браузера:

Результаты запроса возвращаются в GTileLayer блоками определенного размера в системе координат Google Maps.

Настройка кнопок

Помимо стандартного подключения и кода API, так как мы хотим, чтобы загружаемый через WMS слой был наложен на все 3 основные карты Google (map, hybrid, landscape), нам понадобится сначала очистить список типов карт.

map.getMapTypes().length = 0;

А зачет создать новые кнопки, использующие кроме основных слоев еще и наш свеже подключенный слой WMS.

var layer=[G_NORMAL_MAP.getTileLayers()[0], tile];
var G_NORMAL_MAP_CUSTOM = new GMapType(layer, G_NORMAL_MAP.getProjection(), "C-Map", G_NORMAL_MAP);
map.addMapType(G_NORMAL_MAP_CUSTOM);

var layer=[G_PHYSICAL_MAP.getTileLayers()[0], tile];
var G_PHYSICAL_MAP_CUSTOM = new GMapType(layer, G_SATELLITE_MAP.getProjection(), "C-Topo", G_PHYSICAL_MAP);
map.addMapType(G_PHYSICAL_MAP_CUSTOM);

var layer=[G_SATELLITE_MAP.getTileLayers()[0], tile];
var G_SATELLITE_MAP_CUSTOM = new GMapType(layer, G_SATELLITE_MAP.getProjection(), "C-Space", G_SATELLITE_MAP);
map.addMapType(G_SATELLITE_MAP_CUSTOM);

Тонкости настройки завершены, стандартные функции по добавлению элементов управления можно подчерпнуть из статьи по использованию Google Maps на своем сайте или в исходном коде этой страницы.

Модификация map-файла

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

Настройка Proj

Находим файл кодов EPSG используемый Proj для хранения описаний систем координат, который также использует MapServer, он может храниться например здесь: /usr/local/share/proj/epsg. Добавляем в него новую систему координат:

# Google Mercator
<54004> +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0
+ellps=WGS84 +datum=WGS84 +units=m no_defs <>

Эта строка — структурированная информация о системе координат, включающая проекцию (merc — меркатор), эллипсоид (WGS84), единицы измерения (метры) и другие параметры. Такой вид описания — стандарт описания системы координат в PROJ, системе работы с проекциями и СК. Запоминаем код 54004 и переходим к редактированию wms.map.

Настройка сервиса WMS

В MapServer сервис созадется и конфигурируется посредством файла map. Подробно о создании сервиса WMS рассказывается в отдельной статье, нам же понадобится всего-лишь добавить в раздел описаний отдаваемых MapServer систем координат нашу свежепрописанную систему 54004.

LAYER
    ....
	METADATA
		wms_title "world"
		wms_abstract "world test"
		wms_srs "EPSG:4326 EPSG:54004"
		wms_include_items "all"
	END
END

Сервис может "отдавать" данные сразу в нескольких системах координат, в зависимости от того, что запрашивается клиентом WMS, поэтому добавление никоим образом не скажется на работоспособности сервиса в другом клиентском ПО.

Результат

Пример подобной реализации можно увидеть ниже. В этом примере сервис WMS MapServer содержащий один слой - границы стран показывается поверх основы Google Maps.

 

Обсудить в форуме Комментариев — 0

Последнее обновление: March 14 2011

Дата создания: 11.01.2009
Автор(ы): Максим Дубинин


(Геокруг)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter