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);
}