2012-06-24 3 views
8

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

Любые предложения?

ответ

2

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

+0

Спасибо, что работает. – renosis

2

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

Мир с вами.

8

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

+0

Этот подход работает, но чтобы быть более безопасным, вы должны заменить строку внутри функции map.zoomToProxy.применять (это, аргументы); поэтому, если они добавят новые аргументы в zoomTo, они тоже пройдут. – Hoffmann

+0

А также я забыл упомянуть, что API OpenLayers вызывает zoomTo до фактического выполнения масштабирования, поэтому вы можете использовать код перед первым комментарием, чтобы делать что-то, как если бы это было событие «zoomstart». Например, вы можете предотвратить увеличение масштаба. – Hoffmann

+0

Право на оба счета. Спасибо! – Shaunak

0

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

if (zoom > 11) { 
    map.zoomToProxy(zoom, xy); 
} 
+2

Это сообщение должно быть опубликовано как * комментарий * по отвечу Шаунака, а не как отдельный ответ. – colllin

1

«movestart» обрабатывает «zoomstart». Чтобы определить, есть ли эффект масштабирования, попробуйте:

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

    });