2011-04-07 11 views
5

Uso de OpenLayers y necesito poder distinguir entre cuando mi propio scrip o el usuario haya movido el mapa. Sí, soy consciente de que puedo usar moveend. Pero también se dispara cuando el mismo script se mueve o reposiciona el mapa en función de los datos entrantes de las llamadas ajax. Así que moveend u otros eventos de mapas no funcionarán.Openlayers y evento de captura de resistencia

Hice algunos google y encontré OpenLayers.Hander.Drag. Pero todo lo que logré con él fue evitar que los usuarios arrastraran el mapa.

Mi script:

this.dragger = new OpenLayers.Handler.Drag('',{ 
     'dragStart': function(evt){ 
      this.userdragged = true; 
      console.log('drag'); 
     }},{ 
     'map':this.mymap 
     }); 
this.dragger.activate(); 

Como se puede ver, he tratado de establecer la variable userdragged true para utilizar esta misma variable en caso MoveEnd más tarde. Lamentablemente, todo esto fue para evitar que mi mapa se volviera arrastrable.

¿Alguien me puede ayudar, por favor?

Alan

Respuesta

5

¡Gracias!

Lo tengo trabajo fue:

dragcontrol = new OpenLayers.Control.DragPan({'map':this.mymap, 'panMapDone':function(evt){ 
    this.userdragged = true; 
    console.log('drag'); 
}}); 
dragcontrol.draw(); 
this.mymap.addControl(dragcontrol); 
dragcontrol.activate(); 

Booyaka!

Edit: En realidad this.userdragged no funcionará allí ... el alcance de esto es diferente allí. tendrías que hacer algo como var that = this; antes de la inicialización de objetos y uso that.userdragged = true ....

Edit2: Más tarde descubrí que esta función panMapDone sobrescribe el método propio de DragPans que tiene el mismo nombre. Con solo mi ejemplo anterior, puede terminar con un mapa que da como resultado que las características del vector no se sincronicen con el mapa, cuando el usuario arrastra el mapa. Para evitar que eso suceda, debe copiar la funcionalidad original en esa función también ... para que se vea algo así:

dragcontrol = new OpenLayers.Control.DragPan({'map':this.mymap, 'panMapDone':function(xy){ 
     if(this.panned) { 
      var res = null; 
      if (this.kinetic) { 
       res = this.kinetic.end(xy); 
      } 
      this.map.pan(
       this.handler.last.x - xy.x, 
       this.handler.last.y - xy.y, 
       {dragging: !!res, animate: false} 
      ); 
      if (res) { 
       var self = this; 
       this.kinetic.move(res, function(x, y, end) { 
        self.map.pan(x, y, {dragging: !end, animate: false}); 
       }); 
      } 
      this.panned = false; 
     } 
     that.userdragged = true; 
      // do whatever you want here 
    }}); 
    dragcontrol.draw(); 
    this.mymap.addControl(dragcontrol); 
    dragcontrol.activate(); 

Alan

+0

¡Genial que lo hiciste funcionar! ¿Qué hace la función draw() a la solución? –

+0

draw crea y activa el controlador real. http://dev.openlayers.org/docs/files/OpenLayers/Control/DragPan-js.html draw [quote]: crea un controlador de arrastre, utilizando panMap y panMapDone como devoluciones de llamada. [/ quote] –

2

Mirando el documentation en manejadores de arrastre, que establece que se supone que debe ser utilizado con un objeto de control. ¿Lo estás usando de esa manera? Tal vez el fragmento de código no lo muestra?

"Si se usa un controlador sin control, los manejadores del método setMap deben anularse para que se maneje correctamente con el mapa."

Yo no lo he probado, pero parece que hay que ir por algo como esto:

var myControl = new OpenLayers.Control(); 

var dragger = new OpenLayers.Handler.Drag{ 
    control: myControl, 
    callbacks: { 'done': function() { // do something }}, 
    options: {} 
} 

myMap.addControl(myControl); 
myControl.activate(); 
+0

probado este, pero no lo puedo trabajar en absoluto. Al menos no puedo determinar de ninguna manera, que está funcionando.Con mi propio guión, al menos podría decir que funciona porque me dio algunos resultados: el mapa detenido no se movió. La línea que citó ("Si el controlador se está utilizando sin control ...") - especifiqué el mapa en las opciones y eso es lo que detuvo mi mapa funcionando. Sin esa declaración de mapa en las opciones, no funcionó en absoluto. –

1

Sólo publicar aquí un ejemplo de la ejecución de una función arbitraria cuando el usuario arrastra el mapa, sin interferir con el clic normal y arrastre utilizado para recorrer el mapa, porque esta página fue el resultado más frecuente durante mi búsqueda para encontrar cómo hacerlo.

var CustomDragControl = OpenLayers.Class(OpenLayers.Control, { 

    defaultHandlerOptions: { 
     'stopDown': false 
     /* important, otherwise it prevent the click-drag event from 
      triggering the normal click-drag behavior on the map to pan it */ 
    }, 

    initialize: function(options) { 
     this.handlerOptions = OpenLayers.Util.extend(
      {}, this.defaultHandlerOptions 
     ); 
     OpenLayers.Control.prototype.initialize.apply(
      this, arguments 
     ); 
     this.handler = new OpenLayers.Handler.Drag(
      this, { 
       'down': this.onDown //could be also 'move', 'up' or 'out' 
      }, this.handlerOptions 
     ); 
    }, 

    onDown: function(evt) { 
     // do something when the user clic on the map (so on drag start) 
     console.log('user clicked down on the map'); 
    } 
}); 

continuación, agregue el control al que lista los controles del mapa al crear la instancia mapa, o con un Map.addControl(), con

new CustomDragControl ({'autoActivate': true}) 
+0

Esto soluciona los OP Problema: ¿activación de funciones en la función de arrastre del usuario pero no en un movimiento impulsado por Ajax? – ASGM

+0

por lo que puedo ver, sí, solo se capturan las acciones del usuario. – user2286522

Cuestiones relacionadas