Панорамирование карты до определенной степени javascript API

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

Я пробовал следовать, но ничего не изменилось:

map = new Map( "map" , {
        basemap: "gray",    
        center: [-85.416, 49.000],
        zoom : 6,
        logo: false,
        sliderStyle: "small"
    });


    dojo.connect(map, "onExtentChange", function (){
    var initExtent = map.extent;
    var extent = map.extent.getCenter();
    if(initExtent.contains(extent)){}
    else{map.setExtent(initExtent)}
    });

person John Macl    schedule 18.03.2014    source источник
comment
Я бы обновил заголовок вашего вопроса, чтобы лучше отразить ваш настоящий вопрос. Похоже, вы хотите вручную панорамировать карту, но вы действительно хотите ограничить возможность пользователя панорамировать карту.   -  person Aaron    schedule 18.03.2014
comment
Привет, Аарон, я протестировал ваш код по этой ссылке: jsfiddle.net/bbunker/JP565, но это продолжает бесконечный цикл в разделе if (outOfBounds). Как мне этого избежать?   -  person John Macl    schedule 22.03.2014
comment
Джон, мой подход был не совсем лучшим. Это не ограничивает панорамирование. Лучшим подходом было бы использовать эти свойства инициализатора, затем установить максимальный экстент, а в onExtentChanged карты убедиться, что экстент карты не вышел за пределы установленного вами максимума.   -  person Aaron    schedule 22.03.2014


Ответы (3)


Просто чтобы несколько конкретизировать ответ Саймона и привести пример. В идеале вам нужны две переменные из той же области, что и map:

initExtent, чтобы сохранить границы вашего действительного экстента, и

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

Я также использовал новый синтаксис событий dojo.on для этого примера, вероятно, было бы неплохо перейти к нему в соответствии с рекомендациями документации - я предполагаю, что ESRI в какой-то момент прекратит использование старого стиля.

var map;
var validExtent;
var initExtent;

[...]

    require(['dojo/on'], function(on) {
        on(map, 'pan', function(evt) {
            if ( !initExtent.contains(evt.extent) ) {
                console.log('Outside bounds!');
            } else {
                console.log('Updated extent');
                validExtent = evt.extent;
            }
        });

        on(map, 'pan-end', function(evt) {
            if ( !initExtent.contains(evt.extent) ) {
                map.setExtent(validExtent);
            }
        });
    });

Вы можете сделать то же самое с событиями масштабирования или использовать extent-change, если хотите захватить все. Вам решать.

person Juffy    schedule 19.03.2014
comment
Я использовал ваш подход, и он работает хорошо, кроме одного. Он бесконечно загружается после того, как кастрюля закончится. Как я могу решить эту проблему. - person John Macl; 20.03.2014
comment
Хммм ... Я не могу повторить это - мой запускает pan-end, серию pan, когда он возвращается к validExtent, затем еще pan-end. Проверено в IE9 и Chrome. - person Juffy; 21.03.2014

Похоже, ваша функция изменения экстента устанавливает переменную начального экстента для текущего экстента карты, а затем проверяет, содержит ли этот экстент текущую центральную точку экстента - что, конечно, всегда будет.

Вместо этого объявите initExtent в той же области видимости переменной карты. Затем измените событие при загрузке, чтобы установить эту глобальную переменную области, а не локальную переменную. В функции изменения экстента не обновляйте значение initExtent, просто убедитесь, что initExtent содержит весь текущий экстент.

В качестве альтернативы вы можете сравнить каждую границу текущего экстента с каждой границей initExtent, например. - это initExtent.xmin ‹map.extent.xmin, и если есть, создайте новый экстент, установив любые превышенные границы для значений initExtent.

Единственная проблема заключается в том, что эти методы позволят на короткое время превысить initExtent, но затем вернут экстент назад, как только функция измененного экстента сработает и догонит.

person Kate    schedule 18.03.2014