Клуб API Карт

Проблема с util.bounds.getCenterAndZoom

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

Использую util.bounds.getCenterAndZoom для получения масштаба и центра карты. Передаю массив координат и значение ширины и высоты карты. Почему я получают масштаб "мир" ? 

Скриншот 

Код:

 

var w = $('#map').width(), h = $('#map').height();
var centerAndZoom = ymaps.util.bounds.getCenterAndZoom(coords,[w, h]);
15 комментариев
Sergey Konstantinov
28 января 2016, 02:52
Нужно передавать не координаты, а пару координат (углы карты).

Для того, чтобы понять, почему получается масштаб "мир", нужно посмотреть на передаваемый массив координат.

Массив coords должен содержать координаты двух точек - левый верхний угол области и правый нижний угол.

То есть нужно из вашего массива взять первые 2 точки и переставить их местами - тогда получится ненулевой зум.

var coords = [

            [58.009129, 56.201182],

            [58.007408, 56.208647]

        ];

        var centerAndZoom = ym.util.bounds.getCenterAndZoom(coords, map.container.getSize());

Почему нужно передавать только две точки ?

Чтобы задать прямоугольную область достаточно двух точек.

Хм.. и как мне узнать где в моём массиве координаты с самым левым верхним углом и самым нижним правым углом ?

var minLat maxLat, minLong, maxLong;

minLat = maxLat = coords[0][0];

minLong = maxLong = coords[0][1];

for (var i = 1, l = coords.length; i < l; i++) {

    minLat = Math.min(minLat, coords[i][0]);

    maxLat = Math.max(maxLat, coords[i][0]);

    minLong = Math.min(minLong, coords[i][1]);

    maxLong = Math.max(maxLong, coords[i][1]);

}

var centerAndZoom = ymaps.util.bounds(

        [[maxLat, minLong], [minLat, maxLong]],

        map.container.getSize()

    );

Спасибо вам большое.

Надо понимать что эта совсем простая реализация не будет работать если точки будут вокруг Берингова пролива. И чтобы сделать все честно лучше добавить все геообъекты на карту и спросить у нее размер видимой области

myMap.setBounds(myMap.geoObjects.getBounds());

Спас мой мозг. Спасибо.

Александр Ди
2 декабря 2016, 22:13
dimik,
Спасибо тебе! В АПИ не смог найти такую команду. Перерыл весь инет...
Добрый день!
Обнаружил странную ошибку - не пойму в чем причина.
1. Обрабатываю координаты Санкт-Петербурга: 

        var boundedBy = {lowerCorner: "131.84038 43.056686", upperCorner: "132.238891 43.290031"};
var coords = [boundedBy.lowerCorner.split(" "), boundedBy.upperCorner.split(" ")];
var centerAndZoom = ymaps.util.bounds.getCenterAndZoom(coords, myMap.container.getSize());
Получаю правильный ответ:
center: [30.305933639206028, 59.91771799999997]
zoom: 9

2. Точно так же обрабатываю координаты Владивостока:
{lowerCorner: "131.84038 43.056686", upperCorner: "132.238891 43.290031"}
в результате получаю центр где-то в Китае
center: [89.9999999999, 43.1733585]

Как я понимаю, где-то есть ограничение и первая координата центра не может быть больше 90. Вопрос почему и как победить?

ingosru,
у вас координаты Санкт-Петербурга и Владивостока одинаковые. Проверьте, что порядок координат в ваших данных совпадает с порядком в АПИ
ingosru,
Как я и писал выше у вас перепутан порядок координат
Область Владивостока должна быть [[43.056686,131.84038],[43.290031,132.238891]]


https://jsfiddle.net/7huyobjL/
Обновлено 22 сентября 2017, 20:23