Клуб API Карт

setBounds работает неверно?

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

Сегодня дописывал код под новый API — и столкнулся с тем, что map.setBounds работает не так, как в предыдущей версии.

Дабы было понятнее, фрагмент кода. В цикле добавляются метки:
var placemark = new ymaps.Placemark( [coord1, coord2], {}, {} );
placemarksArray.push( [coord1, coord2] );
map.geoObjects.add(placemark);


Затем setBounds:
map.setBounds(placemarksArray);

 

В результате карта должна подстроиться под метки, но масштаб карты не меняется, в результате показывается это:


Если изменить масштаб — то видно, что есть ещё метки за пределами видимой области карты:


Насколько я понимаю, setBounds должен подстроить карту так, чтобы все метки были видны? По-крайней мере так это работало в предыдущей версии API. Это неверная работа карты или надо что-то сделать ещё для нужного результата?

Добавлял в setBounds callback-функцию, которая должна срабатывать при ошибке — она не срабатывает.

5 комментариев

setBounds принимает массив из 2-х точек, а не массив меток

А, ранее мы использовали все метки, объединённыйе в GeoCollection, увидев массив в примерах решил, что можно теперь массив туда пихнуть. Сейчас так можно делать, как раньше, передавая геоколлекцию?

нет.

сейчас надо самому вычислить максимальное-минимальное значение.

вроде бы это не сложно - геометрия представляет собой обычный js-массив

Я у себя реализовал примерно такую функцию для вычисления границ коллекции меток:

getBounds = function(collection) {
    var first_run, max_lat, max_long, min_lat, min_long;
    min_lat = min_long = max_lat = max_long = 0;
    first_run = true;
    collection.each(function(i) {
      var lat, long, _ref;
      _ref = i.geometry.getCoordinates(), lat = _ref[0], long = _ref[1];
      if (first_run) {
        first_run = false;
        min_lat = max_lat = lat;
        min_long = max_long = long;
      } else {
        min_lat = Math.min(min_lat, lat);
        max_lat = Math.max(max_lat, lat);
        min_long = Math.min(min_long, long);
        max_long = Math.max(max_long, long);
      }
    });
    return [[min_lat, min_long],[max_lat, max_long]];
  };