Javascript OpenLayers перед слушателем события увеличения масштаба

Я пытаюсь настроить OpenLayers так, чтобы не отображать векторный слой непосредственно перед началом масштабирования, и чтобы он снова появлялся после окончания масштабирования. У меня есть часть масштабирования уже установлена ​​следующим образом:

map = new OpenLayers.Map('map_element', { eventListeners: { "zoomend": mapEvent}});

function mapEvent(event) {
    if(event.type == "zoomend") {
        hide_vector_layer();
        }
}

Но я не вижу какого-либо слушателя событий для начала увеличения в документации. Существует "movestart", который охватывает перемещение, панорамирование и масштабирование. К сожалению, я не могу использовать "movestart", потому что я не хочу, чтобы слой исчезал во время панорамирования. Вы могли бы подумать, что будет "zoomstart", так как есть "zoomend".

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

Какие-либо предложения?

5 ответов

Решение

Для этого вам следует переопределить методы moveTo и moveByPx в OpenLayers.Map, чтобы исключить запуск события movestart для любых действий, кроме масштабирования.

Здесь легко добавить событие "BeforeZoom" в OpenLayers . Просто добавьте код ниже, где вы создали свой объект карты.

map.zoomToProxy = map.zoomTo;
map.zoomTo =  function (zoom,xy){
    //Your Before Zoom Actions

    //If you want zoom to go through call
    map.zoomToProxy(zoom,xy); 
    //else do nothing and map wont zoom
};

Как это работает:

Для любого вида масштабирования API OpenLayers в конечном счете вызывает функцию zoomTo. Поэтому, прежде чем переопределить его, мы копируем эту функцию в новую функцию с именем zoomToProxy. Мы переопределяем его и добавляем нашу логику условного масштабирования. Если мы хотим, чтобы увеличение происходило, мы просто вызываем новую прокси-функцию:)

У меня была та же проблема, что и у OP, и я пытался решить ее с помощью решения drnextgis. Но, к сожалению, это не совсем сработало: zoomChanged свойство в OpenLayers.Map.moveTo оценивается как true не только при изменении уровня масштабирования, но и при изменении размера карты.

Моя карта составляла 100% окна браузера пользователя, поэтому, если они изменят размеры окна, событие будет вызвано. Это было нежелательно для меня, так как я хотел вызвать событие, только если уровень масштабирования действительно изменился. Моим решением было создать новое событие под названием "zoomstart", которое я вставил вверху OpenLayers.Map.moveTo. Вот код:

var getZoom = this.getZoom();
if ( !!getZoom && !!zoom && this.isValidZoomLevel(zoom) && getZoom != zoom )
    this.events.triggerEvent("zoomstart", zoom);

Этот код передаст новый уровень масштабирования слушателю событий, который зарегистрирован zoomstartи в моем случае я определяю карту limitExtent и выполняю другие действия на основе нового уровня масштабирования.

Мир вам.

"movestart" обрабатывает "zoomstart". Чтобы определить, включен ли zoomstart, попробуйте:

 map.events.register("movestart",map, function(e) {
        if(e.zoomChanged)
        {
        //zoom start code here
        }

    });

Решение "Шаунак" сработало очень хорошо для меня. Я хочу ограничить масштабирование ниже 11, поэтому отредактировал его код как

if (zoom > 11) {
    map.zoomToProxy(zoom, xy);
}
Другие вопросы по тегам