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(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
随机推荐
- linux删除乱码文件[转载]
一些乱码文件不可以通过普通的rm命令进行管理.可以通过删除i节点的方式删除. [root@192_168_100_35 musicwap]# ls??,?K?k?ͨa*.?J]?k?Φ??P???Z? ...
- Python+Selenium 自动化实现实例-打开浏览器模拟进行搜索数据并验证
#导入模块 from selenium import webdriverfrom selenium.webdriver.common.keys import Keys #启动火狐浏览器driver = ...
- Fraction to Recurring Decimal——数值处理&&哈希表
Given two integers representing the numerator and denominator of a fraction, return the fraction in ...
- [转载] 更改pip源至国内镜像,显著提升下载速度
原文地址: https://blog.csdn.net/lambert310/article/details/52412059 经常在使用python的时候需要安装各种模块,而pip是很强大的模块安装 ...
- window 下 nginx+php+fastcgi 架设备忘
1.配置Php.ini 1)extension_dir = "./ext" 修改这个路径为真实的php的ext路径 2);extension=php_mysql.dll ;exte ...
- div随意拖动,基于jquery。
$("#box").mousedown(function (e) { //e鼠标事件 var offset = $(this).position();//DIV在页面的位置 使用p ...
- IoC控制反转和DI依赖注入
控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征,并非面向对象编程的专用术语.它与依赖注入(Dependency Injection,简称DI ...
- iReport学习笔记
概述 主要介绍如何根据jasper报表和数据生成pdf文档,中文字体问题的解决方案和日期时间的格式化输出. iReport版本:5.2.0 生成pdf文档 maven依赖 <dependency ...
- js for循环的陷阱
☞问题概述 一页面有三个按钮,点击提示相应内容.相应内容已从后台获取,并转化成json数组. var content = ["提示1", "提示2", &quo ...
- SpringMVC中为什么要配置Listener和Servlet
一直以来,我们使用SpringMVC的时候习惯性都配置一个ContextLoaderListener,虽然曾经有过疑问,配置的这个监听器和Servlet究竟做了什么,但也没深究. 要说任何Web框架都 ...