Приветствую всех!
Хочу поделиться методом внедрения карт с сервиса 2ГИС в OpenLayers. И сразу пример.
Совсем недавно сам озадачился таким вопросом и «прогуглив» интернет не нашел ответа. Метод осуществляет прямой запрос тайлов с сервера 2ГИС не используя их API, не буду в статье рассуждать о правомерности этого способа (можно в коментах это обсудить...).
Начнем…
Заготовка для карты, html файл
Для начала нужно подготовить HTML файл, в который будет встроен объект OpenLayers, отвечающий за отображение карт (OpenLayers поддерживает встраивание карт в любой блочный элемент html-кода). Кроме этого, в текст странички нужно вставить тег со ссылкой на скрипт из библиотеки OpenLayers:
<html>
<head>
<title>2ГИС в OpenLayers</title>
<script src="http://openlayers.org/api/OpenLayers.js"></script>
</head>
<body>
<div style="width:100%; height:100%" id="map"></div>
</body>
</html>
Пишем javascript, отображающего карту
Смотрите в комментариях пояснения кода
var options = {
// задаем проекцию, широта/долгота (epsg-код: 4326)
projection: "EPSG:4326",
// количество уровней зума
numZoomLevels: 18,
};
//создаем объект карты
map = new OpenLayers.Map( 'map' , options);
//создаем слой из тайлкеша 2ГИС
var wgis = new OpenLayers.Layer.TMS(
"wgis",
"http://tile0.maps.2gis.com/tiles?", //путь к кешу
{
name: "w2gis",
type: 'png', getURL: getTileURL, //getTileURL - функция ниже...
displayOutsideMaxExtent: true,
isBaseLayer: true
}
);
//добавляем слой на карту
map.addLayer(wgis);
//устанавливаем отображение на максимальный зум
map.zoomToMaxExtent();
// функция возвращает координаты тайла на сервере 2ГИС
function getTileURL(bounds) {
var res = this.map.getResolution();
var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
var z = this.map.getZoom();
var limit = Math.pow(2, z);
x = ((x % limit) + limit) % limit;
return this.url + "x=" + x + "&y=" + y + "&z=" + z+"&v=3";
}
Ну вот в принципе и все, надеюсь этот метод будет кому нибудь полезен.
Автор: dobeer
в параметрах слоя необходимо указать
maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34),
projection: “EPSG:900913”,