Клуб API Карт

Ограничение области просмотра

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

Как в API 2.x ограничить область просмотра?

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

16 комментариев
Евгений Закиров
28 января 2016, 04:10

присоединяюсь к вопросу ;) не хочу чтобы посетители сайта знали, что за пределами города есть жизнь!

правильно это сделать относительно сложно.

когда что-то хочет куда-то сдвинуть карту - на map.events происходит событие actiontick

из него можно вытащить event.get('action') и немного подправить.

у него есть поля globalPixelCenter и zoom и если следить чтобы эти значения не уходили за некие пределы можно и получить кофетку.

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

            myMap.events.add('actiontick',

                function(e) {

                    var action = e.get('action');

                    if(action._actionManager._zoom == 14) {

                      if(action._actionManager._globalPixelCenter[0] < 2450068.73)

                        action._actionManager._globalPixelCenter[0] = 2450068.73;

                    }

                }

            ) ;

 

И т.д. с if ами, правильно?

action.zoom

action.globalPixelCenter

в поля с "педалями" забираться нельзя. Если жить охота :P

Так как же быть?o_O

console.log(action.globalPixelCenter);

console.log(action.zoom);

 

Вывод: 

undefined

undefined

Как сделать без педалек? Пожалуйста подскажите! :(

Моя ошибка - надо было брать из ивента e.get('tick')

В нем правильные данные переносятся.

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

Сейчас чтобы "работало" требуется совершить "очень страшную операцию"

 

 


        var oldExecute = map1.action.execute, //old function
                currentAction = 0; // current action

        function correct (event) {
            var tick = event.get('tick');
            //correctTick
            tick.globalPixelCenter=[tick.globalPixelCenter[1],tick.globalPixelCenter[0]];
        }

        map1.action.execute = function (action) {
            if (currentAction) {// delete old events
                currentAction.events.remove('tick', correct);
            }
            //очень важно подписаться первым
            action.events.add('tick', correct);
            oldExecute.call(this, action);
            currentAction = action;
        };

А зачем менять местами элементы globalPixelCenter?

 

тут - ради интереса.

И почему нельзя просто сделать следующим образом?

 

myMap.events.add('actiontick',            function(e) {                var action = e.get('tick');                console.log(action);            }        );
Object
  1. duration: 0
  2. globalPixelCenter: Array[2]
    1. 0: 2452852.562467451
    2. 1: 1417962.8898675637
  3. timingFunction: "linear"
  4. zoom: 14

 

Так сделать можно, чтобы посмотреть.

При этом нельзя правильным образом подправить этот tick

Для этого надо быть уверенным что вы сделаете это первым( в общем случае это не так )

Владислав Турман
28 января 2016, 04:10
И все-таки нашелся-ли способ ограничить область показа ?

 

Прямо сейчас правильно нельзя написать этот пример

Можно сделать так, чтобы карта панилась обратно при выходе за границы, но это кривая реализация

 

Мы про этот кейс знаем и помним

Будет либо готовое решение ввиде готовой опции у карты, либо "правильный" пример от нас.

 

Владислав Турман
28 января 2016, 04:10
спасибо за ответ. Реализовал "кривой реализацией".
вешаюсь на эвент boundschange и если вышел за границу, то возвращаю обратно. Сразу же появилась бага, из-за которой при изменении зума нас возвращало обратно в предыдущий зум, но все это пофиксил пока ждал ответа в этой теме.

Думаю, пока сойдет. И буду ждать правильный вариант.
Максим Кропачев
28 января 2016, 04:10

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

да, в последней версии АПИ (2.0.24) появилась опция restrictMapArea

http://api.yandex.ru/maps/doc/jsapi/2.x-rc/ref/reference/Map.xml