Клуб API Карт

перерисовка объектов в кластере

Пост в архиве.
Добрый день.
Создаю кластер с объектами

потом убираю некоторые объекты по определенному признаку таким образом:


cluster.each(function(i){
  if (i.options.get('id')==id) {
   i.options.set('visible',false);
  }
});

делаю cluster.refresh()

а оно почему-то в сгруперованных балунах кол-во объектов не меняет
16 комментариев

Кластер не реагирует на изменении видимости геообъекта, поэтому количество элементов в группе не меняется.

А есть решение этой проблемы  ? Заранее спасибо
(объясню - есть слой с разными типами объектов) и мне надо определенный вид динамически отключать/включать

Вы можете удалять объекты из кластеризатора, а затем снова добавлять.

cluster.each(function(i){
cluster.remove(i)
}

что-то так не получается, i это у нас вообще что ? и как надо ?

У вас есть группа объектов, которые нужно удалить из кластеризатора. Либо вы просто перебираете ссылки на эти элементы и удаляете его из кластера clusterer.remove(geoObjects[i]).

Либо можно сформировать массив из геообъектов, которые нужно удалить, и удалить массив из кластеризатора целиком clusterer.remove(myArray);

Присоединяюсь к топикстартеру, ибо процедура удаления и последующего создания объекта в составе кластера весьма нагрузочная(особенно когда речь идет о десятках-сотнях) дабы ее использовать при фильтрации объектов на карте по какому-то внешнему признаку. Куда очевиднее временно скрывать через св-во visible метки в т.ч. и в составе кластера и заново отображать их когда нужно.

Мы экспериментировали с параметром visible в свое время. Он не сильно быстрее, чем операции add/remove, так как основное время съедается построением или удалением дом-ноды определенного геообъекта. А логическая операция "добавить элемент в кластер" занимает по сравнению с отрисовкой оооочень маленькое время.

Рекомендую проверить на более слабых компьютерах(до сих пор у посетителей даж одноядерные ПК часто встречаются) и на свежем FireFox особенно.

Само собой разумеется, что на производительных ПК разница в пару десятых секунды не особо ощутима пользователю. Ситуация меняется вкорне на более "древних" ПК.

PS Интересна к слову тестовая конфигурация ПК, что Вы используете для подобных сравнений производительности.

Если машина настолько древняя, что добавление объекта в кластер занимает какое-то значимое время, то скорее всего, браузер на этом компьютере отрисовку объектов на карте просто не переживет.

Ахахахааха )))

В утиль его, на гвозди!!!!11 =)

Давайте уже точнее с конфигурацией, я речь вел про Pentium E2140/2160 с 2ГБ ОЗУ и ФФ19, хотя и по слабее попадаются.

Обычный офисный ПК, давайте уже быть ближе к народу ибо мощные ПК многие косяки разработки прощает, но это не повод игнорить всех остальных.

PS Значительное время занимает именно пересоздание. При первом открытии страницы еще терпимо.

У меня dell core i5, но вы поймите, не в этом суть. Я сейчас приведу цифры для хрома.

Добавление 4000 меток в кластеризатор занимало 1050 мс (пишу в прошедшем времени, так как исследования делала давно).

Из них 24мс - это логическое добавление меток. 1032мс - отрисовка нод на карте. Отрисовка объектов в 50(!) раз дольше, чем помещение объекта в кластеризатор. Если даже мы сведем время, затрачиваемое на удаление-добавление объекта в кластеризатор, к нулю, мы сэкономим всего лишь 1/50 от общего времени.

Понимаете, с Хромом не совсем средний пример ибо он активнее использует многопоточность выжимая 90% ресурсов ПК мне же приходится ориентироваться на посетителей с долей от 5% аудитории, а к примеру ФФ это просто страшный сон по скорости обработки данных в сравнении даж с Оперой или Хромом.

Однако за точные цифры спасибо, позволяет сделать вывод о необходимости смены алгоритма.

Я к слову тоже попробовал исключить, а потом вновь добавить примерно 300 меток в кластер - печальное зрелище, Опера 12.12 к примеру просто "упала" на минуту примерно. Попробовал пересоздать теж 300 меток без кластера - быстрее, но всеж долго. Если же visible у меток менять на false, а затем на true то в пару десятков раза быстрее отработалось!

В общем ситуация такова: имеется для примера пара-тройка сотен объектов Placemark, которые включаются в кластер. Также имеется фильтр выводимых данных, в результате применения которого часть меток(а порой это 70%) необходимо скрыть на карте в т.ч. и в составе кластеров. Для некластеризованных меток видимость решает эту задачу, а в с кластеризованными просто "вешалка". Ибо порой совпадает так, что в рез-тате применения фильтра вывода меток нужно целый кластер ликвидировать или часть меток в его составе.

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

Ладно, уговорили, попробуем поэкспериментировать с видимостью объектов в кластере.

Спасибо большое заранее! Уверен, что и не только от меня)

Будем ждать хороших новостей.

Перерисовка объектов в кластере все так же дико грузит. Есть какие-то возможные способы оптимизации?