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

OpenLayers中对 Map的事件 的使用和分析

 
阅读更多

http://www.cnblogs.com/lei3389/archive/2009/04/07/1430922.html

 

Map这个类提供了很多的事件可以让我们使用,本文说的就是如何使用以及对这部分源代码分析,关于openlayers的事件网上有很多的分析。


如何使用:
var map;
// define custom map event listeners
                function mapEvent(event) {
                    log(event.type);
                }
                function mapBaseLayerChanged(event) {
                    log(event.type + " " + event.layer.name);
                }
                function mapLayerChanged(event) {
                    log(event.type + " " + event.layer.name + " " + event.property);
                }
                map = new OpenLayers.Map('map', {
                    eventListeners: {
                        "moveend": mapEvent,
                        "zoomend": mapEvent,
                        "changelayer": mapLayerChanged,
                        "changebaselayer": mapBaseLayerChanged
                    }
                });
                即,初始化的时候传入map的构造函数一个object,这个object中有个属性:
                eventListeners【其实是个哈希表】
看来我们要看map类的构造函数了。
---------------------------------------------------------------------------
---------------------------------------------------------------------------
进入map类,看构造函数
    /**
     * Constructor: OpenLayers.Map
     * Constructor for a new OpenLayers.Map instance.
     *
     * Parameters:
     * div - {String} Id of an element in your page that will contain the map.
     * options - {Object} Optional object with properties to tag onto the map.
     *
     * Examples:
     * (code)
     * // create a map with default options in an element with the id "map1"
     * var map = new OpenLayers.Map("map1");
     *
     * // create a map with non-default options in an element with id "map2"
     * var options = {
     *     maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
     *     maxResolution: 156543,
     *     units: 'm',
     *     projection: "EPSG:41001"
     * };
     * var map = new OpenLayers.Map("map2", options);
     * (end)
     */   
    initialize: function (div, options)
    构造函数中进行初始化
    首先有一句:
            // now override default options
        OpenLayers.Util.extend(this, options);
        Util.extend函数的作用可以理解为:是把第二个参数的属性方法都传给第一个参数
        现在我们看刚才传入的带有eventListeners属性的object
        我们传入的object给了options,则object中的eventListeners就传给了this.eventListeners
        就是map类中的eventListeners属性
    来看这个属性的定义:
       /**
     * APIProperty: eventListeners
     * {Object} If set as an option at construction, the eventListeners
     *     object will be registered with <OpenLayers.Events.on>.  Object
     *     structure must be a listeners object as shown in the example for
     *     the events.on method.
     */
    eventListeners: null,
注释中说这个属性中的东西将通过OpenLayers.Events.on注册上,等会再说
同时指出这个对象必须是个“listeners object”的结构,其实就是我们前面传入的参数的eventListeners的结构
!!这里要注意了,listeners object是整个事件机制中的核心,所有的事件都是注册到他里面,然后触发的时候也是查找这个listeners object,找到里面注册的函数然后执行
goon..

构造函数中下面开始在map中初始化自己的events属性:
this.events = new OpenLayers.Events(this,
                                            this.div,
                                            this.EVENT_TYPES,
                                            this.fallThrough,
                                            {includeXY: true});
再往下就注册了:
if(this.eventListeners instanceof Object) {
            this.events.on(this.eventListeners);
        }
通过map自己的Events属性(其实也是个object,就是events类的实例)中的on这个函数注册上,
我们要进入OpenLayers.Events类
---------------------------------------------------------------------------
---------------------------------------------------------------------------
看这个on方法
   /**
     * Method: on
     * Convenience method for registering listeners with a common scope.
     *
     * Example use:
     * (code)
     * events.on({
     *     "loadstart": loadStartListener,
     *     "loadend": loadEndListener,
     *     scope: object
     * });
     * (end)
     */
    on: function(object) {
        for(var type in object) {
            if(type != "scope") {
                this.register(type, object.scope, object[type]);
            }
        }
    },
on这个函数参数还是第一步中我们传入的eventListeners,就是那个哈希表
遍历,这个“scope”键值是事件的“产生源”对象,就是这个键值对应的对象触发我们注册的事件
register(type, object.scope, object[type])
type就是事件名称
object[type]就是处理事件的函数名
可以看一下第一步中传入的参数:
eventListeners: {
                        "moveend": mapEvent,
                        "zoomend": mapEvent,
                        "changelayer": mapLayerChanged,
                        "changebaselayer": mapBaseLayerChanged
                    }
