Клуб API Карт

Вертикальное ограничение restrictMapArea

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

Возможно ли ограничить карту restrictMapArea только в вертикальной прокрутке?

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


В данный момент я ограничил карту так: restrictMapArea: [[-85, -179.9], [85, 179.9]]

Но заказчик хочет оставить горизонтальный скролинг убрав только вертикальный.

3 комментария

Сейчас через опцию restrictMapArea так сделать не выйдет. Но вы можете установить функцию-фильтр на движения карты - http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/map.action.Manager.xml#setCorrection.

+1, с помощью setCorrection не так сложно реализовать. Алгоритм примерно такой:
получаете размер контейнера (myMap.container.getSize()), прибавляете к центру (tick.globalPixelCenter) половину высоты контейнера = верхняя граница текущего тика. Если она выходит за Вашу верхнюю границу (а это, например, myMap.options.get('projection').toGlobalPixels([85, 179.9], tick.zoom), то оставлять его на верхней точке с широтой ограничения и долготой центра текущего тика. В конце возвращаете откорректированный тик.
Владислав Турман
28 января 2016, 02:36

 Получилась такая вот хреновина. Вроде работает =)

 

      myMap.action.setCorrection(function (tick) { // проверка передвижения экрана, не пускает выше и ниже карты (там где уже нет тайлов)

            var projection = myMap.options.get('projection');

            var mapSize = myMap.container.getSize();

            var tickCenter = projection.fromGlobalPixels(tick.globalPixelCenter, tick.zoom);

            var top = [tick.globalPixelCenter[0], tick.globalPixelCenter[1] - mapSize[1] / 2];

            var bot = [tick.globalPixelCenter[0], tick.globalPixelCenter[1] + mapSize[1] / 2];

            var tickTop = projection.fromGlobalPixels(top, tick.zoom);

            var tickBot = projection.fromGlobalPixels(bot, tick.zoom);

            if (tickTop[0] > 85) {

                tick.globalPixelCenter = projection.toGlobalPixels(

                    [85, tickCenter[1]],

                    tick.zoom

                );

                tick.globalPixelCenter = [tick.globalPixelCenter[0], tick.globalPixelCenter[1] + mapSize[1] / 2];

                tick.duration = 0;

            }

            if (tickBot[0] < -85) {

                tick.globalPixelCenter = projection.toGlobalPixels(

                    [-85, tickCenter[1]],

                    tick.zoom

                );

                tick.globalPixelCenter = [tick.globalPixelCenter[0], tick.globalPixelCenter[1] - mapSize[1] / 2];

                tick.duration = 0;

            }

            return tick;

        });