Клуб API Карт

Использование layer notFoundTile

Пост в архиве.

Доброго дня

 

прежде всего хочу поблагодарить разработчиков - то что сделан выбор проекции - это супер и решает многие проблемы (раньше приходилось делать карту прозрачной и подкладывать другую карту под div) теперь все просто и работает хорошо.

 

Мой вопрос: что писать в notFoundTile ?

 

У меня есть два источника тайлов, пусть я хочу что бы на карте использовался второй, но в лучае если тайла там нет, то он брался из первого (в примере пара источников для osm). Что нужно написать вместо знаков вопроса?

 

var layerOSM = function() {

        return new ymaps.Layer('http://tile.openstreetmap.org/%z/%x/%y.png', {

            projection: ymaps.projection.sphericalMercator

        }

    };

 

var layerOSMhike = function() {

        return new ymaps.Layer('http://toolserver.org/tiles/hikebike/%z/%x/%y.png', {

            projection: ymaps.projection.sphericalMercator,

notFoundTile: ?????????

        }

    };

4 комментария
Sergey Konstantinov
28 января 2016, 04:39

как-то так:

var NotFoundTileClass = function (url, options, priority) {

          url = url.replace('tile.openstreetmap.org', 'toolserver.org');

          NotFoundTileClass.constructor.call(this, url, options, priority);

      };

ymaps.util.augment(NotFoundTileClass, ymaps.layer.DomTile);

и передать этот класс в значение опции notFoundTile.

а если структура адресов тайлов будет разной - как быть?

то есть url = url.replace('tile.openstreetmap.org', 'toolserver.org'); не всегда ведь подойдет

нельзя в этой функции как-то использовать те же %x %y %z ??


спасибо за пример

Sergey Konstantinov
28 января 2016, 04:39

Ну, если всё делать правильно, то вот так:

// Класс OSM-тайла

var OSMTileClass = function (tile,options, priority) {

         this.superclass.constructor.call(

              'http://tile.openstreetmap.org/' + tile.z + '/' + tile.x + '/' + tile.y + '.png',

         options, priority)

     };

ymaps.util.augment(OSMTileClass, ymaps.layer.DomTile);

// класс вашего тайла

var MyTileClass = function (tile,options, priority) {

 

         this.superclass.constructor.call(

 

              'http://toolserver.org/' + tile.z + '/' + tile.x + '/' + tile.y + '.png',

 

         options, priority)

 

     };

 

ymaps.util.augment(MyTileClass, ymaps.layer.DomTile);

 

// Класс контейнера тайлов

var MyTileContainer = function (layer, options) {

          return new ymaps.layer.tileContainer.DomContainer(layer, {

              tileClass: OSMTileClass,

              notFoundTile: MyTileClass,

              tileTransparent: false

          });

     };

// Ваш слой

var Layer = function () {

    return new ymaps.Layer(function (number, z) { return { x: number[0], y: number[0], z: z }, {

           tileContainerClass: MyTileContainer,

           projection: ymaps.projection.sphericalMercator

    });

}

Sergey Konstantinov
28 января 2016, 04:39

скобки кое-где забыл :)

В общем, предполагается, что тайл == урл, так что изменить эту концепцию не очень-то тривиально.

Такие вещи (например, проваливание в народную карту на Яндекс.Картах) обычно всё-таки по-другому делаются - запрашивается максимальный доступный масштаб для данной местности и, в зависимости от этого, включается тот или иной слой (ну или перезадаётся urlTemplate)