源码分析之Openlayers中MousePosition鼠标位置控件
概述
本文主要介绍 Openlayers 中的MousePosition
鼠标位置控件,该控件会创建一个元素在页面的右上方用来实时显示鼠标光标的位置坐标。该控件在实际应用很有效,可以实时获取鼠标位置,但是一般控件元素都会自定义。
源码分析
MousePosition
类是继承于Control
类,关于Control
类,可以参考这篇文章源码分析之Openlayers中的控件篇Control基类介绍。
MousePosition
类实现如下:
class MousePosition extends Control {constructor(options) {options = options ? options : {};const element = document.createElement("div");element.className =options.className !== undefined ? options.className : "ol-mouse-position";super({element: element,render: options.render,target: options.target,});this.on;this.once;this.un;this.addChangeListener(PROJECTION, this.handleProjectionChanged_);if (options.coordinateFormat) {this.setCoordinateFormat(options.coordinateFormat);}if (options.projection) {this.setProjection(options.projection);}this.renderOnMouseOut_ = options.placeholder !== undefined;this.placeholder_ = this.renderOnMouseOut_ ? options.placeholder : " ";this.renderedHTML_ = element.innerHTML;this.mapProjection_ = null;this.transform_ = null;this.wrapX_ = options.wrapX === false ? false : true;}handleProjectionChanged_() {this.transform_ = null;}getCoordinateFormat() {return this.get(COORDINATE_FORMAT);}handleMouseOut(event) {this.updateHTML_(null);}getProjection() {return this.get(PROJECTION);}handleMouseMove(event) {const map = this.getMap();this.updateHTML_(map.getEventPixel(event));}setMap(map) {super.setMap(map);if (map) {const viewport = map.getViewport();this.listenerKeys.push(listen(viewport, EventType.POINTERMOVE, this.handleMouseMove, this));if (this.renderOnMouseOut_) {this.listenerKeys.push(listen(viewport, EventType.POINTEROUT, this.handleMouseOut, this));}this.updateHTML_(null);}}setCoordinateFormat(format) {this.set(COORDINATE_FORMAT, format);}setProjection(projection) {this.set(PROJECTION, getProjection(projection));}updateHTML_(pixel) {let html = this.placeholder_;if (pixel && this.mapProjection_) {if (!this.transform_) {const projection = this.getProjection();if (projection) {this.transform_ = getTransformFromProjections(this.mapProjection_,projection);} else {this.transform_ = identityTransform;}}const map = this.getMap();const coordinate = map.getCoordinateFromPixelInternal(pixel);if (coordinate) {const userProjection = getUserProjection();if (userProjection) {this.transform_ = getTransformFromProjections(this.mapProjection_,userProjection);}this.transform_(coordinate, coordinate);if (this.wrapX_) {const projection =userProjection || this.getProjection() || this.mapProjection_;wrapX(coordinate, projection);}const coordinateFormat = this.getCoordinateFormat();if (coordinateFormat) {html = coordinateFormat(coordinate);} else {html = coordinate.toString();}}}if (!this.renderedHTML_ || html !== this.renderedHTML_) {this.element.innerHTML = html;this.renderedHTML_ = html;}}render(mapEvent) {const frameState = mapEvent.frameState;if (!frameState) {this.mapProjection_ = null;} else {if (this.mapProjection_ != frameState.viewState.projection) {this.mapProjection_ = frameState.viewState.projection;this.transform_ = null;}}}
}
MousePosition
类构造函数
MousePosition
类构造函数接受一个参数对象options
,该参数可以包含如下属性:
className
:控件类名,默认为ol-mouse-position
render
:自定义render
方法,默认undefined
target
:控件容器,默认undefined
coordinateFormat
:坐标格式化,默认undefined
projection
:分辨率,默认undefined
placeholder
:提示填充字符wrapX
:是否水平方向重复延申
构造函数首先会先注册projection
的监听事件this.handleProjectionChanged_
,若该值发生变化,则将this.transform_
置null
;然后判断,若options.coordinateFormat
存在,则调用this.setCoordinateFormat
方法;若options.projection
存在,则调用this.setProjection
方法;
MousePosition
类中的方法
getCoordinateFormat
方法:获取坐标格式化getProjection
方法:获取投影handleMouseMove
方法:接受一个参数event
,该方法是鼠标在地图上移动时调用,会更新控件的内容坐标的值,getEventPixel
就是根据参数event
获取鼠标的位置以及viewport
的某些属性,然后计算屏幕坐标handleMouseOut
方法:鼠标移除地图时调用setCoordinateFormat
方法:设置坐标格式化setProjection
方法:设置投影updateHTML_
方法:根据屏幕坐标获取地理坐标render
方法:在调用父类的setMap
方法时会调用,主要用于设置this.mapProject_
setMap
方法:sepMap
方法会在Map
类中调用,内部首先会调用父类的setMap
方法,然后判断参数map
是否存在,若存在,则注册viewport
视口对象pointermove
类型的监听,事件为this.handleMouseMove
;若构造函数参数options.placeholder
设置了,还会注册viewport
的pointerout
的this.handleMouseOut
事件。
总结
本文主要介绍了 Openlayers 中MousePosition
鼠标位置控件的源码实现,核心就是注册viewport
对象上pointermove
类型的监听事件获取屏幕坐标,然后调用内部方法map.getCoordinateFromPixelInternal
将屏幕坐标转化为实际的地理位置坐标。
相关文章:
源码分析之Openlayers中MousePosition鼠标位置控件
概述 本文主要介绍 Openlayers 中的MousePosition鼠标位置控件,该控件会创建一个元素在页面的右上方用来实时显示鼠标光标的位置坐标。该控件在实际应用很有效,可以实时获取鼠标位置,但是一般控件元素都会自定义。 源码分析 MousePosition…...

