`
java-admin
  • 浏览: 1381892 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

让OpenLayers的SelectFeature控件支持鼠标右键事件

 
阅读更多

http://www.cnblogs.com/lei3389/archive/2009/04/21/1440458.html

 

OpenLayers上的一个Feature对象单击出现一个气泡很容易实现,但是右键出现点菜单什么的就不容易了,关键在于SelectFeature控件不支持右键事件,所以我就改之。。
修改的源文件是基于OpenLayers2.7+changeset9116
changeset9116修复了SelectFeature不能选取两个以上图层的bug,具体参见http://trac.openlayers.org/changeset/9116
所以有些源代码和官网上下的OpenLayers2.7有点不一样
代码太多了,显得文章比较长,懒得看的就直接下载修改后的用就行了:

OpenLayers2.7 lei3389修改版下载地址:
http://files.cnblogs.com/lei3389/OpenLayers27_ModedBy_lei3389.rar
使用方法本文最后有个例子的

1.首先修改【OpenLayers\Events.js】
修改OL能够捕获的鼠标事件,添加右键事件“contextmenu”

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->     BROWSER_EVENTS: [
        
"mouseover""mouseout",
        
"mousedown""mouseup""mousemove"
        
"click""dblclick""rightclick""dblrightclick",
        
"resize""focus""blur"
        
//added by lei3389
        ,"contextmenu"
        
//added end
    ],

 

现在OL已经可以截获鼠标右键了,只是handler没有去处理,下面我们再继续
2.进入【OpenLayers\Handler\Feature.js】
修改这个handler能够处理的事件表

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->            EVENTMAP: {
            
//added by lei
        'contextmenu': {'in''click''out''clickout'},
        
//added end
        
        
'click': {'in''click''out''clickout'},
        
'mousemove': {'in''over''out''out'},
        
'dblclick': {'in''dblclick''out'null},
        
'mousedown': {'in'null'out'null},
        
'mouseup': {'in'null'out'null}
    },

 

这里的in和out可以理解为选中和取消选中
这样,这个handler就能够处理contextmenu事件了,但是谁去处理你的事件呢?只能自己添加了:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    /**
    *added by lei3389!!!
     * Method: contextmenu
     * Handle contextmenu.  Call the "contextmenu" callback if contextmenu on a feature,
     *     or the "clickout" callback if rightclick outside any feature.
     * 
     * Parameters:
     * evt - {Event} 
     *
     * Returns:
     * {Boolean}
     
*/
      contextmenu:
function(evt) {
         
return this.handle(evt) ? !this.stopClick : true;
    },

这样就交给handle去处理了
触发选中的本来是左键单击和左键双击,现在我们添加上右击

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->        handle:
        {
        
        
// var click = (type == "click" || type == "dblclick");
       //moded by lei
       //for right click on feature
        var click = (type == "click" || type == "dblclick"|| type == "contextmenu");
        
//moded end
            
        }

 

我们添加右键点击只是利用左键点击触发的事件,所以我们要在触发的事件中添加一个参数,以区分是左键还是右键

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->                if(previouslyIn && inNew) {
                    
// out of last feature and in to another
                    this.triggerCallback(type, 'out', [this.lastFeature]);
                    
                   
// this.triggerCallback(type, 'in', [this.feature]);
                    //moded by lei3389
                    //for add a param
                    this.triggerCallback(type, 'in', [this.feature,type]);
                    
//end
                } else if(!previouslyIn || click) {
                    
// in feature for the first time
                   // this.triggerCallback(type, 'in', [this.feature]);
                    //moded by lei3389
                    //for add a param
                    this.triggerCallback(type, 'in', [this.feature,type]);
                    
//end
                }


3.进入【OpenLayers\Control\SelectFeature.js】
handler只是为control服务的,我们让handler处理了右键事件也是为control处理的
刚刚添加的参数就要有用了:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    /**
     * Method: clickFeature
     * Called on click in a feature
     * Only responds if this.hover is false.
     *
     * Parameters:
     * feature - {<OpenLayers.Feature.Vector>} 
     
*/
    
//clickFeature: function(feature) 
    //moded by lei3389
    //for add a param
    clickFeature: function(feature,triggertype) {
    
//end
        if(!this.hover) {
            
var selected = (OpenLayers.Util.indexOf(
                feature.layer.selectedFeatures, feature) 
> -1);
            
if(selected) {
                
if(this.toggleSelect()) {
                    
this.unselect(feature);
                } 
else if(!this.multipleSelect()) {
                    
this.unselectAll({except: feature});
                }
            } 
else {
                
if(!this.multipleSelect()) {
                    
this.unselectAll({except: feature});
                }
                
//moded by lei3389
               // this.select(feature);
                this.select(feature,triggertype);
                
                
//end
            }
        }
    },

 

然后这里也得添加一个参数:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
    
/**
     * Method: select
     * Add feature to the layer's selectedFeature array, render the feature as
     * selected, and call the onSelect function.
     * 
     * Parameters:
     * feature - {<OpenLayers.Feature.Vector>} 
     
*/
    
//moded by lei3389
    //for add a param ---triggertype
     
   
// select: function(feature) 
    select: function(feature,triggertype){
    
//end
        var cont = this.onBeforeSelect.call(this.scope, feature);
        
var layer = feature.layer;
        
if(cont !== false) {
            cont 
= layer.events.triggerEvent("beforefeatureselected", {
                feature: feature
            });
            
if(cont !== false) {
                layer.selectedFeatures.push(feature);
                
this.layerData = {};

                
var selectStyle = this.selectStyle || this.renderIntent;
                
                layer.drawFeature(feature, selectStyle);
                layer.events.triggerEvent(
"featureselected", {feature: feature});
               
            
//moded by lei3389
            //for add another "handler"
             //this.onSelect.call(this.scope, feature);
            switch(triggertype){
                
case "click":
                
this.onSelect.call(this.scope, feature);
                
break;
                
case "contextmenu":
                
this.onRightSelect.call(this.scope, feature);
                
break;
                
default:
                
this.onSelect.call(this.scope, feature);
                }
            
            
//end

            }
        }
    },

 

当然还得添加一个属性,为使用我们刚才修改的成果提供一个调用的接口

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->        /*************************
        *added by lei3389!!!!
        *APIProperty: onRightSelect
        *{Function} Optional function to be called when a feature is selected by RighClick of mouse .
        *The function should expect to be called with a feature.
        
*/
        onRightSelect: 
function(){},


4.现在对OL库的修改已经over了,我们自己使用的时候就可以用了
到自己的代码中来
首先屏蔽掉默认的右键:
      //forbid the mouse's default rightclick
      map.div.oncontextmenu = function () { return false;}
然后就可以像定义左键一样来定义鼠标右键了:
sample:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->      //add selectStationControl
      selectFeatureControl = new OpenLayers.Control.SelectFeature([VectorLayer1,VectorLayer2,VectorLayer3],
                {onSelect: onFeatureSelect, 
                 onUnselect: onFeatureUnselect,
                                 onRightSelect: onFeatureRightSelect
                });
            map.addControl(selectFeatureControl);
      selectFeatureControl.activate();

 

5.应该这样就对右键的修改就over了吧,我把我自己用的OL上传了.

其中包括了SelectFeature控件对多层选择的支持+右键支持
另外还有和本文不相干的一点修改:
是关于ol解析GML v3.0的posList节点的问题,也可能是esri生成gml的时候esri本身的问题,但是arcgis的源代码我改不了。。只能对OL动手了~~
【OpenLayers.Format.GML】

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> linestring: function(node, ring) {
            
/**
             * Two coordinate variations to consider:
             * 1) <gml:posList dimension="d">x0 y0 z0 x1 y1 z1</gml:posList>
             * 2) <gml:coordinates>x0, y0, z0 x1, y1, z1</gml:coordinates>
             
*/
                    
                
var dim = parseInt(nodeList[0].getAttribute("dimension"));
                  
/**
                * added by lei3389
                *dim will be 'NAN' for esri didnot give GML V3 the dimension attribute!
                
*/
                
if(dim='NAN')dim=2;
                
/**
                * end
                
*/


6.终于完了,好长啊
OpenLayers2.7 lei3389修改版下载地址:
http://files.cnblogs.com/lei3389/OpenLayers27_ModedBy_lei3389.rar

分享到:
评论

相关推荐

    使用OpenLayers3 添加地图鼠标右键菜单

    总的来说,使用OpenLayers 3添加地图鼠标右键菜单涉及到监听鼠标事件、坐标转换以及自定义交互逻辑。通过理解OpenLayers的内部结构和提供的API,我们可以轻松地扩展其功能,创建符合项目需求的交互体验。

    openlayers3+ 地图右键

    在OpenLayers 3及以上版本中,地图右键功能的实现是一项关键操作,它允许用户与地图交互并执行特定任务,如获取地图上的坐标、测量距离、添加标记等。本篇文章将详细探讨如何在OpenLayers中自定义地图右键菜单,以...

    openlayers的鼠标滚轮事件

    在OpenLayers中,可以通过`Navigation`控件来控制鼠标滚轮事件的行为。下面通过具体的代码示例来说明如何实现这一功能: ```javascript // 初始化地图 var map, layer; function init() { map = new OpenLayers....

    Openlayers扩展右键菜单

    总结来说,OpenLayers扩展右键菜单是一项提高地图应用交互性的技术,涉及到JavaScript事件处理、DOM操作、CSS样式设计以及地图交互逻辑。通过这样的扩展,我们可以让地图应用变得更加灵活且符合用户的使用习惯。

    openlayers右键菜单

    OpenLayers默认并不提供内置的右键菜单功能,但可以通过自定义事件监听和扩展来实现。这个“不错的demo”可能就是展示了如何在OpenLayers地图上添加并使用右键菜单的一个实例。下面我们将深入探讨如何在OpenLayers中...

    openlayers图层开关控件

    这得益于OpenLayers的事件驱动模型,你可以监听图层集合的变更事件,并进行相应处理。 6. **自定义样式和行为**:图层开关控件的外观和行为可以通过CSS进行定制,也可以通过JavaScript扩展其功能,比如添加图层分组...

    angularjs与openlayers3自定义控件

    4. **事件处理**:监听地图和控件的事件,如点击、移动、缩放等,然后在AngularJS上下文中响应这些事件,更新模型或者执行其他操作。 5. **指令选项**:提供一组可配置的选项,允许用户在使用指令时自定义地图的行为...

    OpenLayers3实现鼠标移动显示坐标

    这个控件能够捕捉鼠标移动事件,并根据设置好的参数显示对应格式的坐标值。重要参数包括: - **projection**:指定坐标系,比如EPSG:4326。 - **coordinateFormat**:坐标值的显示格式。 - **target**:关联的DOM...

    openlayer事件机制介绍

    在OpenLayers中,事件机制主要涉及到控件(Controls)和处理器(Handlers)的概念。 控件在OpenLayers中扮演着重要的角色,它们是附加到地图上的功能组件,如缩放条、平移工具或图层切换器等。每个控件都有一个与之...

    OpenLayers实现图层切换控件

    在OpenLayers中,图层切换控件是用于让用户在多个图层之间自由切换的重要功能。由于OpenLayers库本身并未直接提供这样的控件,开发者需要自定义来实现这一功能。本文将详细介绍如何利用OpenLayers创建一个图层切换...

    Cesium,OpenLayers的支持.zip

    本压缩包"**Cesium,OpenLayers的支持.zip**"似乎提供了将两者结合使用的支持文件,尤其是包含了一个名为"libs"的文件夹,可能包含了必要的库文件和集成指南。 **Cesium** 是一个强大的JavaScript库,用于创建交互...

    openlayers官网没有的demos

    在这个项目里,包含了openlayers官网所没有的示例,包括动画、聚合图层、自定义工具等,详细下载看代码 在 openlayers 官方网站 -- ...contextmenu.html,地图鼠标右键菜单功能。

    openlayers4 的示例 test.zip

    OpenLayers 提供了许多内置的控制元素,如缩放滑块、导航控件等。`my_control.html`可能展示了如何自定义或添加这些控制元素到地图上,以增强用户界面和交互体验。 通过这些示例,学习者可以逐步了解OpenLayers 4...

    opelayers4绘图控件

    在本主题中,我们将聚焦于"opelayers4绘图控件",这是一个自定义的OpenLayers控件,用于在地图上进行图形绘制。 ### 一、OpenLayers 控件概述 OpenLayers 提供了一套内置的控件,如Zoom、Pan、MousePosition等,但...

    Openlayers学习之地图比例尺控件

    在OpenLayers中,地图比例尺控件是一种常用的交互元素,它允许用户直观地理解地图上显示的距离与实际地理距离之间的关系。本篇文章将详细介绍如何在OpenLayers应用中添加和使用地图比例尺控件。 首先,我们需要了解...

    openlayers常用功能简单封装

    OpenLayers不直接支持热力图,但可以通过`ol.source.ImageHeatmap`和`ol.layer.Image`结合第三方库(如heatmap.js)来创建。首先,你需要准备数据点和权重,然后创建源和图层: ```javascript const heatmapSource ...

    OpenLayers附加js支持,jqurey,drawTree

    DrawTree可能提供了一种方法,让用户能够动态地在OpenLayers地图上创建、编辑或查看这些层次结构。 结合jQuery,我们可以实现更加流畅的用户交互,比如在绘制或编辑树结构时提供拖放功能,或者在地图上选择节点时...

    OpenLayers加载缩放控件使用方法详解

    本篇文章将详细讲解如何在OpenLayers中加载和使用缩放控件。 首先,我们需要了解OpenLayers中的控件(controls)。控件是添加到地图上的交互元素,例如缩放条、导航按钮等。这些控件使得用户能够更好地操作和浏览...

Global site tag (gtag.js) - Google Analytics