Краткая аннотация
В отличие 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 на страницах своего сайта рассматриваются в специальной статье и подразумевается, что читатель с ними знаком. Если это не так, то рекомендуем сначала ознакомиться с ней.
Итак, "трюк" с наложением слоя 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 на своем сайте или в исходном коде этой страницы.
Перед тем как насладиться результатом, необходимо правильно сконфигурировать системы координат нашего сервиса WMS и программы работающей с системами координат, которой конечно является 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.
В 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
Последнее обновление: January 16 2009
Открытые настольные ГИС: обзор текущей ситуации 
Матрица ошибок и расчет показателей точности тематических карт 
Географическая привязка данных в QGIS: пример привязки топокарты по сетке 
© GIS-Lab и авторы, 2002-2009. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна.
горячие туры голландия; Как заслужить уважение к себе: тренинги общения. Университет Риторики.; куплю электрощитовое оборудование но выгодной цене; dr web 4.44 2; Новые флеш игры онлайн; видео видео