2012-06-24 10 views
8

Sto tentando di impostare OpenLayers per non visualizzare il livello vettoriale appena prima dell'inizio dello zoom e farlo riapparire al termine di uno zoom. Ho lo zoom finisce parte già stabilito in questo modo:Javascript OpenLayers prima del listener di eventi zoom

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

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

Ma non vedo alcun tipo di listener di eventi per l'inizio di uno zoom nella documentazione. C'è un "movestart" che copre lo spostamento, la panoramica e lo zoom. Sfortunatamente, non posso usare la "movestart", perché non voglio che il livello sparisca durante una panoramica. Si potrebbe pensare che ci sarebbe un "zoomstart", in quanto esiste un "zoomend".

Il motivo per cui sto provando a farlo, è perché non mi piace come il livello vettoriale si ingrandisca a una velocità diversa quando si utilizza Google Maps come livello base. Sembra sbagliato, sembra che tutte le caratteristiche siano imprecise, anche se atterrano nel posto giusto dopo aver completato lo zoom.

Qualche suggerimento?

risposta

2

Per questo scopo è necessario eseguire l'override dei metodi moveTo e moveByPx di OpenLayers.Map per eliminare l'attivazione di eventi movestart per qualsiasi azione tranne lo zoom.

+0

Grazie, che funziona. – renosis

2

Ho avuto lo stesso problema di OP e ho cercato di risolverlo con la soluzione di drnextgis. Ma sfortunatamente non ha funzionato completamente: la proprietà zoomChanged in OpenLayers.Map.moveTo restituisce true non solo quando il livello di zoom è cambiato, ma anche quando la mappa è stata ridimensionata.

La mia mappa era al 100% della finestra del browser dell'utente, quindi se si ridimensionava la finestra, l'evento veniva attivato. Questo non era auspicabile per me, poiché volevo solo attivare l'evento se il livello di zoom fosse effettivamente cambiato. La mia soluzione era creare un nuovo evento, chiamato "zoomstart", che ho inserito nella parte superiore di OpenLayers.Map.moveTo. Ecco il codice:

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

Questo codice passerà il nuovo livello di zoom di un listener di eventi che è registrato a zoomstart, e nel mio caso ho determinare della mappa restrictedExtent e fare altre cose in base al nuovo livello di zoom.

La pace sia con voi.

8

Ecco un facile aggiungere l'evento "BeforeZoom" agli OpenLayers. Basta aggiungere il codice qui sotto a dove hai creato il tuo oggetto mappa.

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

Come funziona:

Per qualsiasi tipo di zoom attività, OpenLayers chiamate API in ultima analisi, la funzione chiamata zoomTo. Quindi, prima di sovrascriverlo, copiamo quella funzione in una nuova funzione chiamata 'zoomToProxy'. Lo sovrascriviamo e aggiungiamo la nostra logica di zoom condizionale. Se vogliamo che lo zoom si verifichi, chiamiamo semplicemente la nuova funzione proxy :)

+0

Questo approccio funziona, ma per essere più sicuri è necessario sostituire la linea all'interno della funzione su map.zoomToProxy.applicare (questo, argomenti); quindi se aggiungono nuovi argomenti allo zoom, vengono passati anche loro. – Hoffmann

+0

Ah Ho anche dimenticato di menzionare che l'API OpenLayers chiama zoomTo prima di eseguire effettivamente lo zoom, quindi è possibile utilizzare il codice prima del primo commento per fare le cose come se fosse un evento "zoomstart". Ad esempio, puoi impedire che lo zoom accada. – Hoffmann

+0

Proprio su entrambi i conteggi. Grazie! – Shaunak

0

La soluzione di "Shaunak" funziona molto bene per me. voglio limitare lo zoom al di sotto di 11, in modo ha modificato il proprio codice come

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

Questo dovrebbe essere pubblicato come * commento * sulla risposta di Shaunak, non come una risposta separata. – colllin

1

"movestart" maniglie "zoomstart". Per rilevare se lo zoomstart, provare:

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

    }); 
Problemi correlati