以ATTCK为例构建网络安全知识图
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念,并探讨通过ATT&a…...
myexcel的使用
参考: (1)api文档:https://www.bookstack.cn/read/MyExcel-2.x/624d8ce73162300b.md (2)源代码: https://github.com/liaochong/myexcel/issues 我: (1)m…...
Unity 上好用的插件
PlayerMaker BehaviorDesigner Cinemachine Timeline Hybrid Addressable AssetBundle Blower Simple Zoom 大地图上缩放和平移使用ScrollRect的好效果实现...

Vivado - 远程调试 + 远程综合实现 + vmWare网络配置 + NFS 文件共享 + 使用 VIO 核
目录 1. 简介 2. VIO 配置 2.1 VIO IP 2.2 VIO 对比 ILA 3. VIO 示例 3.1 Led 3.1.1 工程配置 3.1.2 效果展示 3.2 Key 3.2.1 工程配置 3.2.1 效果展示 3.3 门控触发 3.3.1 工程配置 3.3.2 效果展示 4. 远程调试 4.1 配置目标主机 4.2 配置本机 4.3 vmWare 网…...

双臂机器人
目录 一、双臂机器人简介 二、双臂机器人系统的组成 三、双臂机器人面临的主要挑战 3.1 协调与协同控制问题 3.2 力控制与柔顺性问题 3.3 路径规划与轨迹优化问题 3.4 感知与环境交互 3.5 人机协作问题 3.6 能源与效率问题 3.7 稳定性与可靠性问题 四、双臂机器人…...

【Lua热更新】上篇
Lua 热更新 - 上篇 下篇链接:【Lua热更新】下篇 文章目录 Lua 热更新 - 上篇一、AssetBundle1.理论2. AB包资源加载 二、Lua 语法1. 简单数据类型2.字符串操作3.运算符4.条件分支语句5.循环语句6.函数7. table数组8.迭代器遍历9.复杂数据类型 - 表9.1字典9.2类9.3…...
Ubuntu批量修改文件名
文章目录 批量重命名文件:Ubuntu下使用find命令结合sed和mv参考 批量重命名文件:Ubuntu下使用find命令结合sed和mv 在日常开发和文件管理中,有时我们需要批量重命名一批文件,比如将文件名中的某个特定字符串替换为另一个字符串。…...

