Клуб API Карт

Центрирование и автомасштабирование карты по объектам

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

Суть вопроса - строю на карте 2 маршрута. Нужно, чтбы эти маршруты поместились на карту и масштаб подобрасля максимальный, чтобы разместились все объекты марштура. 

        function init(){

            myMap = new ymaps.Map ("map", {

                center: [50.45, 30.50],

                zoom: 12,

                behaviors:['default', 'scrollZoom']

            });

 

Потом добавляю 2 маршрута:

ymaps.route([

                        'Украина, Киев, Адрес1',

                        'Київ, Адрес2',

                        'м.Київ, Алрес3',

                        'Украина, Киев, Адрес1'

                    ]).then(function (route1) {

                        myMap.geoObjects.add(route1);

                        var points = route1.getWayPoints();

                        points.options.set('preset', 'twirl#redStretchyIcon');

                        route1.options.set('strokeColor','#F008');

                        route1.options.set('strokeWidth',5);

 

                    }, function (error) {

                        alert('Возникла ошибка: ' + error.message);

                    });

 

   

ymaps.route([   'Украина, Киев, Адрес1',

                        'м.Київ, Адрес2',

                        'м.Київ, Адрес3',

                        'Украина, Киев, Адрес1'

                    ]).then(function (route2) {

                        myMap.geoObjects.add(route2);

                        var points = route2.getWayPoints();

                        points.options.set('preset', 'twirl#darkgreenIcon');

                    }, function (error) {

                        alert('Возникла ошибка: ' + error.message);

                    });

 

  

Прочитал, что вот так можно спозиционировать и масштабировать по всем объектам:

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

 

Итог - не позиционирует и не масштабирует. Подскажите, пожалуйста, в чём может быть проблема?

5 комментариев
Всеволод Шмыров
28 января 2016, 01:40
А где происходит масштабирование ? В одном из resolve-обработчике ?
В обработчиках происходит наполнение myMap.geoObjects нужно дождаться пока оба сработают.
yaroslav.bezruchko
28 января 2016, 01:40

Вот в коде у меня так и написано, сначала инициализация карты, потом построение 2  маршрутов, а после них - масштабирование.

Или я не правильно понял вопрос?

Вы неправильно поняли как работает маршрутизатор (асинхронно), 

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

Всеволод Шмыров
28 января 2016, 01:40
Построение маршрута - асинхронная операция. То есть когда вы вызываете myMap.setBounds(myMap.geoObjects.getBounds()), функции, которые были переданы в then еще не сработали.

К примеру, так:

// Маршрут1
ymaps.route(...).then(function () { ... 
    way1Created = true;
    setBounds();
})
...

// Маршрут2
ymaps.route(...).then(function () { ... 
    way2Created = true;
    setBounds();
})
...

function setBounds() {
    if(way1Created && way2Created)
        myMap.setBounds(myMap.geoObjects.getBounds());
}

решила эту проблему сменой значения параметра mapStateAutoApply с true на false

вот пример кода 
маршрут строит, по точке не центрирует
ymaps.route([
{ type: 'wayPoint', point: [39.962154, 30.403734]},
{ type: 'viaPoint', point: [39.961202, 30.403004] },
{ type: 'viaPoint', point: [39.960664, 30.405043] },
{ type: 'viaPoint', point: [39.960228, 30.404614] },
{ type: 'wayPoint', point: [39.959717, 30.406212] }
], {
// здесь меняем на false
mapStateAutoApply: false
}).then(function (route) {
route.getPaths().options.set({
strokeColor: '0000ee',
opacity: 0.9
});
let points = route.getWayPoints();


// смена стандартного пина (на другой стандартный)
points.get(0).options.set('preset', 'islands#circleDotIcon');
// цвет пина
points.get(0).options.set('iconColor', '#808080');
// добавление текста в стандартный балун
points.get(0).properties.set('balloonContent', 'мэмэмэ');
// находим и скрываем все промежуточные точки (линия остаётся)
let viaPoints = route.getViaPoints();
viaPoints.options.set('visible', false);


myMap.geoObjects.add(route);
});
Обновлено 21 ноября 2017, 17:35