Страница 1 из 1

OpenLayers: Механизм событий (events) в OpenLayers

Добавлено: 19 авг 2011, 17:48
dobeer
Подскажите где, как... (в документации не нашел) можно обработать события изменения масштаба и движения карты. Например при изменениии (увеличение/уменьшение) масштаба вывыести

Код: Выделить всё

alert('ok');
и также при возникновении события движении карты мышкой вывести тот же

Код: Выделить всё

alert('ok');
.
И вообще хочется подрбнее постичь возникновения различных событий в OL...

Re: OL - события

Добавлено: 20 авг 2011, 19:34
Mavka
Механизм событий (events) в OpenLayers

Открываем в документациия API класс Map и смотрим какие события он инициирует - EVENT_TYPES (подобный раздел есть у многих классов). Нас интересуют события "zoomend" и "moveend" (аналогичное событие "move" возникает несколько раз пока вы двигаете карту, а "moveend" - когда отпускается кнопка мышки). Регистрируем обработчик:

Код: Выделить всё

map.events.register("zoomend", map, function(e) { 
    alert('ok');
}); 
В параметре "e" могут содержаться всякие полезные сведения, для разных событий они отличаются, поэтому смотрите подробнее в отладчике.

Инициация события производится вызовом функции triggerEvent:

Код: Выделить всё

this.layer.events.triggerEvent("afterfeaturemodified", {feature: feature}); 
Например, в топике "GetFeature - индикатор загрузки" вместо alert() правильнее было запустить событие и при наличии зарегистрированного обработчика использовать вне класса.

На одно и то же событие можно зарегистрировать несколько обработчиков. (Учтите, что еще встречаются классы в которых эта возможность реализована с ошибками.) Используем функцию console.log() так как alert() прерывает интерактивное перемещение:

Код: Выделить всё

map.events.register("move", map, function(e) { 
    console.log('ok1');
    return true;
});
map.events.register("move", map, function(e) { 
    console.log('ok2');
    return true;
}); 
Обработчик должен возвращать логическое значение true/false. Если в первом обработчике установить "return false", то последующие обработчики вызваны не будут (проверьте в консоли отсутствие "ok2").

Возьмем событие "mousedown". Метод register("mousedown", ...) добавляет в конец массива

Код: Выделить всё

map.events.listeners['mousedown'] 
запись с описанием обработчика. Так как на момент работы пользовательского кода уже зарегистрированы обработчики контроллеров, то может возникнуть необходимость добавить свой обработчик первым в списке:

Код: Выделить всё

map.events.listeners['mousedown'].unshift({
    obj: map,
    func: function(e) { 
        console.log('ok');
        return false;
    }
}); 
Так как здесь использован "return false", то все остальные обработчики работать не будут.

Вот и все что связано с обработкой событий в OpenLayers. Есть еще событийная модель DOM и свои способы работы во фреймворках типа GeoExt и MapQuery.

Re: OL - события

Добавлено: 22 авг 2011, 12:47
dobeer
Спасибо, Mavka. То что надо было, работает.

Re: OL - события

Добавлено: 22 авг 2011, 18:15
dobeer
Странное дело...при изменении масштаба, почемуто возникают 2 события "zoomend" и "moveend"! На каждое событие у меня повешена одна и та же функция и нет необходимости выполнять ее 2 раза (лишняя нагрузка на сервер). Есть простой (какойто стандартный выход) способ этого избежать? Пока решил проблему тем, что при запуске 2-го события (ненужного "moveend") делаю проверку не выполняется ли первое.

Re: OL - события

Добавлено: 22 авг 2011, 22:44
Mavka
Это нормально, в доках написано:
moveend triggered after a drag, pan, or zoom completes
значит он срабатывает не только на движение карты, но и на увеличение.

Там где действует "zoomend" будет срабатывать и "moveend". Может быть "zoomend" вам не нужен вообще?

Re: OL - события

Добавлено: 23 авг 2011, 05:59
dobeer
Мне необходимо получать координаты текущего эктента при каждом изменении масштаба и при завершении движения карты...как тут обойтись без "zoomend"?

Re: OL - события

Добавлено: 23 авг 2011, 09:59
Mavka
Вместо zoomend будет работать moveend

Re: OL - события

Добавлено: 23 авг 2011, 10:22
dobeer
Действительно работает, что то я неподумал об этом)))

Re: OpenLayers: Механизм событий (events) в OpenLayers

Добавлено: 18 июн 2013, 10:38
J_Mnemonic
вот вычитал что есть такое:
movestart - triggered after the start of a drag, pan, or zoom. The event object may include a zoomChanged property that tells whether the zoom has changed.

а не подскажете как мне отсеить "drag, pan" события? дело в том что мне нужно отлавливать старт зуминга, чтобы закрывать Popup (иначе какой то глюк происходит - если попап не закрыть, то его уже потом вообще не возможно закрыть после зума)

Re: OpenLayers: Механизм событий (events) в OpenLayers

Добавлено: 18 июн 2013, 11:43
J_Mnemonic
Нашел вот такой ответ на Stackoverflow
For this purpose you should override moveTo and moveByPx methods of OpenLayers.Map for eliminate movestart event triggering for any actions except zooming.

но не могу понять - как переопределить эти методы (moveTo and moveByPx)?

Re: OpenLayers: Механизм событий (events) в OpenLayers

Добавлено: 18 июн 2013, 15:22
Denis Rykov
Вот прочитайте viewtopic.php?f=41&t=8252

[ Сообщение с мобильного устройства ]

Re: OpenLayers: Механизм событий (events) в OpenLayers

Добавлено: 19 июн 2013, 01:16
J_Mnemonic
Спасибо. Статья полезная.
Решил вроде свой вопрос. Но правда для этого пришлось случайно обнаружить начинку оригинальных методов и подкорректировать их. Точнее хватило токо одного - moveByPx.
вместо

Код: Выделить всё

(this.dragging = !0, this.events.triggerEvent("movestart")) 
оставил только

Код: Выделить всё

(this.dragging = !0)
надеюсь кому нибудь пригодится инфа