源码分析之Openlayers中的控件篇Control基类介绍

概述

Openlayers 中内置了9类控件,这9类控件都是基于Control类,而Control类则是继承于BaseObject类,如下图所示:

在这里插入图片描述

如上,这9类控件分别是:

  • Attribution:属性控件
  • FullScreen:全屏控件
  • MousePosition:鼠标位置控件
  • OverviewMap:鹰眼控件
  • Rotate:旋转控件源码分析之Openlayers中的Rotate旋转控件
  • ScaleLine:比例尺控件
  • Zoom:缩放控件,可参考源码分析之Openlayers中的Zoom缩放控件
  • ZoomSlider:滑动缩放控件
  • ZoomToExtent:缩放到指定视图范围控件源码分析之Openlayers中的ZoomToExtent控件

本文主要介绍控件的基类Control类。

源码剖析

Control类的实现如下:

class Control extends BaseObject {constructor(options) {super();const element = options.element;if (element && !options.target && !element.style.pointerEvents) {element.style.pointerEvents = "auto";}this.element = element ? element : null;this.target_ = null;this.map_ = null;this.listenerKeys = [];if (options.render) {this.render = options.render;}if (options.target) {this.setTarget(options.target);}}disposeInternal() {this.element?.remove();super.disposeInternal();}getMap() {return this.map_;}setMap(map) {if (this.map_) {this.element?.remove();}for (let i = 0, ii = this.listenerKeys.length; i < ii; ++i) {unlistenByKey(this.listenerKeys[i]);}this.listenerKeys.length = 0;this.map_ = map;if (map) {const target = this.target_ ?? map.getOverlayContainerStopEvent();target.appendChild(this.element);if (this.render !== VOID) {this.listenerKeys.push(listen(map, MapEventType.POSTRENDER, this.render, this));}map.render();}}render(mapEvent) {}setTarget(target) {this.target_ =typeof target === "string" ? document.getElementById(target) : target;}
}

Control类的构造函数

Control类的构造函数接受一个参数对象options,先是判断options.element!element.style.pointerEvents以及!options.target是否存在,若为true,则修改element元素的样式,element对应的就是控件的HTML Element;然后初始化this.element,若options.element不存在,则this.elementnull,反之为options.element;初始化this.target_this.map_null;初始化this.listenerKeys[];最后判断options.render是否存在,若存在则覆盖this.render方法;判断options.target是否存在,若存在,则调用this.setTarget方法。

Control类的主要方法

Control类作为控件基类,它定义的方法很少,主要有如下几个:

  • setTarget:接受一个参数target,若target是一个字符串,则调用document.getElementById获取DOM节点,否则直接赋值,默认情况下,控件是会添加到overlay container中,这个方法会改变这个一默认行为

  • getMap: 获取this.map_

  • setMap:Control类的核心方法,接受一个参数map对象,若this.map_存在该控件元素,则移除元素;并且循环遍历this.listenerKeys移除注册的事件监听,并且清空this.listenerKeys,设置this.map_的值;然后判断参数map是否存在,若存在,则重新添加控件元素到overlay container中,然后判断this.render是否是空方法,若不为空方法,则调用listen方法注册postrender类型的事件监听,this.render方法即为注册的回调函数,本质上它是子类中定义的一个方法;最后调用map.render方法。

  • render方法:空函数,会被Control的子类覆盖

  • disposeInternal方法:清除方法,会移除控件元素,调用父类的disposeInternal方法移除监听

总结

本文主要介绍了 Openlayers 中的控件类型分类以及控件基类Control类的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第P2周:Pytorch实现CIFAR10彩色图片识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 实现CIFAR-10的彩色图片识别实现比P1周更复杂一点的CNN网络 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: …

2024年食堂采购系统源码技术趋势:如何开发智能的供应链管理APP

本篇文章&#xff0c;小编将与大家一同探讨2024年食堂采购系统的技术趋势&#xff0c;并提供开发更智能的供应链管理APP的策略。 一、2024年食堂采购系统的技术趋势 1.人工智能与机器学习的深度应用 在2024年&#xff0c;AI和机器学习在食堂采购系统中的应用将更加普遍。这些…

系统架构的演变

什么是系统架构&#xff1f; 系统架构是系统的一种整体的高层次的结构表示&#xff0c;它确定了系统的基本组织、组件之间的关系、组件与环境的关系&#xff0c;以及指导其设计和发展的原则。随着技术的发展和业务需求的增长&#xff0c;系统架构经历了从简单到复杂、从集中到…

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…

【C语言实现:用队列模拟栈与用栈模拟队列(LeetCode 225 232)】

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

java jar包加密 jar-protect

介绍 java 本身是开放性极强的语言,代码也容易被反编译,没有语言层面的一些常规保护机制,jar包很容易被反编译和破解。 受classfinal&#xff08;已停止维护&#xff09;设计启发,针对springboot日常项目开发,重新编写安全可靠的jar包加壳加密技术,用于保护软件版权。 使用说…

Linux:Git

