2012-06-24 26 views
8

Estoy tratando de configurar OpenLayers para que no se muestre la capa vectorial justo antes de que se inicie un zoom y hacer que vuelva a aparecer después de que finalice el zoom. Tengo el zoom termina parte ya establecida así:Javascript OpenLayers before zoom event listener

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

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

Pero no veo ningún tipo de detector de eventos para el inicio de un zoom en la documentación. Hay un "movestart" que cubre movimiento, panorámica y zoom. Lamentablemente, no puedo usar el "movestart", porque no quiero que la capa desaparezca durante una panorámica. Pensarías que habría un "zoomstart", ya que hay un "zoomend".

La razón por la que estoy tratando de hacer esto es porque no me gusta cómo la capa vectorial se mueve a un ritmo diferente cuando se usa Google Maps como capa base. Se ve mal, parece que todas las características son inexactas, aunque aterricen en el lugar correcto una vez que se haya completado el zoom.

¿Alguna sugerencia?

Respuesta

2

Para este propósito, debe anular los métodos moveTo y moveByPx de OpenLayers.Map para eliminar la activación del evento movestart para cualquier acción, excepto el zoom.

+0

Gracias, eso funciona. – renosis

2

Tuve el mismo problema que OP, y traté de resolverlo con la solución de drnextgis. Pero desafortunadamente no funcionó completamente: la propiedad zoomChanged en OpenLayers.Map.moveTo se evalúa como true no solo cuando el nivel de zoom ha cambiado, sino también cuando el mapa ha sido redimensionado.

Mi mapa era el 100% de la ventana del navegador del usuario, por lo que si cambiaban el tamaño de la ventana, el evento se activaría. Esto era indeseable para mí, ya que solo quería activar el evento si el nivel de zoom realmente había cambiado. Mi solución fue crear un nuevo evento, llamado "zoomstart", que inserté en la parte superior de OpenLayers.Map.moveTo. Aquí está el código:

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

Este código pasará al nuevo nivel de zoom a un detector de eventos que se registra a zoomstart, y en mi caso determino del mapa restrictedExtent y hacer otras cosas en base al nuevo nivel de zoom.

La paz sea con vosotros.

8

Aquí es fácil agregar el evento 'BeforeZoom' a los OpenLayers. Simplemente agregue el código a continuación donde creó su objeto de mapa.

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

¿Cómo funciona esto:

Para cualquier tipo de actividad zoom, OpenLayers llamadas a API en última instancia, la función llamada zoomTo. Entonces, antes de anularlo, copiamos esa función a una nueva función llamada 'zoomToProxy'. Lo reemplazamos y agregamos nuestra lógica de zoom condicional. Si queremos que suceda el zoom, simplemente llamamos a la nueva función proxy :)

+0

Este enfoque funciona, pero para ser más seguro, debe reemplazar la línea dentro de la función para asignar.zoomToProxy.aplicar (esto, argumentos); por lo tanto, si agregan nuevos argumentos a zoomTo también se transmiten. – Hoffmann

+0

Ah, también olvidé mencionar que la API de OpenLayers llama a zoomTo antes de realizar realmente el zoom, por lo que puede usar el código antes del primer comentario para hacer las cosas como si fuera un evento 'zoomstart'. Puede evitar que el zoom ocurra, por ejemplo. – Hoffmann

+0

Correcto en ambos casos. ¡Gracias! – Shaunak

0

La solución de "Shaunak" me ha funcionado muy bien. que desea restringir el zoom por debajo de 11 por lo editó su código como

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

Esto debe publicarse como un * comentario * sobre la respuesta de Shaunak, no como una respuesta separada. – colllin

1

"MoveStart" maneja "zoomstart". Para detectar si el zoomstart, intente:

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

    });