2012-06-24 9 views
8

Ich versuche OpenLayers einzurichten, um die Vektorebene nicht anzuzeigen, kurz bevor ein Zoom startet und es wieder erscheinen, nachdem ein Zoom endet. Ich habe den Zoom endet Teil bereits wie folgt festgelegt:Javascript OpenLayers vor Zoom-Ereignis Listener

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

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

Aber ich weiß nicht, jede Art von Ereignis-Listener für den Start eines Zoom in der Dokumentation. Es gibt einen "Movestart", der das Bewegen, Schwenken und Zoomen umfasst. Leider kann ich den "movestart" nicht verwenden, weil ich nicht möchte, dass die Schicht während einer Pfanne verschwindet. Sie würden denken, dass es einen "Zoomstart" geben würde, da es einen "Zoommodus" gibt.

Der Grund, warum ich dies versuche, ist, weil ich nicht mag, wie die Vektorebene mit einer anderen Rate zoomt, wenn Sie Google Maps als Basisschicht verwenden. Es sieht falsch aus, sieht so aus, als ob alle Funktionen ungenau sind, obwohl sie nach dem Abschluss des Zooms an der richtigen Stelle landen.

Irgendwelche Vorschläge?

Antwort

2

Zu diesem Zweck sollten Sie die Methoden moveTo und moveByPx von OpenLayers.Map außer Kraft setzen, um das Auslösen von Movestart-Ereignissen für alle Aktionen außer dem Zoomen zu verhindern.

+0

Danke, das funktioniert. – renosis

2

Ich hatte das gleiche Problem, das OP hatte, und ich versuchte es mit drnextgis Lösung zu lösen. Aber leider hat es nicht ganz funktioniert: Die zoomChanged Eigenschaft in OpenLayers.Map.moveTo wird nicht nur true ausgewertet, wenn sich die Zoomstufe geändert hat, sondern auch wenn die Größe der Karte geändert wurde.

Meine Karte war 100% des Browserfensters des Benutzers. Wenn sie also die Größe des Fensters änderten, wurde das Ereignis ausgelöst. Dies war für mich unerwünscht, da ich das Ereignis nur auslösen wollte, wenn sich die Zoomstufe tatsächlich geändert hatte. Meine Lösung bestand darin, ein neues Ereignis namens "zoomstart" zu erstellen, das ich oben in OpenLayers.Map.moveTo eingefügt habe. Hier ist der Code:

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

Dieser Code wird die neue Zoomstufe zu einem Ereignis-Listener übergeben, die zu zoomstart registriert ist, und in meinem Fall habe ich bestimmen die restrictedExtent der Karte und machen andere Sachen auf der Basis der neuen Zoomstufe.

Friede sei mit euch.

8

Hier ist ein einfaches Hinzufügen des Ereignisses 'BeforeZoom' zu den OpenLayers. Fügen Sie einfach den folgenden Code zu dem Ort hinzu, an dem Sie Ihr Kartenobjekt erstellt haben.

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

Wie das funktioniert:

Für jede Art von Aktivität Zoomen, Openlayers-API-Aufrufe letztlich die Funktion aufgerufen zoomTo. Bevor wir es überschreiben, kopieren wir diese Funktion in eine neue Funktion namens 'ZoomToProxy'. Wir überschreiben es und fügen unsere bedingte Zoom-Logik hinzu. Wenn wir wollen, dass der Zoom passiert, rufen wir einfach neue Proxy-Funktion :)

+0

Dieser Ansatz funktioniert, aber nur um sicherer zu sein, sollten Sie die Zeile innerhalb der Funktion zu map.zoomToProxy ersetzen.anwenden (das, Argumente); Wenn sie zoomTo also neue Argumente hinzufügen, werden sie auch weitergegeben. – Hoffmann

+0

Ah, ich habe auch vergessen zu erwähnen, dass die OpenLayers API zoomTo aufruft, bevor sie den Zoom ausführt, damit Sie den Code vor dem ersten Kommentar so verwenden können, als wäre es ein "Zoomstart" -Ereignis. Sie können beispielsweise verhindern, dass der Zoom ausgelöst wird. – Hoffmann

+0

In beiden Punkten richtig. Danke! – Shaunak

0

Lösung von "Shaunak" ist sehr gut für mich gearbeitet. Ich möchte unter 11 bearbeitet, um seinen Code Zoomen beschränken, wie

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

Dies sollte als * Kommentar * auf Shaunaks Antwort gepostet werden, nicht als separate Antwort. – colllin

1

"movestart" Griffe "zoomstart". Um festzustellen, ob der Zoomstart, versuchen Sie:

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

    }); 
Verwandte Themen