Клуб API Карт

Не могу закинуть в кластер коллекции меток. Выбивает ошибку.

iytin-ne
23 июля 2012, 12:34

Хочу разместить все коллекции в метки но firebug выдает ошибку (TypeError: b is undefined), и я никак не могу с ней справится. Вот код создания и добавления меток в колекции.

   

function getdata(datas){//функция получения данных с базы      
       var json;
       $.post("obrabotka.php",{query:datas},function(json){
   for (i = 0; i < json.markers.length; i++) {
        createMetka(json.markers[i].id,Number(json.markers[i].x),Number(json.markers[i].y),json.markers[i].id_s);//передаем значения для создания метки
   }
   cluster.add(myCollection);//вот так добавляю все коллекции в кластер
   myMap.geoObjects.add(cluster);//вывод кластера
   $('.load_block').css('display','none');

                },'json')
    
   }//end getdata
  
   function setStyle(id_s){//стили меток
        var stylek=['twirl#blueIcon' ,'twirl#orangeIcon','twirl#darkblueIcon','twirl#pinkIcon',
        'twirl#darkgreenIcon','twirl#redIcon',
        'twirl#darkorangeIcon' ,'twirl#violetIcon',
        'twirl#greenIcon','twirl#whiteIcon',
        'twirl#greyIcon' ,'twirl#yellowIcon',
        'twirl#lightblueIcon' ,'twirl#brownIcon',
        'twirl#nightIcon' ,'twirl#blackIcon'] 
    return stylek[id_s];
   }
   function createMetka(id,x,y,id_s){
       var coord=new Array();     
       coord.push(x);
       coord.push(y);
       if(myCollection[id_s]==null){
         myCollection[id_s] = new ymaps.GeoObjectCollection({},{preset: setStyle(id_s-1)}); 
       }
        myPlacemark[id] = new ymaps.Placemark(coord,
        {
            myid:id,
            body : 'Загрузка...'
        },
        {
            balloonContentBodyLayout :myBalloonContentBodyLayout,
            balloonAutoPan:false,
            preset: setStyle(id_s-1)
        });
       myCollection[id_s].add(myPlacemark[id]);
       myPlacemark[id].events.add('click', onClick);
  }

 

Подскажите пожалуйста что не так.

 

17 комментариев
Подписаться на комментарии к посту
Не надо добавлять в myCollection, добавляйте сразу в cluster
Кластеризатор и есть коллекция меток.

ну я такой вариант делал, но тогда например, как мне скрывать в кластере определенные метки? я просто думал колекции скрывать было б проще в кластере. У меня там есть форма с категориями, и принажатии на галочку соответственные метки должны скрыватся в кластере или снова там отображатся.

 

Что значит скрываться в кластере? Когда пользователь нажимает галочку, нужно удалять часть меток из кластеризатора?

Да, нужно удалять часть меток с кластеризатора,  которые относятся к определенной группе. Пока у меня только получилось вот такое: http://svadbagolik.cybers.net.ua/index2.php.

$('.ccategory').bind('click',function(){ var id=$(this).attr('id'); if($(this).attr('checked')){ $('.category:[id='+id+']').css('background-color','white'); // myMap.geoObjects.add(myCollection[Number(id)]); $(this).attr('checked',true); }else{ $('.category:[id='+id+']').css('background','none'); cluster.remove(myPlacemark[id]); $(this).attr('checked',false); } })
но оно эта функция ничего не делает)

И еще паралельно вопрос. Как их можно будет потом оперативненько назад вернуть когда галочка вернется?

 

 

Пока что могу посоветовать только хранить ссылки на группы объектов массивами, и их добавлять-удалять в кластеризатор. Есть вероятность, что в будущем кластеризатор научится оперировать коллекциями, но пока я не могу сказать, когда это случится.

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

а как быть с

cluster.add(myCollection);//вот так добавляю все коллекции в кластер
   myMap.geoObjects.add(cluster);//вывод кластера

как я понимаю мне нужно просто вместо коллекций создавать массив меток, чтобы можно было группами (категориями) грузить метки в кластер?

Да, вместо коллекций нужны массивы. Не очень понятно, зачем удалять и снова создавать кластеризатор. Он умеет перестраиваться при изменении содержимого сам.

тоесть просто cluster.remove('Здесь название массива корорый нужно убрать с кластеризатора');

а потом когда галочка снова вернется то cluster.add('Здесь название массива корорый нужно добавить в кластеризатор');

 

Да, именно так

оуу, спасибо огромное, бегу исправлять! :-)

$('.ccategory').bind('click',function(){
    var id=$(this).attr('id');
    if($(this).attr('checked')){
        $('.category:[id='+id+']').css('background-color','white');
            cluster.remove(myCollection[id]);
        $(this).attr('checked',true);
    }else{
        $('.category:[id='+id+']').css('background','none');
            cluster.remove(myCollection[id]);
        $(this).attr('checked',false);
    }
})

исправил код, но оно не удаляет метки с кластера сразу, только когда я пару раз изменю зум. Может еще обновлять как-то надо?

После удаления объектов вы делаете map.geoObjects.add(cluster) - это лишняя операция - кластеризатор уже на карте.

 

По поводу того, что объекты не удаляются - у меня на стендах удаление работает корректно. Вы не могли бы в вашем примере подключить апи в режиме debug, я посмотрю тогда, почему не срабатывает удаление.

Только что добавил в урл апи &mode=debug и подкоректировал функцию, но что-то никак =(

 

у меня карта все время в состоянии загрузки

а Вы на этой странице смотрите? http://svadbagolik.cybers.net.ua/index2.php

Все, я поняла, в чем дело. У нас в прошлой версии был баг с удалением объектов. Его очень быстро поправили, но поскольку давно не было релизов, то он еще не выехал. В грядущем релизе (который ожидается со дня на день) выедут исправления, и у вас все заработает.

Спасибо Вам Марина большое за помощь(+1), буду ждать релиза!)