Клуб API Карт

RemoteObjectManager и два вида кластеров

wiistriker.k
8 апреля 2016, 19:35

Реализовываю серверную кластеризацию. Для большого zoom карты запрашиваю только grid с количеством данных в каждой ячейке и генерирую JSON с кластерами. Конкретные объекты для построения карты не запрашиваю.

Когда пользователь приблизился к участку карты, то grid не запрашиваю, выбираю из БД уже конкретные объекты на карте и, так как ROM не поддерживает кластеризацию на стороне клиента, то пробегаюсь еще раз по массиву объектов на сервере и группирую объекты по координатам. Далее эти группы формируют уже новые кластеры.

Итого есть кластеры просто с количеством объектов для большого zoom (массив features у кластера пустой)

И кластеры с конкретными гео-объектами для отрисовки на карте. Если координаты совпадают, то такие объекты образуют кластер (массив features не пустой).

objectManager = new ymaps.RemoteObjectManager(url + '&bounds=%b', {
    geoObjectBalloonContentLayout: goodsBalloonContentLayout,
    clusterBalloonItemContentLayout: goodsBalloonContentLayout,
    clusterDisableClickZoom: true
});

Для каждого из вида кластеров хотелось бы различного поведения при клике:

1) Для кластера на большом зуме нужно делать приближение области карты

2) Для кластера конкретных гео-объектов необходимо раскрывать балун с содержимым.

Поэтому clusterDisableClickZoom: true и кастомный обработчик клика:

objectManager.clusters.events.add('click', function (e) {
    var objectId = e.get('objectId');

    if (objectId.indexOf('pc_') == 0) {
        objectManager.clusters.balloon.open(objectId);
    } else {
        var cluster = objectManager.clusters.getById(objectId);
        map.setBounds(cluster.bbox);
    }
});

Все работает, кроме того, что балун кластера пустой, несмотря на то, что параметр clusterBalloonItemContentLayout проставлен. Балун для обычной метки тоже работает.

Пробовал отключать серверную кластеризацию и сделать то же самое на LoadingObjectManager с включенной кластеризацией на клиенте - балун работает. Что я упустил?

Первый вопрос в том, куда копать по вопросу отсутствия контента в балуне?

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

3 комментария
Подписаться на комментарии к посту
Зачем эти пробеги по массиву? Долго и не держит это нагрузку. Кластеризуйте сразу на уровне запроса в БД.

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

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