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为例的更多相关文章

  1. pygame系列_游戏中的事件

    先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...

  2. QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息

    Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...

  3. 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

    一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...

  4. Openlayers2中统计图的实现

    概述: 在前文中.介绍了Arcgis for js和Openlayers3中统计图的实现.在本文,书接上文.介绍在Openlayers2中,统计图的实现. 实现: 在Openlayers2中,popu ...

  5. C++中的事件分发

    本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...

  6. javascript中的事件冒泡和事件捕获

    1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...

  7. jQuery文本框中的事件应用

    jQuery文本框中的事件应用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...

  8. 怎么理解js中的事件委托

    怎么理解js中的事件委托 时间 2015-01-15 00:59:59  SegmentFault 原文  http://segmentfault.com/blog/sunchengli/119000 ...

  9. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

随机推荐

  1. 坐标转换——GCJ-02

    WGS84(World Geodetic System 1984),是为GPS 全球定位系统 使用而建立的坐标系统GCJ-02,我国在WGS84的基础上加密得到BD-09,百度坐标在GCJ-02基础上 ...

  2. Hibernate检索策略与检索方式

    hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用.但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大 ...

  3. C语言写随机数

    #include <stdio.h> #include <stdlib.h> #include <time.h> ; unsigned int rand0(); v ...

  4. shell读取nginx配置文件中nginx的端口

    #!/bin/shport=`nl /usr/local/openresty/nginx/conf/nginx.conf | sed -n '/listen/p' | awk 'NR==1{print ...

  5. 使用python获取网易云音乐无损音频教程

    博客园主页:http://www.cnblogs.com/handoing/ github项目:https://github.com/handoing/get-163-music 环境:Python ...

  6. thinkphp+dwz完成的一个号码查询小系统

    基于网友的例子(http://www.thinkphp.cn/extend/450.html),改进完成一个电话号码查询管理系统.基于thinkphp+dwz完成的电话号码查询小系统,主要改进与功能如 ...

  7. grunt 自定义任务实现js文件的混淆及加密

    //自定义任务 module.exports = function (grunt) { // 项目配置 var http = require('http'); var qs = require('qu ...

  8. 不同版本的jquery的复选框checkbox的相关问题

    在尝试写复选框时候遇到一个问题,调试了很久都没调试出来,极其郁闷: IE10,Chrome,FF中,对于选中状态,第一次$('#checkbox').attr('checked',true)可以实现 ...

  9. CentOS7下Samba的安装与配置

    一.Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享 ...

  10. equals和hashcode 和 ==方法说明

    java中==.equals().hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢? 关于== ==是容易理解的.java设计 ...