再进入events类的另一个函数:this.register(type, object.scope, object[type])
   /**
     * APIMethod: register
     * Register an event on the events object.
     *
     * When the event is triggered, the 'func' function will be called, in the
     * context of 'obj'. Imagine we were to register an event, specifying an
     * OpenLayers.Bounds Object as 'obj'. When the event is triggered, the
     * context in the callback function will be our Bounds object. This means
     * that within our callback function, we can access the properties and
     * methods of the Bounds object through the "this" variable. So our
     * callback could execute something like:
     * :    leftStr = "Left: " + this.left;
     *  
     *                   or
     * 
     * :    centerStr = "Center: " + this.getCenterLonLat();
     *
     * Parameters:
     * type - {String} Name of the event to register
     * obj - {Object} The object to bind the context to for the callback#.
     *                     If no object is specified, default is the Events's
     *                     'object' property.
     * func - {Function} The callback function. If no callback is
     *                        specified, this function does nothing.
     *
     *
     */
    register: function (type, obj, func) {

        if ( (func != null) &&
             (OpenLayers.Util.indexOf(this.eventTypes, type) != -1) ) {

            if (obj == null)  {
                obj = this.object;
            }
            var listeners = this.listeners[type];
            listeners.push( {obj: obj, func: func} );
        }
    },
到这里,我们能看到我们所说的核心,那个哈希表,把自己的值都赋给了events类的一个属性:listeners
  /**
     * Property: listeners
     * {Object} Hashtable of Array(Function): events listener functions 
     */
    listeners: null,

这个事件机制的核心哈希表,键名就是事件的名称,也就是参数中的type,键值是一个对象{obj: obj, func: func}
当然这个对象中还有对象。。。。

现在事件已经注册上了,还有一个问题,register函数中提到了this.eventTypes,this.object
所以我们再回来看下events类的构造函数。
map类中实例化events属性的情景:
this.events = new OpenLayers.Events(    this, //指的是map
                                            this.div,
                                            this.EVENT_TYPES,
                                            this.fallThrough,
                                            {includeXY: true});
我们可以和events类的构造函数对比一下参数,就会明白了 
   /**
     * Constructor: OpenLayers.Events
     * Construct an OpenLayers.Events object.
     *
     * Parameters:
     * object - {Object} The js object to which this Events object  is being
     * added element - {DOMElement} A dom element to respond to browser events
     * eventTypes - {Array(String)} Array of custom application events
     * fallThrough - {Boolean} Allow events to fall through after these have
     *                         been handled?
     * options - {Object} Options for the events object.
     */
    initialize: function (
                   object,
                   element,
                   eventTypes,
                   fallThrough,
                   options)
      {
        OpenLayers.Util.extend(this, options);
        this.object     = object;
        this.element    = element;
        this.fallThrough = fallThrough;
        this.listeners  = {};

        // keep a bound copy of handleBrowserEvent() so that we can
        // pass the same function to both Event.observe() and .stopObserving()
        this.eventHandler = OpenLayers.Function.bindAsEventListener(
            this.handleBrowserEvent, this
        );

        // if eventTypes is specified, create a listeners list for each
        // custom application event.
        this.eventTypes = [];
        if (eventTypes != null) {
            for (var i=0, len=eventTypes.length; i<len; i++) {
                this.addEventType(eventTypes[i]);
            }
        }
       
        // if a dom element is specified, add a listeners list
        // for browser events on the element and register them
        if (this.element != null) {
            this.attachToElement(element);
        }
    },
 上面events的初始化是发生在map的初始化中,this.events.on(this.eventListeners);之前的,所以上面提到的register函数中的this.eventTypes,this.object 就明确意思了:
 this.object(this是指的events类)就是map,也就是说map是我们第一步传入参数中的注册事件的“发生源”,(比如button是onclik的“发生源”,“发生源”是本人自定义的。。不知道是否有合适的称呼,术语应该就是srcElement)
this.eventTypes(this是指的events类)就是map类中定义的一个常量:this.EVENT_TYPES(this是指的map类)
查到map类中的这个常量 EVENT_TYPES: [
        "preaddlayer", "addlayer", "removelayer", "changelayer", "movestart",
        "move", "moveend", "zoomend", "popupopen", "popupclose",
        "addmarker", "removemarker", "clearmarkers", "mouseover",
        "mouseout", "mousemove", "dragstart", "drag", "dragend",
        "changebaselayer"],
所以我们在初始化map的时候传入的参数中,注册的事件都是来自于这个常量中的

分享到:
评论

