Добавить на Яндекс.Карту кластеризатор меток

Доброго времени суток!

Помогите, плиз, люди добрые и злые...

Пример смотрел тут https://yandex.ru/dev/maps/jsbox/2.1/clusterer_create/

Нужно собрать все объекты placemark в массив, затем уже вне цикла создать ymaps.Clusterer и добавить ему этот массив геообъектов через clusterer.add , а потом уже карте добавить clusterer.

Не понимаю как в данной ситуации собрать массив объектов placemark.

    Y_initCityMap: function(coords) {
        coords[1]-=0.2;     
        if(!IPOLapiship_pvz.Y_map){
            IPOLapiship_pvz.Y_map = new ymaps.Map("apiship_map",{
                zoom:10,
                controls: [],
                center: coords
            });
            var ZK = new ymaps.control.ZoomControl({
                options : {
                    position:{
                        left : 265,
                        top  : 146
                    }
                }
            });

            IPOLapiship_pvz.Y_map.controls.add(ZK);
            
            if (IPOLapiship_pvz.widgetSearch)
            {
                var searchControlParams = {float: 'right', floatIndex: 100, noPlacemark: true};
                if (IPOLapiship_pvz.widgetSearchMark)
                    searchControlParams.noPlacemark = false;
            
                IPOLapiship_pvz.Y_map.controls.add('searchControl', searchControlParams);
                IPOLapiship_pvz.Y_map.controls.events.add('resultshow', IPOLapiship_pvz.Y_zoomCalibrate, IPOLapiship_pvz.Y_map.controls.get('searchControl'));
            }
        }
        else{
            IPOLapiship_pvz.Y_map.setCenter(coords);
            IPOLapiship_pvz.Y_map.setZoom(10);
        }
        
        IPOLapiship_pvz.Y_clearPVZ();
        IPOLapiship_pvz.Y_markPVZ();        
    },
    
    Y_getPVZCenters : function() {
        var ret = [0,0,0];
        for(var i in IPOLapiship_pvz.PVZ){
            if(
                typeof(IPOLapiship_pvz.PVZ[i].cX) !== 'undefined' &&
                typeof(IPOLapiship_pvz.PVZ[i].cY) !== 'undefined' &&
                IPOLapiship_pvz.PVZ[i].cX && IPOLapiship_pvz.PVZ[i].cY
            ){
                ret[0] += parseFloat(IPOLapiship_pvz.PVZ[i].cY);
                ret[1] += parseFloat(IPOLapiship_pvz.PVZ[i].cX);
                ret[2] ++;
            }
        }

        if(ret[2]){
            ret[0] /= ret[2];
            ret[1] /= ret[2];
            ret.pop();
            return ret;
        } else {
            return false;
        }
    },
    
    Y_zoomCalibrate: function()
    {
        while (!ymaps.geoQuery(map.geoObjects).searchInside(IPOLapiship_pvz.Y_map).getLength() && IPOLapiship_pvz.Y_map.getZoom() > 4)
        {
            IPOLapiship_pvz.Y_map.setZoom(IPOLapiship_pvz.Y_map.getZoom() - 1);
        }
    },

    Y_markPVZ: function(){
        for (var i in IPOLapiship_pvz.PVZ) {
            var baloonHTML = "";
            var pointText  = "";

            // логтип доставщика
            if (typeof IPOLapiship_pvz.arImages[IPOLapiship_pvz.PVZ[i].providerKey] != "undefined")
                baloonHTML += "<img class = 'apiship_provider_baloon_img' src = '"+ IPOLapiship_pvz.image_url + IPOLapiship_pvz.arImages[IPOLapiship_pvz.PVZ[i].providerKey] +"'>";
            else
                baloonHTML += "<div class = 'apiship_provider_baloon_img'>" + IPOLapiship_pvz.PVZ[i].providerKey + "</div>";
            
            baloonHTML += "<div id='apiship_baloon'>";
            baloonHTML += "<div class='apiship_iAdress'>";
            
            if(IPOLapiship_pvz.PVZ[i].color)
                baloonHTML +=  "<span style='color:"+IPOLapiship_pvz.PVZ[i].color+"'>"
            
            baloonHTML += IPOLapiship_pvz.PVZ[i].Address;
            
            if(IPOLapiship_pvz.PVZ[i].color)
                baloonHTML += "</span>";
            
            baloonHTML += "</div>";

            if(IPOLapiship_pvz.PVZ[i].Phone)
                baloonHTML += "<div><div class='apiship_iTelephone apiship_icon'></div><div class='apiship_baloonDiv'>"+IPOLapiship_pvz.PVZ[i].Phone+"</div><div style='clear:both'></div></div>";
            if(IPOLapiship_pvz.PVZ[i].WorkTime)
                baloonHTML += "<div><div class='apiship_iTime apiship_icon'></div><div class='apiship_baloonDiv'>"+IPOLapiship_pvz.PVZ[i].WorkTime+"</div><div style='clear:both'></div></div>";
            
            if (IPOLapiship_pvz.widgetPointFeatureType || IPOLapiship_pvz.widgetPointFeatureCOD) {
                baloonHTML += "<div class='apiship_baloonDiv_features'>";           
                // Point type
                if (IPOLapiship_pvz.widgetPointFeatureType) {
                    switch (parseInt(IPOLapiship_pvz.PVZ[i].type)) {
                        case 1: pointText = '<?=GetMessage("IPOLapiship_BALOON_F_PVZ")?>'; break;
                        case 2: pointText = '<?=GetMessage("IPOLapiship_BALOON_F_POSTAMAT")?>'; break;
                        case 3: pointText = '<?=GetMessage("IPOLapiship_BALOON_F_POST")?>'; break;
                        case 4: pointText = '<?=GetMessage("IPOLapiship_BALOON_F_TERMINAL")?>'; break;              
                    }
                    if (pointText)
                        baloonHTML += "<div class='apiship_baloonDiv_feature'>" + pointText + "</div>";
                }
                // COD
                if (IPOLapiship_pvz.widgetPointFeatureCOD) {
                    if (IPOLapiship_pvz.PVZ[i].cod == '1')
                        baloonHTML += "<div class='apiship_baloonDiv_feature'><?=GetMessage("IPOLapiship_BALOON_F_COD")?></div>";
                    else
                        baloonHTML += "<div class='apiship_baloonDiv_feature not_available'><?=GetMessage("IPOLapiship_BALOON_F_NO_COD")?></div>";
                }
                                
                baloonHTML += "<div style='clear:both'></div></div>";
            }
            
            baloonHTML += "<div><div class='apiship_baloonDiv'><?=GetMessage("IPOLapiship_BALOON_DELIVERY_COST")?>"+IPOLapiship_pvz.PVZ[i].deliveryCost+"<?=GetMessage("IPOLapiship_CURRENCY_RUB")?></div><div style='clear:both'></div></div>";
            
            var daysMin = IPOLapiship_pvz.PVZ[i].daysMin,
                daysMax = IPOLapiship_pvz.PVZ[i].daysMax;
            if (daysMin == 0)
                daysMin = 1;
            if (daysMax == 0)
                daysMax = 1;
            var days;
            if (daysMin == daysMax)
                days = daysMin;
            else
                days = daysMin + " - " + daysMax;
        
            baloonHTML += "<div><div class='apiship_baloonDiv'><?=GetMessage("IPOLapiship_BALOON_DELIVERY_DAYS")?>"+days+"</div><div style='clear:both'></div></div>";
            
            baloonHTML += "<div><a id='apiship_button' href='javascript:void(0)' onclick='IPOLapiship_pvz.choozePVZ(\""+i+"\")'></a></div>";
            baloonHTML += "</div>";
            
            IPOLapiship_pvz.PVZ[i].placeMark = new ymaps.Placemark([IPOLapiship_pvz.PVZ[i].cY,IPOLapiship_pvz.PVZ[i].cX],{
                balloonContent: baloonHTML
            }, {
                iconLayout: 'default#image',
                iconImageHref: '/bitrix/images/ipol.apiship2v/widjet/apishipNActive.png',
                iconImageSize: [40, 43],
                iconImageOffset: [-10, -31]
            });

                // IPOLapiship_pvz.Y_map.geoObjects.add(IPOLapiship_pvz.PVZ[i].placeMark);
                IPOLapiship_pvz.PVZ[i].placeMark.link = i;
                IPOLapiship_pvz.PVZ[i].placeMark.events.add('balloonopen',function(metka){
                IPOLapiship_pvz.markChosenPVZ(metka.get('target').link);
            });
        }

        var clusterer = new ymaps.Clusterer({
            preset: 'islands#invertedVioletClusterIcons',
            groupByCoordinates: false,
            clusterDisableClickZoom: true,
            clusterHideIconOnBalloonOpen: false,
            geoObjectHideIconOnBalloonOpen: false
        }),
        
        geoObjects = [];

        for(var i = 0, len = points.length; i < len; i++) {
            geoObjects[i] = IPOLapiship_pvz.PVZ[i].placeMark;
        }

        clusterer.add(geoObjects);
        IPOLapiship_pvz.Y_map.geoObjects.add(clusterer);        
    },

    Y_selectPVZ: function(wat){
        IPOLapiship_pvz.PVZ[wat].placeMark.balloon.open();
        IPOLapiship_pvz.Y_map.setCenter([IPOLapiship_pvz.PVZ[wat].cY,IPOLapiship_pvz.PVZ[wat].cX]);
    },
    
    Y_blinkPVZ: function(wat,ifOn){
        if(typeof(ifOn)!='undefined' && ifOn)
            IPOLapiship_pvz.PVZ[wat].placeMark.options.set({iconImageHref:"/bitrix/images/ipol.apiship2v/widjet/apishipActive.png"});
        else
            IPOLapiship_pvz.PVZ[wat].placeMark.options.set({iconImageHref:"/bitrix/images/ipol.apiship2v/widjet/apishipNActive.png"});
    }