食家巷大烤馍:岁月沉淀下的麦香传奇
在繁华都市的街角巷尾,隐藏着许多不为人知的美食宝藏,食家巷大烤馍便是其中之一。它宛如一位低调的美食大师,默默散发着独特的魅力,用最质朴的味道,征服着每一个过往食客的味蕾。 初见食家巷大烤馍,你会被…...

harmony UI组件学习(1)
Image 图片组件 string格式,通常用来加载网络图片,需要申请网络访问权限:ohos.permission.INTERNET Image(https://xxx.png) PixelMap格式,可以加载像素图,常用在图片编辑中 Image(pixelMapobject) Resource格式,加…...
BTP Integration Suite CPI Apache Camel
官网文档: https://help.sap.com/docs/integration-suite/sap-integration-suite/what-is-sap-integration-suite CPI 云集成(CPI)有以下几个特性: SAP Cloud Integration通过消息交换支持端到端流程集成。 它基于Apache软件基金会的开源框架Camel。 …...

vitepress-打包SyntaxError: Element is missing end tag.
一、vitepress打包编译报错Element is missing end tag. 背景: 新增了一些笔记准备上传到git仓库,持续集成部署的时候,控制台报错了,错误信息如下: SyntaxError: Element is missing end tag. 仔细看了下控制台几乎没啥…...

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类
文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例:重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…...

Java进程占用的内存有哪些部分?
大家好,我是锋哥。今天分享关于【Java进程占用的内存有哪些部分?】面试题。希望对大家有帮助; Java进程占用的内存有哪些部分? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java进程在运行时,会将内存划分为多个区域…...
【华为OD机试真题】【2024年E卷】数值同化-队列BFS(C++/Java/Python)
文章目录 分值:200题目描述思路复杂度分析AC 代码 分值:200 题目描述 存在一个 m * n 的 二维数组只,其成员取值范围为0, 1, 2。其中值为1的元素具备同化特性,每经过1S,将上下左右值为0的元素同化为1。而值为2的元素…...
“魔法糖果盒的秘密:用朴素贝叶斯算法猜糖果颜色”
想象一下,你有一个神奇的糖果盒,这个糖果盒里有两种糖果:红色的和蓝色的。你闭上眼睛,从盒子里拿出一个糖果,然后尝一尝,你想知道这个糖果是红色的还是蓝色的。朴素贝叶斯算法就像是一个魔法规则࿰…...
linux中docker命令大全
基本命令 docker pull 拉取镜像 docker pull docker push 推送镜像到DockerRegistry docker push docker images 查看本地镜像 docker images docker rmi 删除本地镜像 docker rmi docker run 创建并运行容器(不能重复创建) docker run d…...
Python `str.strip()` 的高级用法详解
Python str.strip 的高级用法详解 1. str.strip() 的基本用法2. str.strip() 的高级用法2.1 移除指定字符2.2 移除多个指定字符2.3 移除换行符和制表符2.4 结合正则表达式的高级处理 3. lstrip() 和 rstrip() 的用法3.1 lstrip():移除左端字符3.2 rstrip()ÿ…...

[蓝桥杯 2019 国 B] 排列数
目录 前言 题解 思路 疑问 解答 前言 对于本篇文章是站在别人的基础之上来写的,对于这道题作为2019年国赛B组的最难的一题,他的难度肯定是不小的,这道题我再一开始接触的时候连思路都没有,也是看了两三遍别人发的题解&#x…...
[bug] StarRocks borker load意向之外的bug
意向之外,又清理之中 背景: StarRocks各方面碾压相同类型的数据库,最近我们要从生成HIVE导历史数据(ORC格式)到StarRocks,前期小测一下,在测试是没问题,上生产先导2个月的数据&…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...