Клуб API Карт

Проблема с Cluster - возникла при обновлении версии ya карт

Пост в архиве.
igon.ru
16 августа 2012, 17:14

Вопрос к разработчикам и гуру!

 

Есть живой проект. Написанный, сданный месяца 3 назад. http://sundayoutdoor.ru  Некоторое время назад (не могу сказать точно, может недели 3-4 назад), карта перестала работать как надо. Заказчик пока наполняет базу, так что не дергал.

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

Сегодня я решил разобраться в чем дело. При дебаге выяснилось, что с тем кластером, с которым раньше Карты отлично справлялись, теперь непонятная мне проблема. ошибка следующая: Uncaught TypeError: Cannot read property 'length' of undefined 

Вылезает она с функциях

 

_addClusterToMap: function (cluster) {
var geoObjects = cluster.properties.get('geoObjects');
for (var i = 0, l = geoObjects.length; i < l; i++) {
Uncaught TypeError: Cannot read property 'length' of undefined
this._objectsClusters[geoObjects[i]] = cluster;
}
this._addObjectToMap(cluster, this.options.get('synchAdd'));
},
_removeClusterFromMap: function (obj) {
var geoObjects = obj.properties.get('geoObjects');
for (var i = 0, l = geoObjects.length; i < l; i++) {
delete this._objectsClusters[geoObjects[i]];
}
Clusterer.superclass.remove.call(this, obj);
}

Конктерно, undefined выдает метод this.options.get('synchAdd') в последней строчке _addClusterToMap, _removeClusterFromMap тоже выдает такую ошибку, но я дебажить не стал, потому что это выше моего понимания. Скригшот ниже.

Так же, кластер, который раньше работал, теперь перестал добавляться на карту. Просто не работает. Если те же метки выводить без кластера - все отображается отлично, хотя и медленно - их около 1800. От количества это не зависит - я ограничивал количество меток в кластере до 300 - то же самое.

 

Вопрос - что-то поменялось в процессе создания кластера? Ибо в код изменений гарантированно  не вносилось, выдача с сервера - корректная, ибо все placemarks выводятся корректно и я делал дебажный вывод их координат для визуальной проверки. А проект работать - перестал. Гуру - поможите, постичь весь код Яндекс Карт у меня мозгов не зватит!

 

Заранее спасибо!

 

11 комментариев

Сейчас кластеризатор требует, чтобы объекты-кластеры содержали массив геообъектов в поле properties. Это незадокументировано и будет исправлено. Вы видимо каким-то образом подменяете наши стандартные кластеры на свои метки?

На первом экране, при загрузке - да, просто сделал картинки для плейсмарков, похожие на кластеры.

 

А что будет исправлено - реализация, или документация? Как теперь добавлять плейсмарки в кластер?

Что-то точно будет исправлено)) Сейчас обходной маневр - это класть в поле properties ваших кластеров массив.

А можно пример, а то я что-то уже ничего не соображаю... как это - класть в поле properties?

Мы ввели опции кластеризатора maxZoom и minClusterSize. Кажется, что если вы будете их использовать, можно будет не переопределять метод createCluster, и проблема уйдет автоматически.

var cluster = new ymaps.Clusterer();cluster.options.set({gridSize: 70});cluster.createCluster = function (center, geoObjects) {if ((myMap.getZoom() < 15) && (geoObjects.length > 2)) {return ymaps.Clusterer.prototype.createCluster.call(cluster, center, geoObjects);}// если меток мало или зум большой, вместо кластера вернем коллекцию геообъектов. var collection = new ymaps.GeoObjectCollection();for (var i = 0, l = geoObjects.length; i < l; i++) {collection.add(geoObjects[i]);}return collection;}Должно превратиться вvar cluster = new ymaps.Clusterer({gridSize: 70,maxZoom: 15,minClusterSize: 2});

Помогло, спасибо!

Для этого проекта эти опции не подойдут - мне нужно ПОЛНОСТЬЮ УБИРАТЬ плейсмарки с карты при мелком зуме и ставить на их место полигоны в псевдо-кластерами. И при наезде мышкой - отключать полигоны и добавлять кластеры.

 

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

 

Как я понял, поменялся способ добавления плейсмарков в кластер - вы не могли бы продемонстрировать, как теперь это выглядит?

Вы не подскажете, где код, который убирает плейсмарки с карты при мелком зуме? Я посмотрела только код в файле script.js и привела, как он должен выглядеть после изменений.

А напишите мне, пожалуйста, когда запуститесь. Хочу ваш сайт в примеры добавить :-)

Судя по всему заработало.

 

Но малость не интуитивно понятно, что именно помещается в кластер.

Пример: по клику на кластер содержащий три элемента переходим на масштаб карты с двумя элементами, и только прокликав оба становится понятно откуда цифра три - один из двух элементов(бордов) двухсторонний.