Клуб API Карт

Диспетчер объектов и их группировка

haliullin.danil
4 апреля 2011, 10:43

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

Стоит такая задача: имеются N точек на карте с координатами. Многие точки располагаются рядом, и поэтому при определенном масштабе хотелось бы заменять их все на одну иконку. Понимаю, что нужно это сделать с помощью диспетчера объектов (http://api.yandex.ru/maps/jsapi/doc/dg/concepts/objects_manager.xml), но в указанном примере координаты метки-заменителя известны заранее. Полагаю, что мне нужно как-то определять эти координаты по группе меток, которые я хочу заменить. Вот этого я и не понимаю, видел подобные работы на сайтах, может кто-то объяснит принцип работы или покажет пример, буду очень благодарен.

2 комментария
Подписаться на комментарии к посту

Добрый день,

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

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

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

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

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

Это сильно в общем, дальнейшая конкретика зависит от метода кластеризации и от необходимой функциональности кластеризатора.

спасибо)