Клуб API Карт

Изменить активную область карты

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

Добрый день, очередной вопрос по реализации, посоветуйте.

 

Есть значит область карты, допустим даже на весь экран.

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

 

так вот, как сделать чтобы активная область стала только вторая половина экрана, чтобы когда я допустим делал map.setCenter, то он ставил бы ее посередине правой половины, а не посередине всего экрана? соответсвенно и со всеми остальными фишками, чтобы когда кластер распадается он подбирал зум таким образом, чтобы точки из кластера попадали только в правую половину?

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

"Из коробки" вы такое поведение получить не сможете. Надо будет в нужных местах переписывать код самостоятельно.

а не подскажете в каких именно и куда смотреть? может быть какой-то метод переопредлить или событие или еще что-то?

Ну например при клике на кластер.

Нужно выставить опцию disableClickZoom в false, чтобы не срабатывало автоматическое приближение.

Затем нужно слушать клик на кластерах

clusterer.events.add('click', function (e) {

    if (!e.get('target').getGeoObjects) {

    // Проверяем, на кластере или на метке был клик. Если на метке - игнорируем.

       return';

    }

    if (e.isDefaultPrevented()) {

                return;

            }

            // если зум карты максимально возможный, то вместо зума откроется балун.

            if (map.getZoom() == map.zoomRange.getCurrent()[1]) {

                return;

            }

            //  Получим границы, содержащие точки кластера в геокоординатах

           var clusterBounds = e.get('target').getBounds();

 

            var projection = map.options.get('projection'),

                 // получаем размер контейнера карты

                  fullContainerSize = map.container.getSize(),

                // получаем размер видимой области карты (из рассчета, что он ровно в 2 раза уже)

                  visibleContainerSize = [fullContainerSize[0] / 2, fullContainerSize[1]];

 

            var location = ymaps.util.bounds.getCenterAndZoom(

                clusterBounds,

                visibleContainerSize,

                projection, {

                    // Тонкости, чтобы хорошо работала опция zoomMargin

                    preciseZoom: !map.options.get('avoidFractionalZoom'),

                    margin: e.get('target').options.get('zoomMargin', 0)

                }),

                // Нам надо сдвинуть полученный центр, чтобы метка оказалась посередине видимой области, а не на границе

                globalPixelLocation = projection.toGlobalPixels(location.center, location.zoom),

                correctedPixelLocation = [globalPixelLocation[0] - visibleContainerSize / 2, globalPixelLocation[1]];

          // Выставляем параметры карте

            map.setGlobalPixelCenter(correctedPixelLocation, location.zoom, { checkZoomRange: true });

          // Вызываем preventDefault, чтобы не открылся балун.

            e.preventDefault();

});

спасибо большое, в понедельник попробую прикрутить к нашему сервису, посмотрим  что получится.

Добрый день, вроде все получилось, только есть пара вопросов

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

 if (e.isDefaultPrevented()) {

                    //return;

  }


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

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

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

http://ymapsapi.ya.ru/replies.xml?item_no=1230