Клуб API Карт

Кластеры перекрывают друг друга

enoff.php
17 декабря 2014, 07:55

Здравствуйте. Есть набор кластеризаторов (использую ObjectManager), соседние элементы наезжают друг на друга.

Нужно соседствующие кластеры немного отодвинуть. 

 

В одном из топиков клуба (http://clubs.ya.ru/mapsapi/replies.xml?item_no=52054) встретил ответ, что это невозможно сделать. PieChart кластеры не подходят.

 

Но мне жизненно необходимо выполнить эту задачу.

 

Можно ли как-то перегрузить метод АПИ? Нужно ведь всего лишь проверить пересечение элементов и чуть сдвинуть.

 

Если нет, то у меня были такие мысли: при отрисовке проходить по DOM-элементам, и через css двигать их.

Но есть проблема - как я понимаю, события (клик, наведение) ловятся не через элементы на карте (нашел элемент ymaps[class="events-pane"]), а каким-то другим способом, мне неизвестным. И соответственно, как повлиять на этот механизм - не знаю.

 

Можно ли придумать выход из ситуации (предложенный мной, или любой другой костыль)?

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

Попробуйте увеличить значение опции margin https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Clusterer-docpage/#param-options.margin

 

Тогда кластеры будут больше прибиты к центру ячейки кластеризации

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

А у вас именно набор разных кластеризаторов?

Да. Есть разные наборы точек, для каждого типа точек свой кластеризатор. И у каждого кластеризатора своя иконка.

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

Может все-таки можно как-то извратиться и решить проблему?

Один вариант я описал - пройтись по DOM-елементам и подвинуть их. Но клик по элементу не будет работать (более того, зона клика останется на прежнем месте).

Можно ли повлиять на это поведение? Либо на сам механизм, либо может сделать перекрытие еще одним слоем и управлять самостоятельно поведением.

Либо, что было бы проще всего, перегрузить метод из АПИ (который отображает кластер) и в нем корректировать координаты кластеров. (например, по аналогии с перегрузкой конструктора кластера, чтобы менять иконки в зависимости от количества объектов. Использовал данный подход в версии 2.0)

Можно слушать событие add на коллекции objectManager.clusters

и для каждого добавляемого кластера менять координаты

Здравствуйте. Спасибо большое за помощь.

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

 

objectManager.clusters.events.add('add', function(e) {
e.get('child'); // объект со свойствами (только для чтения)
}); 

https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/objectManager.ClusterCollection-docpage/
В документации вначале про это сказано.

Можно как-то поменять координаты у кластера? 

var cluster = e.get('child') в данном случае будет просто объектом с полями, вот можно взять и переписать значение cluster.geometry.coordinates

Изменение cluster.geometry.coordinates не влияет на кластер.

А у меня на стенде работает http://jsfiddle.net/7s2un7ty/