Git常见指令&#xff1a; git help xx_command git xx_command --help git --version 查看git版本git config --global user.name "xxx_name" 全局级别的签名设置&#xff0c;全局的放在本用 git config --global user.ema…

【WiFi】WiFi中RSSI、SNR、NF之间关系及说明

RSSI&#xff08;接收信号强度指示&#xff09; 定义&#xff1a; RSSI 是一个相对值&#xff0c;用于表示接收到的无线信号的强度。它通常由无线设备的硬件&#xff08;如无线网卡或无线芯片&#xff09;直接提供。 计算&#xff1a; RSSI 的计算通常是由设备的无线芯片完成的…

[ZMQ] -- ZMQ通信Protobuf数据结构 1

1、前言背景 工作需要域间实现zmq通信&#xff0c;刚开始需要比较简单的数据结构&#xff0c;比如两个bool&#xff0c;后面可能就需要传输比较大的数据&#xff0c;所以记录下实现流程&#xff0c;至于为啥选择proto数据结构去做大数据传输&#xff0c;可能是地平线也用这个&…

顺序表的使用,对数据的增删改查

主函数&#xff1a; 3.c #include "3.h"//头文件调用 SqlListptr sql_cerate()//创建顺序表函数 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆区申请连续的空间if(NULLptr){printf("创建失败\n");return NULL;//如果没有申请成功&#xff…

5G中的随机接入过程可以不用收RAR?

有朋友提到了一种不用接收RAR的RA过程&#xff0c;问这个是怎么回事。其实在刚刚写过的LTM cell switch篇章中就有提到&#xff0c;这里把所有相关的内容整理如下。 在RACH-less LTM场景&#xff0c;在进行LTM cell switch之前就要先知道target cell的TA信息&#xff0c;进而才…

git 导出某段时间修改的文件 windows

第一步&#xff1a;列出两次commitID之间的文件变动 git diff oldid newid --name-only// 例如 git diff 4a886c57a8b5611a2abcfcd120461c2e92f7029a HEAD --name-only 4a886c57a8b5611a2abcfcd120461c2e92f7029a 代表之前 HEAD 代表最新或者换成某次commitID 例如&#xf…

Qt 联合Halcon配置

文章目录 配置代码窗口绑定 配置 选择添加库 选择外部库 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…

new URL(`../assets/images/${name}`, import.meta.url).href

背景&#xff1a; 文章讲述了Vite框架中关于资源文件&#xff08;如图片&#xff09;在默认配置下&#xff0c;如何正确处理开发环境和打包后的不同引用方式。重点介绍了使用import.meta.url和new URL() 来动态获取并处理静态资源URL的方法&#xff0c;以及注意事项&#xff0…

Tiptap,: 富文本编辑器入门与案例分析

Tiptap 是一个现代的富文本编辑器&#xff0c;基于 ProseMirror 打造&#xff0c;旨在提供一个灵活且功能强大的文本编辑解决方案。它具有开箱即用的能力&#xff0c;同时也允许开发者根据业务需求进行高度定制化扩展。与传统的富文本编辑器相比&#xff0c;Tiptap 提供了更精细…

Java基础学习:java常用启动命令

一、java -jar 1、系统属性传递 使用形式&#xff1a;java -DpathD:\jacoco -jar 获取方式&#xff1a;System.getProperties() 2、系统参数传递 使用形式&#xff1a;java -jar application.jar --jacocoPathD:\tomcat 获取方式&#xff1a;通过启动方法入口main的参数arg…

负载均衡oj项目:介绍

目录 项目介绍 项目演示 项目介绍 负载均衡oj是一个基于bs模式的项目。 用户使用浏览器向oj模块提交代码&#xff0c;oj模块会在所有在线的后端主机中选择一个负载情况最低的主机&#xff0c;将用户的代码提交给该主机&#xff0c;该主机进行编译运行&#xff0c;将结果返回…

gateway 微服务的入口-笔记

本文属于b站图灵课堂springcloud笔记系列。讲的好还不要钱&#xff0c;值得推荐。 为什么需要API网关&#xff1f; 客户端多次请求不同的微服务&#xff0c;会增加客户端代码和配置的复杂性&#xff0c;维护成本比价高认证复杂&#xff0c;每个微服务可能存在不同的认证方式&…

vue2+element-ui实现多行行内表格编辑

效果图展示 当在表格中点击编辑按钮时:点击的行变成文本框且数据回显可以点击确定按钮修改数据或者取消修改回退数据: 具体实现步骤 1. 行数据定义编辑标记 行数据定义编辑标记 当在组件中获取到用于表格展示数据的方法中,针对每一行数据添加一个编辑标记 this.list.f…

安卓主板_MTK联发科android主板方案

在当前智能设备的发展中&#xff0c;安卓主板的配置灵活性和性能优化显得尤为重要。安卓主板的联发科方案&#xff0c;在芯片上&#xff0c;搭载联发科MTK6761、MT8766、MT6765、MT6762、MT8768、MT8390、MTK8370以及MT8788等型号&#xff0c;均基于64位的四核或八核架构设计。…