Клуб API Карт

кластеризатор

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

и два вопроса по нему.

 

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

 

2. Возможно ли получить на маркере событие "попал в кластер" (ну и "вышел из кластера" при нулевом флаге)

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

1. Задешево можно только заменить функцию createCluster. Она получает на вход массив кластеров, которые попадают в ячейку кластеризации и создает кластер.

Существенно переделать алгоритм кластеризации не получится - нужно по сути писать новый кластеризатор.

2. Событий такого рода нет. Можно узнать, откластеризован объект или нет, используя метод getObjectState. Или можно опять же переопределить функцию createCluster и отслеживать, какие маркеры через нее проходят, а какие нет.

>можно только заменить функцию createCluster.

а смысл? Она же получает готовый массив маркеров, а решение принимается ДО того!

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

> Можно узнать, откластеризован объект или нет

Это понятно, только на каждый чих перебирать все маркеры - быстродействие не добавляет.

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

> опять же переопределить функцию createCluster

ну она у меня и так уже переопределена, так что придется идти этим путем. Из минусов - нужно все равно перебирать ВСЕ маркеры после окончания кластеризации, чтобы поймать те что в кластеры не вошли...

Кстати, событие objectsaddtomap случается после окончания кластеризации?

Не поняла, что значит фраза "кластеры меняют расположение". Сетка накладывается относительно глобальных пиксельных координат и не сдвигается при изменении видимой области карты.

 

А для чего вам нужно знать, когда объект попал в кластер, если не секрет?

 

По умолчанию объекты в кластере добавляются на карту пачками асинхронно, после добавления всех объектов и кидается событие objectsaddtomap.

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

 

>для чего вам нужно знать

для того чтобы скрыть-показать связанную с маркером информацию

>По умолчанию объекты в кластере добавляются на карту пачками асинхронно, после добавления всех объектов и кидается событие objectsaddtomap.

это замечательно, но все же... Это происходит до того как отработал алгоритм кластеризации или после того?

 

из фразы "объект добавлен на карту" невозможно сделать однозначного вывода - то ли объект добавлен в коллекцию геообъектов карты, то ли уже сосчитан и отрисован на карте.

Или... неужто у вас это синхронно происходит?

 

 

для того чтобы скрыть-показать связанную с маркером информацию

Ну а проблема то в чем? Скрывайте. Возможность узнать добавлен ли маркер в кластер есть. Вот пример того как показать статусы всех объектов в кластеризаторе.

 

из фразы "объект добавлен на карту" невозможно сделать однозначного вывода - то ли объект добавлен в коллекцию геообъектов карты, то ли уже сосчитан и отрисован на карте.

Или... неужто у вас это синхронно происходит?

кажется выше уже сказали, что "объекты добавляются на карту пачками асинхронно". После того как все кластеры добавлены и отрисованы кидается событие. Если надо добавлять синхронно, можно выставить кластеризатору опцию synchAdd

 

>кажется выше уже сказали

тяжелый случай... кажется я выше уже пояснил, что нуждается в уточнении ЧТО ИМЕННО тут имеется в виду под "добавили объекты на карту".

 

тяжелый случай... кажется я выше уже пояснил, что нуждается в уточнении ЧТО ИМЕННО тут имеется в виду под "добавили объекты на карту".

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

 

Мне сложно представить как и зачем объекты могут добавляться на карту до того как отработал алгоритм кластеризации.

Очевидно что это происходит после.

 

Обратите внимание - это не я сказал что у вас кластеризатор плохой :) Я говорил что другой...

Но если на то пошло - да, алгоритм "в клеточку" проигрывает по результатам честному DSU, хоть тот и помедленней.

>Мне сложно представить как и зачем объекты могут добавляться на карту до

Воот - у каждого свой опыт. После "кишков" гуглевского кластеризатора мне такое и представлять не надо - там маркеры по очереди вываливаются на карту, при этом загоняясь в ближайший кластер (или создавая новый), а если кластер вырастает больше определенного предела, то с карты удаляются. Поэтому-то и поинтересовался уточнением B-)


ок, не плохой, он "некузявый" =)
В чем проигрывает алгоритм?

Основное отличие - когда скопление маркеров оказывается как раз на углу решетки, "клеточка" дает 4 независимых кластера, DSU - один.

Со скаканием маркеров ничего сделать нельзя - алгоритмы кластеризации принципиально разные. 

Остальные проблемы вроде бы решены в нашем примере. Посмотрите, если будут вопросы - отвечу.

к маркерам приписал событие "visibilityChanged" a la google, а про борьбу с "разными алгоритмами кластеризации" как раз и был исходный вопрос...

Значит переписывать кластеризатор :(

Что делать чтобы самописный выступил источником объектов для карты я вроде разобрался, а вот можно ли ли использовать ymaps.Clusterer.prototype.createCluster чтобы отображать самодельный кластер? Дабы не возиться со слоями и прочей геометрией...

 

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

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

 

Никаких особо проблем быть не должно. Могут быть накладки с опциями по умолчанию. Но они должны порешиться, если сделать cluster.options.setParent(map.options). Ну а так да, надо уже на месте смотреть.