简体   繁体   English

在Open Layer中右键单击Feature Vector(Javascript)

[英]Right Click on Feature Vector (Javascript) in Open Layer

I need to create a contextmenu on right clicking on a Vector Feature (Open Layer) in javascript language. 我需要在javascript语言中右键单击Vector Feature(Open Layer)创建一个contextmenu。 I have searched on forums, but the solutions only regard the way to open alert or popup with right cliking on a Map. 我在论坛上搜索过,但解决方案只考虑在地图上打开警报或弹出窗口的方法。 Thanks for any help. 谢谢你的帮助。

This answer was really helpful: https://gis.stackexchange.com/questions/24999/showing-menu-based-on-right-click-on-point-geometry-in-javascript 这个答案非常有用: https//gis.stackexchange.com/questions/24999/showing-menu-based-on-right-click-on-point-geometry-in-javascript

For my working example, I started with this OpenLayers example: http://openlayers.org/dev/examples/feature-events.html . 对于我的工作示例,我从这个OpenLayers示例开始: http//openlayers.org/dev/examples/feature-events.html I then modified the feature-events.js file to the following code below. 然后我将feature-events.js文件修改为以下代码。 The key part is the added map.div.oncontextmenu section at the very bottom. 关键部分是最底部添加的map.div.oncontextmenu部分。 I captured the feature clicked on using the right-mouse button and then built a very simple popup menu. 我使用鼠标右键捕获了单击的功能,然后构建了一个非常简单的弹出菜单。 That's where you can grab the feature ID and do what you want as far as building up the popup. 在这里,您可以获取功能ID,并在构建弹出窗口时执行您想要的操作。 It also only seemed to work on one vector layer, so I got rid of layer2 from the example. 它似乎只在一个矢量图层上工作,所以我从示例中删除了layer2。 Using code from http://openlayers.org/dev/examples/select-feature-multilayer.html might solve that issue. 使用http://openlayers.org/dev/examples/select-feature-multilayer.html中的代码可能会解决该问题。

Code

var layerListeners = {
featureclick: function(e) {
    log(e.object.name + " says: " + e.feature.id + " clicked.");
    return false;
},
nofeatureclick: function(e) {
    log(e.object.name + " says: No feature clicked.");
}
};

var style = new OpenLayers.StyleMap({
'default': OpenLayers.Util.applyDefaults(
    {label: "${l}", pointRadius: 10},
    OpenLayers.Feature.Vector.style["default"]
),
'select': OpenLayers.Util.applyDefaults(
    {pointRadius: 10},
    OpenLayers.Feature.Vector.style.select
)
});
var layer1 = new OpenLayers.Layer.Vector("Layer 1", {
styleMap: style,
eventListeners: layerListeners
});
layer1.addFeatures([
new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT("POINT(-1 -1)"), {l:1}),
new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT("POINT(1 1)"), {l:1}),
new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT("POINT(-1 1)"), {l:2}),
new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT("POINT(1 -1)"), {l:2})
]);
/*var layer2 = new OpenLayers.Layer.Vector("Layer 2", {
styleMap: style,
eventListeners: layerListeners
});
layer2.addFeatures([
new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT("POINT(-1 1)"), {l:2}),
new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT("POINT(1 -1)"), {l:2})
]);*/

var map = new OpenLayers.Map({
div: "map",
allOverlays: true,
layers: [layer1],
zoom: 6,
center: [0, 0],
eventListeners: {
    featureover: function(e) {
        e.feature.renderIntent = "select";
        e.feature.layer.drawFeature(e.feature);
        log("Map says: Pointer entered " + e.feature.id + " on " +     e.feature.layer.name);
    },
    featureout: function(e) {
        e.feature.renderIntent = "default";
        e.feature.layer.drawFeature(e.feature);
        log("Map says: Pointer left " + e.feature.id + " on " + e.feature.layer.name);
    },
    featureclick: function(e) {
        log("Map says: " + e.feature.id + " clicked on " + e.feature.layer.name);
    }
}
});

function log(msg) {
if (!log.timer) {
    result.innerHTML = "";
    log.timer = window.setTimeout(function() {delete log.timer;}, 100);
}
result.innerHTML += msg + "<br>";
}

map.div.oncontextmenu = function noContextMenu(e) {
if(!e){ //dear IE...
    var e = window.event;
    e.returnValue = false;
}

console.log(e);

var f = layer1.getFeatureFromEvent(e);
console.log(f);

var popup = new OpenLayers.Popup("My Popup", 
        new OpenLayers.LonLat(f.geometry.x,f.geometry.y), 
        new OpenLayers.Size(200,200),true);

popup.closeOnMove = true;

map.addPopup(popup);

return false; //Prevent display of browser context menu
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM