Клуб API Карт

Не работает масштабирование по коллекции/кластеру

azhirov1991
5 августа 2016, 10:35

Здравствуйте.

Столкнулся с проблемой масштабирования карты. При загрузке страницы происходит масштабирование по коллекции и потом резкий скачёк на уменьшение масштаба до максимума.

function marks(){
    if( window.myCollection ) window.myCollection.removeAll();
    window.myCollection = new ymaps.GeoObjectCollection();
    window.clusterer = new ymaps.Clusterer({
        preset: 'islands#invertedVioletClusterIcons',
        groupByCoordinates: false,
        clusterDisableClickZoom: true,
    });

    getPointData = function (cityOne, id, volume, capacity, nds, distance, cityTwo) {
        return {
            balloonContentBody: [
                '<address>' +
                '<b>Загрузка:</b> ' + cityOne +
                '<br/>' +
                '<b>ID объявления:</b> ' + id +
                '<br/>' +
                '<b>Вес/Объём:</b> ' + volume + '/' + capacity +
                '<br/>' +
                '<b>' + nds + '</b> (' + (distance/nds) + ' р/км)' +
                '<br/>' +
                '<b>Разгрузка:</b> ' + cityTwo +
                '<br/>' +
                '<b>Расстояние:</b> ' + distance +
                '</address>'
            ],
            clusterCaption: '<strong class="list-item" id=' + id + '>' + cityOne + " => " + cityTwo + '</strong>',
            identifier: id
        };
    }

    $('.datacontent').each(function(){
        var cityload = $(this).data('cityload'),
            cityunload = $(this).data('cityunload'),
            coordsload = $(this).data('coordsload').split(';'),
            coordsunload = $(this).data('coordsunload').split(';'),
            id = $(this).data('id'),
            volume = $(this).data('volume'),
            capacity = $(this).data('capacity'),
            nds = $(this).data('nds'),
            distance = $(this).data('distance');

        var markTo = new ymaps.Placemark([coordsload[0], coordsload[1]], getPointData(cityload, id, volume, capacity, nds, distance, cityunload), {
            preset: 'islands#greenDotIcon'
        });

        var markDo = new ymaps.Placemark([coordsunload[0], coordsunload[1]], getPointData(cityload, id, volume, capacity, nds, distance, cityunload), {
            preset: 'islands#redDotIcon'
        });

        var lineCity = new ymaps.Polyline([
            [coordsload[0], coordsload[1]],[coordsunload[0], coordsunload[1]]
        ],{
            strokeColor: "0000FF55",
            strokeWidth: 20,
            identifier: id
        });

        clusterer.add(markTo).add(markDo);
        myCollection.add(lineCity);

    });

    clusterer.events.add('click', clickOnPlacemark);

    clusterer.events.add(['balloonopen'], function(){
        $('.list-item').click(function(){
            for( var i = 0; i < myCollection.getLength(); i++ ){
                if(myCollection.get(i).properties.get('identifier') != this.id){
                    myCollection.get(i).options.set('visible', false);
                }else{
                    myCollection.get(i).options.set('visible', true);
                }
            }
        });
    });

    searchMap.geoObjects.add(clusterer);
    searchMap.geoObjects.add(myCollection);
    searchMap.setBounds(clusterer.getBounds(), { checkZoomRange: true });
}

4 комментария
Я так понял, у меня тема тесно связана с этим..
azhirov1991,
Никак не связана – посту шесть лет и версия АПИ там 1.0


Вы вызываете setBounds когда карта скрыта и размер ее контейнера равен нулю.
Нужно вызывать, когда контейнер отобразится.


PS:
У вас на каждое открытие балуна добавляется новый слушатель
И как я понимаю не удаляется. Открыл /закрыл балун и память потекла...


clusterer.events.add(['balloonopen'], function(){
  $('.list-item').click(function(){
...
dimik,
Да, исправил) спасибо большое!


searchMap.events.add('sizechange', function () {
marks();
});
dimik,
Изменил немного момент с событием. На счёт удаления события так и и не пойму... Это к чему?


clusterer.events.add('click', clickOnPlacemark);


function clickOnPlacemark(e){
clusterer.events.add(['balloonopen'], function(){
if($('.list-item').is(':visible')){
$('.list-item').click(function(){
for( var i = 0; i < myCollection.getLength(); i++ ){
if(myCollection.get(i).properties.get('identifier') != this.id){
myCollection.get(i).options.set('visible', false);
}else{
myCollection.get(i).options.set('visible', true);
}
}
}).click();
}else{
for( var i = 0; i < myCollection.getLength(); i++ ){
if(myCollection.get(i).properties.get('identifier') != e.get('target').properties.get('identifier')){
myCollection.get(i).options.set('visible', false);
}else{
myCollection.get(i).options.set('visible', true);
}
}
}
});
}