相关推荐

    openlayers项目分析文档

    该项目由MetaCarta公司发起,并遵循BSD许可证发布,允许自由使用和修改。OpenLayers 的最新版本为2.5,它支持多种行业标准,如OpenGIS的WMS(Web Map Service)和WFS(Web Feature Service)规范,确保在不同浏览器...

    openlayers中文api.zip

    总的来说,OpenLayers通过提供这些组件和接口,使得开发者能够构建复杂、高性能的GIS应用,无论是基本的地图浏览、数据展示,还是高级的分析和编辑功能,都能轻松实现。中文API文档的出现,无疑为中文开发者提供了极...

    OpenLayers 类分析(一)

    本篇将对OpenLayers 源码中的一些核心类进行分析,特别是与事件处理相关的类,如OpenLayers.Events、OpenLayers.Control等。阅读本文之前,建议读者具备一定的 OpenLayers 使用经验。 首先,我们来看OpenLayers....

    Mapping voters with MapServer, PostGIS and OpenLayers

    本文档将深入探讨如何利用MapServer、PostGIS以及OpenLayers这三种工具来实现选民地图的构建,这一过程主要用于2008年美国总统大选奥巴马竞选活动中的选民分析和支持工作。项目的目标在于提供一个有效且成本低廉的...

    最全最新的中文openLayers_api

    通过学习这些知识点,开发者可以熟练地使用OpenLayers API构建各种复杂的地图应用,无论是在Web开发、地理信息系统还是数据分析领域都有广泛的应用。中文文档的提供使得中文用户能更方便地理解和使用这一强大的工具...

    OpenLayers中文API

    2. **类和对象**:详细解释OpenLayers中的各个类和对象,如Map、Layer、View等,以及它们之间的关系和用法。 3. **方法和属性**:列出每个类的方法和属性,说明其功能和参数。 4. **示例代码**:提供实际的...

    openlayers4.0+arcgis10.1+token

    在IT行业中,OpenLayers和ArcGIS是两种广泛使用的地理信息系统(GIS)库,它们主要用于创建交互式的地图应用程序。本文将详细讲解如何结合OpenLayers 4.0与ArcGIS 10.1,以及如何实现动态获取token进行集成开发。 *...

    openlayers 编辑geoserver图层

    本资源主要针对初级学习者,介绍如何使用OpenLayers对GeoServer图层进行编辑。 首先,让我们了解OpenLayers。OpenLayers提供了一个灵活的API,用于创建交互式的地图应用。它可以加载多种地图源,包括WMS(Web Map ...

    Openlayers2多地图联动

    在OpenLayers2中,多地图联动的核心是通过事件监听和处理来同步各个地图层的行为。例如,当用户在一张地图上进行缩放、平移或者选择某个区域时,这些操作可以被传递到其他关联的地图,使得它们同时更新,保持视觉上...

    OpenLayers项目分析

    这个项目由MetaCarta公司发起,现在由OpenLayers社区维护,遵循BSD许可证,允许自由使用和修改。OpenLayers的核心目标是提供一种浏览器独立的方式来访问和展示地理空间数据,它支持多种开放标准,如OpenGIS的WMS...

    OpenLayers参考

    10. **最佳实践与案例分析**:通过阅读中文说明和学习心得,可以获取实际开发中的经验分享,了解最佳实践,避免常见错误,提升开发效率。 总之,"OpenLayers参考"这个资料包将帮助开发者全面理解和掌握OpenLayers的...

    openlayers基础系列教程

    OpenLayers 的_license 是 BSD License,免费开源,任何人都可以免费使用和修改。 OpenLayers 的技术架构主要基于 JavaScript 和 Prototype 框架,使用了 Rico 库的一些组件。OpenLayers 采用纯面向对象的 ...

    uDig定制地图样式发布到Geoserver并使用Openlayers和Cesium验证.rar

    项目中提供的文档很可能是详细步骤指南,涵盖了如何使用uDig创建地图样式,如何在Geoserver上发布地图服务,以及如何使用OpenLayers和Cesium进行展示和验证。同时,文档中可能还包含了代码示例,帮助用户理解如何与...

    openlayers

    6. **地图服务集成**:OpenLayers 可以与各种地图服务提供商(如OpenStreetMap、Google Maps、Bing Maps等)无缝对接,获取并展示地图数据。 7. **高性能渲染**:使用高效的SVG和Canvas技术进行地图渲染,确保在...

    openlayers离线文档

    "事件"(Events)在OpenLayers中用于监听用户交互和地图状态变化。例如,可以监听地图的移动(moveend)事件来执行某些操作。事件监听器通过`OpenLayers.Event.observe()`函数添加。 "地理编码"(Geocoding)是将...

    OpenLayers源码

    OpenLayers 的源码分析将帮助我们深入理解其背后的原理和技术实现。 1. **矢量图层和瓦片图层**: OpenLayers 提供了处理矢量数据和瓦片图像的能力。矢量图层允许动态绘制点、线和多边形,支持自定义样式和交互...

    WebGIS之OpenLayers全面解析 源码+数据库

    OpenLayers允许开发者在网页上创建交互式地图,支持多种地图服务,如WMS(Web Map Service)、WMTS(Web Map Tile Service)和TMS(Tile Map Service)。它提供了丰富的地图操作功能,如缩放、平移、图层控制、标记...

    OpenLayers优秀的开源WEBGIS

    6. **最佳实践**:在实际项目中,合理使用OpenLayers的缓存机制、优化图层加载策略、注意性能调优,以及遵循无障碍(accessibility)和响应式设计原则,都是提高用户体验的关键。 7. **未来趋势**:随着WebGL和...

    openlayers-官方完整包-v4.6.5

    OpenLayers 是一个强大的开源JavaScript库,用于在Web浏览器中创建交互式地图应用。它支持多种数据源和地图服务,如WMS、WMTS、TMS等,使得开发者能够轻松地将地理信息系统(GIS)集成到网页中。v4.6.5是OpenLayers...

Global site tag (gtag.js) - Google Analytics