Pointers OpenLayer 3:在覆盖上创建地图时,无法触发地图指针向上事件

Pointers OpenLayer 3:在覆盖上创建地图时,无法触发地图指针向上事件,pointers,events,overlay,drag,openlayers-3,Pointers,Events,Overlay,Drag,Openlayers 3,我在OSM上创建了一个覆盖,并在覆盖上创建了一个矢量贴图(stopEvent=true),但当我在覆盖上拖动矢量贴图时,无法触发矢量贴图指针向上事件,因此导致即使鼠标单击矢量贴图,矢量贴图也始终跟随鼠标移动。但是,如果我在覆盖外单击OSM,将触发向量映射指针向上事件。是否是ol3错误?或者有没有其他方法来避免这个问题?谢谢 以下是该问题的示例代码: var geojsonObject = { "features": [ { "geometr

我在OSM上创建了一个覆盖,并在覆盖上创建了一个矢量贴图(stopEvent=true),但当我在覆盖上拖动矢量贴图时,无法触发矢量贴图指针向上事件,因此导致即使鼠标单击矢量贴图,矢量贴图也始终跟随鼠标移动。但是,如果我在覆盖外单击OSM,将触发向量映射指针向上事件。是否是ol3错误?或者有没有其他方法来避免这个问题?谢谢

以下是该问题的示例代码:

var geojsonObject = {
        "features": [
        {
            "geometry": {
                "coordinates": [
                    [
                        [
                            -7357522.593593802,
                            -1134936.9958202997
                        ],
                        [
                            -7357522.593593802,
                            5361598.9112891
                        ],
                        [
                            7435794.110546899,
                            5361598.9112891015
                        ],
                        [
                            7435794.110546903,
                            -1134936.9958202997
                        ],
                        [
                            -7357522.593593802,
                            -1134936.9958202997
                        ]
                    ]
                ],
                "type": "Polygon"
            },
            "type": "Feature"
        }
    ],
    "type": "FeatureCollection"
};
//Create OSM
var map = new ol.Map({
    layers: [
        new ol.layer.Tile({
            source: new ol.source.OSM()
        })
    ],
    controls: [],
    target: 'map',
    view: new ol.View({
        center: [0, 0],
        zoom: 2
    })
});
//Create overlay
var $element = $("<div id='vectorMap' class='vectorMap'></div>");
var vectorMap = new ol.Overlay({
    element: $element[0],
    position: [0, 0],
    positioning: "center-center"
});
map.addOverlay(vectorMap);
//Create vector map on overlay
var vmap = new ol.Map({
    target: "vectorMap",
    layers: [
        new ol.layer.Vector({
            source: new ol.source.Vector({
                features: (new ol.format.GeoJSON()).readFeatures(geojsonObject)
            })
        })
    ],
    controls: [],
    view: new ol.View({
        center: [0, 0],
        zoom: 1
    })
});
//Listen the pointer event on vector map
vmap.on('pointerdown', function(evt) {
    console.log("pointerdown");
});
vmap.on('pointerup', function(evt) {
    console.log('pointerup');
});
var geojsonObject={
“特点”:[
{
“几何学”:{
“坐标”:[
[
[
-7357522.593593802,
-1134936.9958202997
],
[
-7357522.593593802,
5361598.9112891
],
[
7435794.110546899,
5361598.9112891015
],
[
7435794.110546903,
-1134936.9958202997
],
[
-7357522.593593802,
-1134936.9958202997
]
]
],
“类型”:“多边形”
},
“类型”:“特征”
}
],
“类型”:“功能集合”
};
//创建OSM
var map=新ol.map({
图层:[
新ol.layer.Tile({
来源:new ol.source.OSM()
})
],
控件:[],
目标:“地图”,
视图:新ol.view({
中间:[0,0],
缩放:2
})
});
//创建覆盖
变量$element=$(“”);
var vectorMap=新ol.覆盖({
元素:$element[0],
位置:[0,0],
定位:“居中”
});
map.addOverlay(矢量地图);
//在覆盖上创建矢量地图
var vmap=新的ol.Map({
目标:“矢量地图”,
图层:[
新ol.layer.Vector({
来源:新ol.source.Vector({
特性:(新的ol.format.GeoJSON()).readFeatures(geojsonObject)
})
})
],
控件:[],
视图:新ol.view({
中间:[0,0],
缩放:1
})
});
//侦听向量映射上的指针事件
vmap.on('pointerdown',函数(evt){
console.log(“pointerdown”);
});
vmap.on('pointerup',函数(evt){
log('pointerup');
});

jsIDLE:

我通过禁用地图默认dragPan交互解决了问题,并在地图视口div元素上注册
mousedown/up/move
事件。请参阅ol3 dragPan交互源代码

下面是示例代码:

var vmap = new ol.Map({
    target: "vectorMap",
    layers: [
        new ol.layer.Vector({
            source: new ol.source.Vector({
                features: (new ol.format.GeoJSON()).readFeatures(geojsonObject)
            })
        })
    ],
    controls: [],
    interactions: ol.interaction.defaults({
        dragPan: false
    }),
    view: new ol.View({
        center: [0, 0],
        zoom: 1
    })
});
//Register the dragpan event on the viewport div
var drag = false;
var lastCentroid = null;
$(vmap.getViewport()).on({
    mousedown: function(evt) {
        drag = true;
        lastCentroid = null;
        vmap.render();
    },
    mouseup: function(evt) {
        drag = false;
        vmap.render();
    },
    mousemove: function(evt) {
        if (drag) {
            var centroid = [evt.clientX, evt.clientY];
            if (lastCentroid != null) {
                var deltaX = lastCentroid[0] - centroid[0];
                var deltaY = centroid[1] - lastCentroid[1];
                var view = vmap.getView();
                var viewState = view.getState();
                var center = [deltaX, deltaY];

                ol.coordinate.scale(center, viewState.resolution);
                ol.coordinate.rotate(center, viewState.rotation);
                ol.coordinate.add(center, viewState.center);
                center = view.constrainCenter(center);
                vmap.render();
                view.setCenter(center);
            }
            lastCentroid = centroid;
        }
    },
    mouseleave: function(evt) {
        drag = false;
    }
});

我也有同样的问题。我想知道这是出现在一些ol-3版本中还是从ol2到ol3?我们最近从ol2换成了ol3,问题就出现了。我只是想知道在没有修复ol3头部的情况下是否应该进行降级。使用缩小的ol.js文件,您无法找到
ol.coordinate.scale
ol.coordinate.rotate
ol.coordinate.add
。等效命令是什么?没有
view.getState()
也没有,我使用了
view.getResolution()
等。使用
ol debug.js
所有这些都可以完美地工作。