2011-04-07 607 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