Ответы (1 шт):

Автор решения: Виктор Карев

Изменения отмечены маркером /////:

Y_initCityMap: function(coords) {
        coords[1] -= 0.2;
        if (!IPOLapiship_pvz.Y_map) {
            IPOLapiship_pvz.Y_map = new ymaps.Map("apiship_map", {
                zoom: 10,
                controls: [],
                center: coords
            });
            var ZK = new ymaps.control.ZoomControl({
                options: {
                    position: {
                        left: 265,
                        top: 146
                    }
                }
            });

            IPOLapiship_pvz.Y_map.controls.add(ZK);

            if (IPOLapiship_pvz.widgetSearch) {
                var searchControlParams = {
                    float: 'right',
                    floatIndex: 100,
                    noPlacemark: true
                };
                if (IPOLapiship_pvz.widgetSearchMark)
                    searchControlParams.noPlacemark = false;

                IPOLapiship_pvz.Y_map.controls.add('searchControl',
                    searchControlParams);
                IPOLapiship_pvz.Y_map.controls.events.add('resultshow',
                    IPOLapiship_pvz.Y_zoomCalibrate, IPOLapiship_pvz.Y_map
                    .controls.get('searchControl'));
            }
        } else {
            IPOLapiship_pvz.Y_map.setCenter(coords);
            IPOLapiship_pvz.Y_map.setZoom(10);
        }

        IPOLapiship_pvz.Y_clearPVZ();
        IPOLapiship_pvz.Y_markPVZ();
    },

    Y_getPVZCenters: function() {
        var ret = [0, 0, 0];
        for (var i in IPOLapiship_pvz.PVZ) {
            if (
                typeof(IPOLapiship_pvz.PVZ[i].cX) !== 'undefined' &&
                typeof(IPOLapiship_pvz.PVZ[i].cY) !== 'undefined' &&
                IPOLapiship_pvz.PVZ[i].cX && IPOLapiship_pvz.PVZ[i].cY
            ) {
                ret[0] += parseFloat(IPOLapiship_pvz.PVZ[i].cY);
                ret[1] += parseFloat(IPOLapiship_pvz.PVZ[i].cX);
                ret[2]++;
            }
        }

        if (ret[2]) {
            ret[0] /= ret[2];
            ret[1] /= ret[2];
            ret.pop();
            return ret;
        } else {
            return false;
        }
    },

    Y_zoomCalibrate: function() {
        while (!ymaps.geoQuery(map.geoObjects).searchInside(IPOLapiship_pvz
                .Y_map).getLength() && IPOLapiship_pvz.Y_map.getZoom() > 4) {
            IPOLapiship_pvz.Y_map.setZoom(IPOLapiship_pvz.Y_map.getZoom() - 1);
        }
    },

    Y_markPVZ: function() {
        geoObjects = []; /////
        for (var i in IPOLapiship_pvz.PVZ) {
            var baloonHTML = "";
            var pointText = "";

            // логтип доставщика
            if (typeof IPOLapiship_pvz.arImages[IPOLapiship_pvz.PVZ[i]
                    .providerKey] != "undefined")
                baloonHTML +=
                "<img class = 'apiship_provider_baloon_img' src = '" +
                IPOLapiship_pvz.image_url + IPOLapiship_pvz.arImages[
                    IPOLapiship_pvz.PVZ[i].providerKey] + "'>";
            else
                baloonHTML += "<div class = 'apiship_provider_baloon_img'>" +
                IPOLapiship_pvz.PVZ[i].providerKey + "</div>";

            baloonHTML += "<div id='apiship_baloon'>";
            baloonHTML += "<div class='apiship_iAdress'>";

            if (IPOLapiship_pvz.PVZ[i].color)
                baloonHTML += "<span style='color:" + IPOLapiship_pvz.PVZ[i]
                .color + "'>"

            baloonHTML += IPOLapiship_pvz.PVZ[i].Address;

            if (IPOLapiship_pvz.PVZ[i].color)
                baloonHTML += "</span>";

            baloonHTML += "</div>";

            if (IPOLapiship_pvz.PVZ[i].Phone)
                baloonHTML +=
                "<div><div class='apiship_iTelephone apiship_icon'></div><div class='apiship_baloonDiv'>" +
                IPOLapiship_pvz.PVZ[i].Phone +
                "</div><div style='clear:both'></div></div>";
            if (IPOLapiship_pvz.PVZ[i].WorkTime)
                baloonHTML +=
                "<div><div class='apiship_iTime apiship_icon'></div><div class='apiship_baloonDiv'>" +
                IPOLapiship_pvz.PVZ[i].WorkTime +
                "</div><div style='clear:both'></div></div>";

            if (IPOLapiship_pvz.widgetPointFeatureType || IPOLapiship_pvz
                .widgetPointFeatureCOD) {
                baloonHTML += "<div class='apiship_baloonDiv_features'>";
                // Point type
                if (IPOLapiship_pvz.widgetPointFeatureType) {
                    switch (parseInt(IPOLapiship_pvz.PVZ[i].type)) {
                        case 1:
                            pointText =
                                '<?=GetMessage("IPOLapiship_BALOON_F_PVZ")?>';
                            break;
                        case 2:
                            pointText =
                                '<?=GetMessage("IPOLapiship_BALOON_F_POSTAMAT")?>';
                            break;
                        case 3:
                            pointText =
                                '<?=GetMessage("IPOLapiship_BALOON_F_POST")?>';
                            break;
                        case 4:
                            pointText =
                                '<?=GetMessage("IPOLapiship_BALOON_F_TERMINAL")?>';
                            break;
                    }
                    if (pointText)
                        baloonHTML +=
                        "<div class='apiship_baloonDiv_feature'>" + pointText +
                        "</div>";
                }
                // COD
                if (IPOLapiship_pvz.widgetPointFeatureCOD) {
                    if (IPOLapiship_pvz.PVZ[i].cod == '1')
                        baloonHTML +=
                        "<div class='apiship_baloonDiv_feature'><?=GetMessage("
                    IPOLapiship_BALOON_F_COD ")?></div>";
                    else
                        baloonHTML +=
                        "<div class='apiship_baloonDiv_feature not_available'><?=GetMessage("
                    IPOLapiship_BALOON_F_NO_COD ")?></div>";
                }

                baloonHTML += "<div style='clear:both'></div></div>";
            }

            baloonHTML += "<div><div class='apiship_baloonDiv'><?=GetMessage("
            IPOLapiship_BALOON_DELIVERY_COST ")?>" + IPOLapiship_pvz.PVZ[i]
                .deliveryCost + "<?=GetMessage("
            IPOLapiship_CURRENCY_RUB
                ")?></div><div style='clear:both'></div></div>";

            var daysMin = IPOLapiship_pvz.PVZ[i].daysMin,
                daysMax = IPOLapiship_pvz.PVZ[i].daysMax;
            if (daysMin == 0)
                daysMin = 1;
            if (daysMax == 0)
                daysMax = 1;
            var days;
            if (daysMin == daysMax)
                days = daysMin;
            else
                days = daysMin + " - " + daysMax;

            baloonHTML += "<div><div class='apiship_baloonDiv'><?=GetMessage("
            IPOLapiship_BALOON_DELIVERY_DAYS ")?>" + days +
                "</div><div style='clear:both'></div></div>";

            baloonHTML +=
                "<div><a id='apiship_button' href='javascript:void(0)' onclick='IPOLapiship_pvz.choozePVZ(\"" +
                i + "\")'></a></div>";
            baloonHTML += "</div>";

            var place; /////
            place = /////
                IPOLapiship_pvz.PVZ[i].placeMark = new ymaps.Placemark([
                    IPOLapiship_pvz.PVZ[i].cY, IPOLapiship_pvz.PVZ[i].cX
                ], {
                    balloonContent: baloonHTML
                }, {
                    iconLayout: 'default#image',
                    iconImageHref: '/bitrix/images/ipol.apiship2v/widjet/apishipNActive.png',
                    iconImageSize: [40, 43],
                    iconImageOffset: [-10, -31]
                });
            geoObjects.push(place); /////
            // IPOLapiship_pvz.Y_map.geoObjects.add(IPOLapiship_pvz.PVZ[i].placeMark);
            IPOLapiship_pvz.PVZ[i].placeMark.link = i;
            IPOLapiship_pvz.PVZ[i].placeMark.events.add('balloonopen', function(
                metka) {
                IPOLapiship_pvz.markChosenPVZ(metka.get('target').link);
            });
        }

        var clusterer = new ymaps.Clusterer({
                preset: 'islands#invertedVioletClusterIcons',
                groupByCoordinates: false,
                clusterDisableClickZoom: true,
                clusterHideIconOnBalloonOpen: false,
                geoObjectHideIconOnBalloonOpen: false
            }),

            /////       geoObjects = [];

            /////       for(var i = 0, len = points.length; i < len; i++) {
            /////           geoObjects[i] = IPOLapiship_pvz.PVZ[i].placeMark;
            /////       }

            clusterer.add(geoObjects);
        IPOLapiship_pvz.Y_map.geoObjects.add(clusterer);
    },

    Y_selectPVZ: function(wat) {
        IPOLapiship_pvz.PVZ[wat].placeMark.balloon.open();
        IPOLapiship_pvz.Y_map.setCenter([IPOLapiship_pvz.PVZ[wat].cY,
            IPOLapiship_pvz.PVZ[wat].cX
        ]);
    },

    Y_blinkPVZ: function(wat, ifOn) {
        if (typeof(ifOn) != 'undefined' && ifOn)
            IPOLapiship_pvz.PVZ[wat].placeMark.options.set({
                iconImageHref: "/bitrix/images/ipol.apiship2v/widjet/apishipActive.png"
            });
        else
            IPOLapiship_pvz.PVZ[wat].placeMark.options.set({
                iconImageHref: "/bitrix/images/ipol.apiship2v/widjet/apishipNActive.png"
            });
    }
→ Ссылка