2011-04-07 610 views
5

即时通讯使用OpenLayers,我需要能够区分何时地图被我自己的脚本或用户移动。是的,我知道我可以使用moveend。但是,当同一脚本正在移动或根据来自ajax调用的传入数据重新定位地图时,它也会触发。所以移动或其他地图事件不会工作。Openlayers和捕捉拖动事件

我做了一些Google搜索,发现OpenLayers.Hander.Drag。但我管理的所有内容都是阻止用户拖动地图。

我的脚本:

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

正如你所看到的,我试图userdragged变量设置为true以后使用中moveend事件这个相同的变量。不幸的是,所有这些都是为了阻止我的地图可以拖动。

有人可以帮助我吗?

艾伦

回答

5

明白了!

什么得到它的工作是:

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!

编辑: 其实this.userdragged不会在那里工作...这是不同的范围。你需要做一些类似var = this的事情;之前,该对象初始化和使用that.userdragged = true ...

编辑2: 我后来发现,这个panMapDone函数覆盖DragPans自己的方法,它具有相同的名称。就像我之前的例子一样,当用户拖动地图时,最终可能会导致地图的矢量功能与地图不同步。为了阻止这种情况发生,你应该在原有的功能复制到功能太...使它看起来类似的东西:

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(); 

艾伦

+0

很棒,你得到它的工作! draw()函数对解决方案有什么作用? – 2011-04-08 07:20:47

+0

绘制创建并激活实际处理程序。 http://dev.openlayers.org/docs/files/OpenLayers/Control/DragPan-js.html [quote] draw - 创建一个Drag处理函数,使用panMap和panMapDone作为回调。[/ quote] – 2011-04-08 08:45:32

2

纵观documentation上拖动处理程序,它指出,它应该有一个控制对象使用。你用那种方式吗?也许代码片段不显示它?

“如果在没有控件的情况下使用处理程序,必须重写处理程序setMap方法才能正确处理地图。”

我还没有尝试过,但似乎你应该去这样的事情:

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

尝试这样做,但它不会在所有的工作。至少我不能以任何方式确定它的工作。用我自己的脚本,我至少可以告诉,它的工作是因为它给了我一些结果 - 停止移动地图。你引用的这一行(“如果处理程序是在没有控制的情况下使用的......”) - 我在选项中指定了地图,那是什么阻止了我的地图的工作。没有选项中的地图声明,它根本不起作用。 – 2011-04-08 06:18:37

1

刚刚张贴的例子在这里当执行任意功能的用户拖动地图,而不会干扰用于平移地图的正常点击拖动,因为此页面是我搜索过程中最常见的结果,可以找出如何实现这一点。

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

然后创建地图实例时将控件添加到您的地图的控制列表,或用map.addControl(),与

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

这是否解决了OP的问题 - 触发用户拖动功能,但不是在Ajax驱动运动? – ASGM 2013-04-16 13:08:52

+0

据我所知,是的,只有用户操作被捕获。 – user2286522 2013-04-17 12:23:48