OpenLayers2中的事件_以Popup为例
SATURDAY, 21 MARCH
1-Preface
前几天阅读学习了OpenLayers'Cookbook中的第四章——Working with events。
从AFDS系统的开发项目进行至今,大部分时间都花费在了一些简单的关系数据查询实现以及网页设计与改版上,真正应用到地图部分的核心业务设计几乎还没有 起步。目前系统仅仅只实现了基于OpenLayers和Geoserver的地图数据展示,简单要素的获取,基础要素的样式整饰。用户与地图部分的交互基本没有设计,所以,希望通过学习OpenLayers库中提供的事件实现接口,完成用户与地图数据的交互部分。
2-What?How?
Events are the heart of JavaScript.
这是Cookbook.Chapter 4中的第一句话。由此可见事件对于JS来说是多么的重要。每当用户使用地图工具,比如放大、缩小或者点击选中要素、添加图层等功能时,我们希望系统能够给予用户一定的反馈,比如说提示用户操作是否有效,或者引导用户对数据进行更深入的探索。
那么事件是如何进行反馈的呢?正如其他JS库中的事件一样,OpenLayers提供的事件的实现过程也是经典三部曲:Define event(定义)——Register Listeners(注册)——Trigger events to notify all listeners(等待触发)。
在OpenLayers提供的许多类中,Map、Layer等等,都拥有events属性。而这些属性都是OpenLayers.Events的实例。下面列举一些OpenLayers.Map中常用的事件类型:
EVENT_TYPES: ["preaddlayer", "addlayer","preremovelayer", "removelayer","changelayer", "movestart","move", "moveend", "zoomend", "popupopen", "popupclose","addmarker", "removemarker", "clearmarkers", "mouseover","mouseout", "mousemove", "dragstart", "drag", "dragend","changebaselayer"]
通过上面列举的事件类型,我们可以看到,一些基础的地图操作都已经被列举出来了:添加、删除、更改图层;地图视角移动/前/后;popup打开/关闭;增/删/改标记;鼠标滑过、移出;拖拽地图等等。
3-Instances
其实看到这里我们就应该知道如何使用这些事件了,联想到我的AFDS数据库系统,我第一个想起的就是popup功能,AFDS中实现了一个根据地名定位查询的功能,具体界面类似于:

问题:通过地名选中地点,具体实现:提供名称信息,执行SQL查询,重新生成临时图层tempLayer,并更改临时图层中要素的样式,使其与监测点图层
monitSite区分开。但由于temp-Layer覆盖住了监测点图层monitSite,导致执行定位查询之后,无法选中监测点图层中的点要素。
在没有接触到OpenLayers中的events之前,我是通过使用OpenLayers.Control.Select-Feature的
onUnselect属性实现的,当tempLayer中的要素未被选中时,调整tempLayer的index属性。但由此导出的问题在
于,tempLayer在调整顺序之后,要素仍处于选中状态,而此时monitSite图层已经覆盖住,再选中monitStie图层中的点要素之后,就
会出现这种情况:

解决方案:可以通过使用事件popupopen、popupclose作为指标判断要素点是否被选中,然后根据popup的开闭,当tempLayer中
popup开启的时候,tempLayer调整到所有图层之上,当popup关闭的时候,将tempLayer调整到所有图层之下。从而实现了根据
popup事件的发生控制图层顺序的调换。
存在问题:其实通过之前的解决方案,OpenLayers.Control.Select-Feature的onUn-select和onSelect
属性也可以实现,但事件处理的出现,为我们提供了新的解决问题的方法,由于目前对于事件的使用经验有限,未能在提高系统的业务效率方面有所发现,希望在之
后的学习中能够继续深入。
OpenLayers2中的事件_以Popup为例的更多相关文章
- pygame系列_游戏中的事件
先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...
- QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息
Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...
- 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher
一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...
- Openlayers2中统计图的实现
概述: 在前文中.介绍了Arcgis for js和Openlayers3中统计图的实现.在本文,书接上文.介绍在Openlayers2中,统计图的实现. 实现: 在Openlayers2中,popu ...
- C++中的事件分发
本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...
- javascript中的事件冒泡和事件捕获
1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...
- jQuery文本框中的事件应用
jQuery文本框中的事件应用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- 怎么理解js中的事件委托
怎么理解js中的事件委托 时间 2015-01-15 00:59:59 SegmentFault 原文 http://segmentfault.com/blog/sunchengli/119000 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
随机推荐
- Socket与URL通信比较
转至链接:http://blog.csdn.net/qq_15848173/article/details/46328399 利用URL通信和Socket进行通信有很多相似之处.他们都是利用建立连接. ...
- 动画基础--基于Core Animation(1)
1.简介 上一篇文章[New learn]动画-基于UIView了解到了一些直接由UIView这个在UIKIT提供的类中提供的一些动画方法. 使用UIView的动画特性已经能够满足我们很多的需求,它是 ...
- 【转载】关于Python的Mixin模式
本博按: mixin是看起来是多继承的一种,但是,这种继承并不作为父类存在,而是增加功能到子类中. 像C或C++这类语言都支持多重继承,一个子类可以有多个父类,这样的设计常被人诟病.因为继承应该是个” ...
- Java学习笔记(二)——Java操作properties文件
[前面的话] 前段时间在学习和玩java web相关的东西,对于这些技术,一边学习,一边做东西,一边总结,希望可以一边成长和有所收获.有时总是思考太多反而成为了前进的阻力,所以对于生活还是简单一些,不 ...
- 如何配置Java环境,包括JDK,Maven等
下载JDK并安装 搜索JDK,官网立马就出来了,下载之后个人觉得毕竟开发,毕竟这东西不大,C盘稳一点,安装在C盘可以的 配置 右键打开计算机->属性->高级系统设置->高级-> ...
- ubuntu16.04下安装docker
原文地址:传送门 本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是 ...
- hdu 5117 数学公式展开 + dp
题目大意:有n个灯泡,m个按钮,(1 <= n, m <= 50),每个按钮和ki 个灯泡相关, 按下后,转换这些灯泡的状态,问你所有2^m的按下按钮的 组合中亮着的灯泡的数量的三次方的和 ...
- 2018 icpc 徐州现场赛G-树上差分+组合数学-大佬的代码
现场赛大佬打印的代码,观摩了一哈. 写了注释,贴一下,好好学习.%%%PKU 代码: //树上差分(LCA) #include<bits/stdc++.h> #define For(i,x ...
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...
- SOAP消息的结构
概述 介绍SOAP报文的结构,以及获取的方式. 正文 1.其实发送的是SOAP消息 在前面讲述过使用Eclipse的工具Web Services Explorer发送请求.在Actions中填写请求参 ...