Клуб API Карт

Как динамически пересчитать кластер?

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

У меня есть код:

 

ymaps.ready(function () {
var fogMapObj = new ymaps.Map('FogMap', {
center: [55.75297465912611,37.61803561040902],
zoom: 16
});
ymaps.modules.require(['PieChartClusterer'], function (PieChartClusterer) {
var clusterer = new PieChartClusterer();
var points = [
new ymaps.Placemark(
[55.74982352643523,37.613402583967414],
{hintContent: '563ddfbbcc711',
balloonContent: 'Офис 3
Описание'},
{preset: 'islands#blueIcon'}
),
new ymaps.Placemark(
[55.75236261864717,37.61984504827751],
{hintContent: '563ddfeb6fd85',
balloonContent: 'Новый офис
Описание'},
{preset: 'islands#redIcon'}
),
new ymaps.Placemark(
[55.75201775477064,37.61714680404543],
{hintContent: '563ddff4eeafd',
balloonContent: 'Кремль
Описание'},
{preset: 'islands#yellowIcon'}
),
new ymaps.Placemark(
[55.75020945480227,37.61559748067592],
{hintContent: '563e30394497d',
balloonContent: 'Большой Кремлевский Дворец
'},
{preset: 'islands#orangeIcon'}
),
new ymaps.Placemark(
[55.75146382894186,37.61749058041408],
{hintContent: '56405bf8a14ba',
balloonContent: 'Собор 12 апостолов
Описание'},
{preset: 'islands#greenIcon'}
),
new ymaps.Placemark(
[55.754652958805444,37.62159018255285],
{hintContent: '56405c4f51737',
balloonContent: 'Пятерочка 555
Пять пять'},
{preset: 'islands#yellowIcon'}
),
new ymaps.Placemark(
[55.75553288033185,37.61732143695668],
{hintContent: '5640634f73440',
balloonContent: 'Исторический музей
Описание'},
{preset: 'islands#orangeIcon'}
),
new ymaps.Placemark(
[55.75258307446045,37.6152132355385],
{hintContent: '5641e229ea9ec',
balloonContent: 'Метка с ссылкой
Пример ссылки: Кликни меня нежно'},
{preset: 'islands#greenIcon'}
),
new ymaps.Placemark(
[55.75156037959687,37.615534727638114],
{hintContent: '5641e539dd2ac',
balloonContent: 'Новая метка
Наш новый офис'},
{preset: 'islands#yellowIcon'}
),
];
clusterer.add(points);
fogMapObj.geoObjects.add(clusterer);
fogMapObj.controls.remove('searchControl');
fogMapObj.controls.remove('mapTools');
fogMapObj.controls.remove('typeSelector');
fogMapObj.controls.remove('trafficControl');


//Костыль

function actualizeGeoObjectByHintID(hintID,markStyle){
fogMapObj.geoObjects.each(function (geoObject) {
var insideGeoObj = geoObject.getGeoObjects(); //Список меток
for (var i in insideGeoObj){
if(insideGeoObj[i].properties.get('hintContent') == hintID) {
//console.log("[DEBUG] Найден обьект на карте с ID: " + hintID + " !");
//console.log("[DEBUG] Установка новых параметров");
insideGeoObj[i].options.set('preset',markStyle);
//insideGeoObj[i].options.set('showHintOnHover',false);
}
}
});

}

var jsonDataString = 'getAllMarksIDs=act';
var arrIDs;
var markParam;
//Получаем список всех ID



var timer;
var seconds = 10; // Частота обновления карт

setInterval(function(){
console.log("[DEBUG] Запуск триггера обновления меток");


$.ajax({
type: 'POST',
url: 'ajax.php',
data: jsonDataString,
dataType: 'json',
success: function (data) {
//console.log("[DEBUG] AJAX Performed success.");
},
error: function (xhr, status, error) {
alert("[ERROR]" + xhr.responseText);
}
})

.done(function (data) {
//console.log("[DEBUG] Получили из БД массив с ID, пробегаемся по массиву");
arrIDs = data.split(";");
for (var i in arrIDs){
markParam = arrIDs[i].split("@");
//markParam[0] - ID, markParam[1] - Style!
//console.log("[DEBUG] Элемент: " + i + " равен: " + arrIDs[i] );
//console.log("[DEBUG] У него ID: " + markParam[0] + " и Style: " + markParam[1] );
//console.log("[DEBUG] Ищем его метку на карте!");
actualizeGeoObjectByHintID(markParam[0],markParam[1]);
}

});
//return false;
},seconds*1000);
// /Костыль
});
});

 

 

Который работает с разрешением: https://github.com/yandex/ymaps-pie-chart-clusterer (Да, issue создано от меня).

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

 

4 комментария

Попробуйте все метки, которые изменились, собрать в массив, удалить и заного добавить в кластеризатор.

Большое Вам человеческое спасибо. Работает!

Заметил проблему: кластер, содержащий серые (islands#grayIcon) метки не отрисовывает их на себе (часть пирога на кластере, содержащая серые метки белая)

 

Заметил проблему: кластер, содержащий серые (islands#grayIcon) метки не отрисовывает их на себе (часть пирога на кластере, содержащая серые метки белая)

Можете выложить минимальный пример, воспроизводящий проблему на jsfiddle.net

Я у себя не смог воспроизвести