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 в качестве базового слоя. Это выглядит неправильно, похоже, что все функции неточны, даже если они оказываются в нужном месте после завершения масштабирования.

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


person renosis    schedule 24.06.2012    source источник


Ответы (5)


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

person drnextgis    schedule 25.06.2012

Вот как легко добавить событие «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
};

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

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

person Shaunak    schedule 26.06.2013
comment
Этот подход работает, но для большей безопасности вы должны заменить строку внутри функции на map.zoomToProxy.apply(this, arguments); поэтому, если они добавляют новые аргументы в zoomTo, они также передаются. - person Hoffmann; 31.01.2014
comment
Ах, я также забыл упомянуть, что API OpenLayers вызывает zoomTo перед фактическим выполнением масштабирования, поэтому вы можете использовать код перед первым комментарием, чтобы делать что-то, как если бы это было событие «zoomstart». Например, вы можете предотвратить масштабирование. - person Hoffmann; 31.01.2014
comment
Правильно по обоим пунктам. Спасибо! - person Shaunak; 31.01.2014

У меня была та же проблема, что и у 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, и в моем случае я определяю ограниченный экстент карты и делаю другие вещи на основе нового уровня масштабирования.

Мир вам.

person Wavy Davy    schedule 25.02.2013

«movestart» обрабатывает «zoomstart». Чтобы определить, работает ли zoomstart, попробуйте:

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

    });
person Ofembe    schedule 19.02.2014

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

if (zoom > 11) {
    map.zoomToProxy(zoom, xy);
}
person farukterzioglu    schedule 18.09.2013
comment
Это должно быть опубликовано как комментарий к ответу Шонака, а не как отдельный ответ. - person colllin; 25.09.2013