Клуб API Карт

Ограничить уровни масштабирования для показа активных областей + кеширование спрайтов

Алексей
6 ноября 2013, 00:33

Здравствуйте! Ситуация такая: На карте в масштабе от 1 до 11 отображаются активные области, в масштабе 12 и больше - отображаются метки.
Столкнулись с проблемой: при загрузке сайта, в консоли разработчика видно, как грузятся тайлы 11 масштаба, затем меняем на карте масштаб на 12 - срабатывает функция отображения меток, но слой активных областей пытается загрузить тайлы для 12 масштаба, а у нас такие просто не предусмотрены, в результате чего сервер возвращает ошибку 404.

Внешне проблем нет - 11 масштаб - видны активные области, 12 - видны метки. Но то, что при изменении масштаба скрипт посылает запросы на сервер - не очень хорошо.

Как объяснить скрипту, когда создаем слой активных областей, что он должен работать только в заданном диапазоне масштаба?

 

И второй вопрос (чтобы не начинать отдельную тему):
При просмотре загрузки карты в консоли разработчика видно, что тайлы активных областей и самой карты кешируются браузером и при обновлении страниц грузятся из кеша браузера. А вот файл спрайта, из которого подставляем изображения для меток постоянно загружаются с сервера. Что нужно сделать, чтобы спрайт также кешировался браузером?

7 комментариев
Подписаться на комментарии к посту

1. Решается опциями minZoom/maxZoon у ObjectSource

2. Отдавать корректые http-заголовки для кеширования Expires, Cache-Control

Бабуля, спасибо тебе огромное!

Бабушка, я немного напутал и ввел всех в заблуждение!
У нас слой не hotspot, a картиночный - соответственно как ограничить загрузку тайлов в картиночном слое в рамках диапазона масштабирования?
 

Перекрой в своем слое метод getZoomRange

чтобы он возвращал нужный диапазон

Хм, мне кажется что так проще получилось, да и в консоли загрузку несуществующих тайлов не неблюдаю:

 

myMap = new ymaps.Map('YMapsID', {

        center:[55.76, 37.605],

        zoom:11

    });

 

    var imgUrlTemplate = '/map/png/%z/tile-%x-%y.png',

    imgLayer = new ymaps.Layer(imgUrlTemplate, {tileTransparent: true});

    myMap.layers.add(imgLayer);

 

    myMap.events.add('boundschange', function (event) {

   if(event.get('newZoom')

myMap.layers.add(imgLayer);

   }else{

   myMap.layers.remove(imgLayer);

/*    Здесь будем грузить метки в кластеризатор через JSON */

   }

   });

 

Или есть способ лучше?

 

Хм, мне кажется что так проще получилось

 

Ну давай сравним: 

imgLayer.getZoomRange = function () {    var promise = new ymaps.util.Promise();    promise.resolve([0, 11]);    return promise;};

 

Я вот не пойму Вы больше заботливая бабушка или все таки крутой бэтмен?! )))


Спасибо! Попробуем этот вариант!
Просто мы еще не на таком фантастическом уровне мышления...