Javascript Openlayers和捕获拖动事件

Javascript Openlayers和捕获拖动事件,javascript,openlayers,Javascript,Openlayers,我正在使用OpenLayers,我需要能够区分地图是由我自己的纸条还是由用户移动的。是的,我知道我可以用moveend。但是,当同一脚本基于来自ajax调用的传入数据移动或重新定位映射时,它也会触发。因此,moveend或其他映射事件不起作用 我在谷歌上搜索了一下,找到了OpenLayers.Hander.Drag。但我所做的只是阻止用户拖动地图 我的剧本: this.dragger = new OpenLayers.Handler.Drag('',{ 'dragStart':

我正在使用OpenLayers,我需要能够区分地图是由我自己的纸条还是由用户移动的。是的,我知道我可以用moveend。但是,当同一脚本基于来自ajax调用的传入数据移动或重新定位映射时,它也会触发。因此,moveend或其他映射事件不起作用

我在谷歌上搜索了一下,找到了OpenLayers.Hander.Drag。但我所做的只是阻止用户拖动地图

我的剧本:

this.dragger = new OpenLayers.Handler.Drag('',{
        'dragStart': function(evt){
            this.userdragged = true;
            console.log('drag');
        }},{
        'map':this.mymap
        });
this.dragger.activate();
如您所见,我尝试将UserDrawed变量设置为true,以便稍后在moveend事件中使用相同的变量。不幸的是,这一切都是为了阻止我的地图被拖走

有人能帮我吗

Alan

查看on-Drag处理程序,它表示应该与控制对象一起使用。你是这样用的吗?也许代码片段没有显示它

如果在没有控件的情况下使用处理程序,则必须重写handlers 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();
明白了

成功的原因是:

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();
布亚卡

编辑: 事实上,这个在那里不起作用。。。这里的范围不同。你需要做一些类似var的事情,它=这个;在该对象初始化之前,使用that.userdraud=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();

Alan

在这里发布了一个示例,说明了当用户拖动地图时执行任意函数,而不干扰用于平移地图的正常单击-拖动,因为在我搜索如何执行该操作的过程中,此页面是最常见的结果

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()将控件添加到映射的控件列表中


我在OpenLayers 6中使用过:

map.on('pointerdrag', function (event) {
    is_map_center = false;
})

hf gl

我试过了,但根本没用。至少我不能以任何方式确定它是否有效。用我自己的脚本,我至少可以说,它是有效的,因为它给了我一些结果,阻止了地图移动。您引用的行(“如果处理程序在没有控件的情况下使用…”)-我在选项中指定了映射,这就是停止映射工作的原因。如果没有选项中的地图声明,它根本不起作用。很好,你让它起作用了!draw()函数对解决方案有什么作用?draw创建并激活实际的处理程序。[quote]draw-创建一个拖动处理程序,使用panMap和panMapDone作为回调。[/quote]这是否解决了OP的问题-在用户拖动上触发函数,而不是在ajax驱动的移动上触发函数?据我所知,是的,只捕获用户操作。
map.on('pointerdrag', function (event) {
    is_map_center = false;
})