Карты 2ГИС в OpenLayers

в 4:24, , рубрики: javascript, Maps API, openlayers, Веб-разработка, метки: , ,

Приветствую всех!

Хочу поделиться методом внедрения карт с сервиса 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


  1. M1M2:

    в параметрах слоя необходимо указать
    maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34),
    projection: “EPSG:900913”,

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js