Клуб API Карт

Меню и кластеризация

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

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

points[idx].balloon.open();

но, если точка в кластере, то определить-то это я смог:

 

var geoObjectState = cluster.getObjectState(points[idx]);
if (geoObjectState.isClustered) {
    ...
}

 

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

Буду очень признателен за правильное направление движения к решению.

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

Вы можете выставить кластеризатору опцию

openBalloonOnClick: false

А чтобы открыть балун метки, надо знать на какую метку кликнули,

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

Соответственно непонятно какой балун надо открывать.

Все точки есть, попробую на примере пояснить http://igordev.ru/Devices/FishingMapTest.html

Если жмем справа от карты на Майские карьеры, то точка не в кластере и ее балун открывается нормально, если жмем на Янтарное 1, которая в кластере, то вылетит, надо сначала приблизить, чтоб точка выскочила из кластера.... Понятно, что можно проверить в кластере она или нет, если в кластере то изменить зум, еще проверить и в конце концов открыть балун, но если есть возможность сэмулировать клик на метке кластера, который уваличивает как надо и выводит метку из кластера, то это проще и логичнее кажется.... Естественно через балун кластера можно получить список точек, но мне не нужен список, мне надо приблизить и открыть балун, точка известна, вопрос именно как это оптимально сделать.

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

Посмотри как это сделано в этом примере из блога.

Артём Ершов
28 января 2016, 02:13

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

Я сделал так - сначала вручную центрировал на точке и поставил крупный масштаб, чтобы прилизить ккарту и точка выпала из кластера. Но почему то сразу после масштабирования она определяется ещё в кластере, поэтому я масштабирую ещё раз и в callback проверяю на вхождение в кластер и открываю либо балун, либо всё же кластер (если точки оказались с одинаковыми координатами)

без костылей решается по приведенной мной ссылке.

нужно слушать событие кластеризатора 'objectsaddtomap'

я смотрел пример 2, где показано использование 'objectsaddtomap' отсюда http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/Clusterer.xml 

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

не нравится стандартный балун, создай свой.

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

Я заметил одну странность, если метка в кластере, центрирую по ней карту, увеличиваю масштаб, проверяю выпала она из кластера или нет, если нет продолжаю приближать если да, то пытаюсь открыть балун метки (не кластера!!!) и вот это открытие балуна сразу не отрабатывает, где-то в недрах API вылетает. Ты решал это пробему и как решил?

Иными словами, при приближении карты и выпадении метки из кластера, сразу не выходит выполнить

points[idx].balloon.open() ;

это костыли. надо не руками приближать, а  триггерить событие клика на метке кластера, при выключенной опции openBalloonOnClick, и когда кластеры пересчитаются (событие) открывать балун метки

Про асинхронность и слушанье 'objectsaddtomap' на свежую голову действительно стало все на свои места... спасибо, попробовал-побаловался, теперь вроде все по полочкам сложилось.

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

Да все просто:
у кластера есть поле "events"
http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/Cluster.xml
там живет экземпляр менеджера событий.
тыцаешь на ссылку в доке и смотришь его методы. Тебе нужен метод "fire"

типа того:
geoObjectState.cluster.events.fire("click");
может еще чтото надо будет в обработчик пробрасывать (вторым пареметром после имени события), но может и так сработает

Спасибо, понял и проверил... там оказалось тоже не все просто, надеялся в 2 строчки реализовать, но оказывается вызов fire не гарантирует выход точки из кластера, так как она может оказаться после fire в другом, внутреннем кластере, получается fire влечет цикличность вызова fire, но в принципе работает и через fire и через зуммирование.

Еще раз спасибо!!!

я сделал так: www.pomnivoinu.ru/map

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