源码分析之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-positionrender:自定义render方法,默认undefinedtarget:控件容器,默认undefinedcoordinateFormat:坐标格式化,默认undefinedprojection:分辨率,默认undefinedplaceholder:提示填充字符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个月的数据&…...
超导量子比特控制技术:DRAG与神经网络优化
1. 超导量子比特控制技术概述在超导量子计算系统中,精确的量子态操控是实现高保真度量子门操作的基础。传统微波脉冲控制面临两大核心挑战:非绝热跃迁导致的能级泄漏和频率失谐引起的操作误差。DRAG(Derivative Removal by Adiabatic Gate&am…...
NGA论坛优化脚本完整指南:5分钟打造高效浏览体验
NGA论坛优化脚本完整指南:5分钟打造高效浏览体验 【免费下载链接】NGA-BBS-Script NGA论坛增强脚本,给你完全不一样的浏览体验 项目地址: https://gitcode.com/gh_mirrors/ng/NGA-BBS-Script 如果你经常在NGA论坛上冲浪,那么这款NGA论…...
不止是省9.9刀:解锁特斯拉Model 3的‘行驶中保持WiFi’功能,打造家庭移动娱乐中心
不止是省9.9刀:解锁特斯拉Model 3的‘行驶中保持WiFi’功能,打造家庭移动娱乐中心 特斯拉Model 3的车载4G网络虽然方便,但在信号不佳的区域或需要大流量娱乐的场景下,往往显得力不从心。更让许多家庭用户纠结的是,高级…...
从音箱分频到电源净化:聊聊RLC低通滤波器那些意想不到的实用场景
从音箱分频到电源净化:聊聊RLC低通滤波器那些意想不到的实用场景 在电子工程的世界里,RLC低通滤波器就像一位低调的幕后英雄。它不像微处理器那样引人注目,也不像显示屏那样直观可见,却在无数电子设备中默默发挥着关键作用。从你每…...
统考通过率最高传媒艺考机构艺天影视
大家好,我是深耕传媒艺考行业8年的教学顾问。近年来,山西的传媒艺考竞争愈发激烈,以2026届为例,播音统考近万人报考,考生和家长无不感到压力山大。面对如此激烈的竞争,很多同学和家长在选择艺考培训机构时感…...
颈椎健康互助平台
颈椎健康互助平台选题背景分析随着信息技术的飞速发展和现代社会工作、生活方式的深刻变革,颈椎健康问题已从一个单纯的医学议题,演变为一个影响广泛、亟待社会协同解决的公共健康挑战。颈椎健康互助平台的选题,正是在这一宏观背景下应运而生…...
Wave Terminal:集成 AI 功能的强大终端,助你高效工作!
Wave Terminal:集成 AI 功能的强大终端应用,高效工作新选择!Wave Terminal 是一款功能强大的终端应用程序,它将多种工具集于一身,还集成了 AI 功能,支持 Linux、MacOS 和 Windows 系统。使用 Linux 终端数十…...
Taotoken在应对大模型API服务波动时的路由与容灾机制体验
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken在应对大模型API服务波动时的路由与容灾机制体验 1. 背景与观测场景 在开发实践中,我们时常会遇到依赖的某个…...
如何轻松配置Windows和Office:面向新手的终极解决方案指南
如何轻松配置Windows和Office:面向新手的终极解决方案指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出配置提示而烦恼吗?Office突然变成只…...
保姆级教程:用ESP32-S3和LVGL驱动3.5寸ILI9488屏幕(附常见编译错误解决)
ESP32-S3与LVGL实战:3.5寸ILI9488屏幕驱动全攻略与疑难解析 当创客们第一次拿到ESP32-S3开发板和3.5寸ILI9488屏幕时,往往会陷入既兴奋又困惑的状态——硬件连接看似简单,但真正要让屏幕亮起来并显示内容,却可能遭遇各种"坑…...
