Клуб API Карт

Отслеживание изменения масштаба из объекта тайлов

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

Я решил использовать тайловый интерфейс для управления оверлеями. Их много. Разом подгружать их не хочу - хочу потайлово. На метод load оверлеи удаляются и создаются, на метод onRemoveFromMap удаляются. Проблема: при смене масштаба не вызывается ни один из этих методов. Как с этим быть?


Чтобы быть более конкретным приложу код объекта:


function OverlayTile (dataSource) {
  var myPos = new YMaps.Point(),
      element = YMaps.jQuery("
"),
      objects = {}
  element.addClass("overlay_tile")
  this.onAddToMap = function (map, parentContainer) { element.appendTo(parentContainer) }
  this.setPosition = function (position) { myPos.moveTo(position) }
  this.getPosition = function () { return myPos.copy() }
  this.error = function () {}
  this.abort = function () {}
  this.scale = function (coeff) {}

  function delete_overlay(attr){
    if(attr!=undefined){
      objects[attr].removeAll()
      map.removeOverlay(objects[attr])
      objects[attr] = undefined
    }
  }

  function create_overlay(attr){
       if(objects[attr]==undefined){
         objects[attr] = new YMaps.GeoObjectCollection();
         map.addOverlay(objects[attr])
       }
  }

  this.onRemoveFromMap = function () {
    delete_overlay(element.attr('rel'))
    element.remove()
  }

  this.load = function (tile, zoom) {
    $.getJSON('/companies/by_tile/?tile=' + tile + ',' + zoom, function(data){
      delete_overlay(element.attr('rel'))
      element.attr('rel',tile)
      create_overlay(element.attr('rel'))
      $.each(data,function(i,el){
        objects[element.attr('rel')].add( new YMaps.Placemark( new YMaps.Point(el.x,el.y) ) )
      })

    })

  }

}

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

4 комментария
тайл так же будет удален если вы сдвинете карту так что он выйдет за пределы видимости.
Если вы не хотите чтобы тайл удалялся при зуме - можно пределить continius zoom ему.
Добавляем интерефейсу
 this.scale = function (coeff) {...}
И включаем плавный зум на карте.
Правда сейчас после зума тайл не удаляется и я считаю это багом. А в данном случае вам это какраз подойдет.

Вообще для вашего варианта самое оптимальное было бы оставить в тайле только загрузку, а удаление\показ блоков вынести в другой модуль.

Как получить карту из тайла?
Через его dataSource который есть YMap.TileDataSource

давайте сделаем так
      var tileDataSource = new YMaps.TileDataSource(urlTemplate, true, false);
      
      tileDataSource.map=map;
      tileDataSource.getTile=function(){return new

 OverlayTile(this);}


Как видно - какра в OverlayTile доступна как dataSource.map
Кирилл Яковлев
28 января 2016, 07:45
Спасибо, попробую реализовать в понедельник. Присоединяюсь к тому, что неудаление тайлов при смене зума - баг. При неплавном зуме, возможно, вообще не имеет смысла удалять елементы, почему бы не использовать просто load..
Кирилл Яковлев
28 января 2016, 07:45
плин, там и используется load, а у меня было включено плавное, там используется scale.
При плавном масштабировании создается два слоя тайлов, один растянутый/сжатый другой нормальный. На сколько я понял вот эти-то нестандартного размера тайлы вас и смущают, они действительно не удалаются и у них не вызывается load, точнее он вызвается но только при следующем плавном масштабировании.
В вашем случае оптимальным будет отключить плавное масштабирование для ваших тайлов, задав опцию smoothZoomEnabled в конструкторе TileDataSource как false. Тогда при начале плавного масштабирования ваши тайлы будут скрываться, а по окончанию у них будет вызван метод load. Отключение плавного масштабирования для ваших тайлов не отключит его у всей карты, эта опция влияет только на поведение вашего слоя.