Клуб API Карт

Работа с кластеризатором

d.pashkevich
20 апреля 2012, 17:22

Есть тысяча объектов... Выводятся с помощью кластеризатора... 

Часть из них сгруппирована, часть нет...

 

Задача: по нажатии на ссылке вне карты открыть баллун заданной метки.


marker_array[id].balloon.open() - работает для меток, которы не состоят в кластере...

 

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

Узкое место при кластеризации объектов - это добавление их на карту. Для того, чтобы добавление меток не вешало браузер, кластеры добавляются пачками по таймауту.

 

Как быть?

  

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

Есть 2 пути.

1. Открывать балун на кластере, в котором состоит метка. Если этот вариант подойдет, то я могу подробнее описать, как это делается.

2. Открывать балун на метке, когда она не попадет в кластер.

 

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

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

да и вариант когда балун открывается только тогда, когда  метка не в кластере, тоже не подходит...:( 

Получается нужно делать самостоятельно зум и делать таймаут для функции открытия балуна?

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

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

2. Можно открывать балун от этой метки просто на карте - map.balloon.open()

3. Можно зумиться до уровня, когда метки гарантированно не в кластере и открывать балун по событию на метке 'mapchange'.

1.2. - без зума это не подойдет... 

3. Вы про этот mapchange?
http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/Placemark.xml 

Сменилась карта. Поля данных:

  • oldMap - старая карта;
  • newMap - новая карта.

Унаследовано от IParentOnMap

 

Судя по описанию больше подходит на отслеживание изменения родительского объкта:
http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/IParentOnMap.xml 

Есть 2 типа событий - parentchange и mapchange.

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

Второй как раз о смене карты.

Так что это как раз ваш вариант :)

Формулировка странная меня сутила - "смена карты", "старая карта", "новая карта".. карта же у нас та же самая остается... а вот ее содержимое меняется...

 

Сделал пример для примера:
http://hyperlink.com.ua/cluster.html

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

При зуме метки удаляются с карты - кидается mapchange, а потом снова добавляются на карту - снова кидается mapchange.

Чтобы поймать нужный, надо проверить поле события event.get('newMap'). Если оно не равно null, то объект был добавлен на карту.

Возможно будет понятней задача, если открыть рабочий проект:
http://kartadomov.com/#search[city=Киев;plus_area=10;type=1;operation=3;map_center=30.5327,50.4028;map_zoom=10]