113. 在 Vue 3 中使用 OpenLayers 实现鼠标移动显示坐标信息

✨ 写在前面

在地图类项目开发中,一个常见需求就是:实时获取用户鼠标在地图上的经纬度坐标,并展示在地图上。

本文将通过一个简单的案例,手把手带大家在 Vue 3 项目中集成 OpenLayers 地图库,并实现以下功能:

  • 加载 OpenStreetMap 地图瓦片

  • 鼠标移动时显示实时坐标(经纬度)

  • 使用 MousePosition 控件格式化坐标

  • 支持 Vue 3 Composition API


🔧 技术栈

  • Vue 3 + <script setup>

  • Vite 5+ 构建工具(也支持 Vue CLI)

  • OpenLayers v7+

  • 原生 CSS + Tailwind class(可选)


📦 环境安装

npm install ol

或使用 yarn:

yarn add ol

确保你使用的是 Vue 3 项目结构。如果你还没有项目,可以用 Vite 快速初始化:

npm create vite@latest vue3-openlayers-demo --template vue 
cd vue3-openlayers-demo 
npm install 
npm install ol 
npm run dev

🧩 核心代码实现

我们来直接上代码吧,以下是一个完整的 Vue 组件文件:

MouseCoordinateMap.vue

<!--* @Author: 彭麒* @Date: 2025/4/7* @Email: 1062470959@qq.com* @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。-->
<template><div class="container"><div class="w-full flex justify-center flex-wrap"><div class="font-bold text-[24px]">在Vue3中使用OpenLayers实现鼠标在地图上移动显示坐标信息</div></div><div id="vue-openlayers" class="map-x"><div class="mouse" ref="mousePositionTxt"></div></div></div>
</template><script setup>
import { onMounted, ref } from 'vue'
import 'ol/ol.css'
import { Map, View } from 'ol'
import Tile from 'ol/layer/Tile'
import { OSM } from 'ol/source'
import * as control from 'ol/control'
import * as coordinate from 'ol/coordinate'const mousePositionTxt = ref(null)
let map = nullconst initMap = () => {map = new Map({target: 'vue-openlayers',controls: control.defaults().extend([new control.MousePosition({coordinateFormat: coordinate.createStringXY(4),projection: 'EPSG:4326',target: mousePositionTxt.value})]),layers: [new Tile({source: new OSM()})],view: new View({projection: 'EPSG:4326',center: [114.064839, 22.548857],zoom: 4})})
}onMounted(() => {initMap()
})
</script><style scoped>
.container {width: 840px;height: 520px;margin: 0 auto;border: 1px solid #42B983;
}
#vue-openlayers {width: 800px;height: 400px;margin: 0 auto;border: 1px solid #42B983;position: relative;
}
.mouse {position: absolute;bottom: 50px;right: 20px;z-index: 10;color: #f00;width: 150px;
}
</style>

📚 关键点解析

1️⃣ MousePosition 控件的作用

这是 OpenLayers 内置的控件,用于监听鼠标事件并展示坐标信息。

new control.MousePosition({ coordinateFormat: coordinate.createStringXY(4), projection: 'EPSG:4326', target: this.$refs.mousePositionTxt 
})

在 Vue 3 Composition API 中,需要使用 ref 拿到 DOM 节点,再绑定到 target

2️⃣ 坐标格式化函数

你可以自定义经纬度显示格式,比如:

coordinateFormat: (coord) => `经度: ${coord[0].toFixed(4)}, 纬度: ${coord[1].toFixed(4)}`

也可以用内置的 createStringXY(4),表示保留 4 位小数。


✅ 最终效果截图

🖱 当你将鼠标移动到地图上时,右下角会实时显示当前经纬度坐标,效果如下图所示:


🎯 小结

通过本篇文章,我们成功实现了一个非常实用的地图功能:鼠标坐标跟踪器。这个功能在 GIS、智能驾驶、地图展示等场景中都非常常见。

本案例核心掌握点:

  • 熟悉 OpenLayers 的基本使用

  • 使用 MousePosition 控件监听坐标

  • 结合 Vue 3 Composition API 实现逻辑


🙋‍♀️ 后续扩展建议

  • 鼠标点击地图标记点

  • 实时绘制轨迹线

  • 集成地理编码(坐标转地址)

  • 加入地图测量工具(长度/面积)


💬 欢迎交流

如果你在项目中也有地图相关需求,欢迎在评论区留言交流!觉得有帮助也请点个赞/收藏支持一下,持续分享更多 Vue + 地图技术干货!

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

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

相关文章

docker配置redis容器时搭载哨兵节点的情况下配置文件docker-compose.yml示例

1.配置数据节点&#xff08;主从节点&#xff09; version: 3.7 services:master:image: redis:5.0.9container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports:- 6379:6379slave1:image: redis:5.0.9container_name: redis-slave1restart: a…

C++建造者模式进化论

还在为 C 对象那 长得令人发指 的构造函数参数列表抓狂吗&#xff1f;&#x1f92f; 是不是经常在 int hp, int mp, int strength, int faith... 这样的参数“连连看”中迷失自我&#xff0c;一不小心就把法力值传给了血量&#xff0c;或者力量值填到了信仰栏&#xff1f;&…

在Ubuntu内网环境中为Gogs配置HTTPS访问(通过Apache反向代理使用IP地址)

一、准备工作 确保已安装Gogs并运行在HTTP模式(默认端口3000) 确认服务器内网IP地址(如192.168.1.100) 二、安装Apache和必要模块 sudo apt update sudo apt install apache2 -y sudo a2enmod ssl proxy proxy_http rewrite headers 三、创建SSL证书 1. 创建证书存储目录…

数据中台、BI业务访谈(二):组织架构梳理的坑

这是数据中台、BI业务访谈系列的第二篇文章&#xff0c;在上一篇文章中&#xff0c;我重点介绍了在给企业的业务部门、高层管理做业务访谈之前我们要做好行业、业务知识的功课。做好这些功课之后&#xff0c;就到了实际的访谈环节了。 业务访谈关键点 那么在具体业务访谈的时…

spark集群,Stand alone,Hadoop集群有关启动问题

你的问题是因为 start-all.sh 是 Hadoop 的启动脚本&#xff08;用于启动 HDFS 和 YARN&#xff09;&#xff0c;而不是 Spark 的启动脚本。而你已经通过 start-cluster.sh 启动了 Hadoop 相关服务&#xff08;HDFS/YARN&#xff09;&#xff0c;再次执行 start-all.sh 会导致服…

Kotlin 通用请求接口设计:灵活处理多样化参数

在 Kotlin 中设计一个通用的 ControlParams 类来处理不同的控制参数&#xff0c;有几种常见的方法&#xff1a;方案1&#xff1a;使用密封类&#xff08;Sealed Class&#xff09; sealed class ControlParamsdata class LightControlParams(val brightness: Int,val color: S…

aspark 配置2

编写Hadoop集群启停脚本 1.建立新文件&#xff0c;编写脚本程序 在hadoop101中操作&#xff0c;在/root/bin下新建文件&#xff1a;myhadoop&#xff0c;输入如下内容&#xff1a; 2.分发执行权限 保存后退出&#xff0c;然后赋予脚本执行权限 [roothadoop101 ~]$ chmod x /r…

Webstorm 使用搜不到node_modules下的JS内容 TS项目按Ctrl无法跳转到函数实现

将node_modules标记为不排除&#xff0c;此时要把内存改大&#xff0c;不然webstorm中途建立索引时&#xff0c;会因为内存不足&#xff0c;导致索引中途停止&#xff0c;造成后续搜索不出来 更改使用内存设置 内存调为4096 若出现搜不出来js内容时&#xff0c;请直接重启下该项…

vue-element-plus-admin的安装

文档链接&#xff1a;开始 | vue-element-plus-admin 之前尝试按照官方文档来安装&#xff0c;运行npm run dev命令却不能正常打开访问浏览器&#xff0c;换一个方式 首先在目录下打开命令窗口 1、克隆项目 从 GitHub 获取代码 # clone 代码 git clone https://github.com…

【windows10】基于SSH反向隧道公网ip端口实现远程桌面

【windows10】基于SSH反向隧道公网ip端口实现远程桌面 1.背景2.SSH反向隧道3.远程连接电脑 1.背景 ‌Windows 10远程桌面协议的简称是RDP&#xff08;Remote Desktop Protocol&#xff09;‌。 RDP是一种网络协议&#xff0c;允许用户远程访问和操作另一台计算机。 远程桌面功…

软考系统架构设计师之大数据与人工智能笔记

一、大数据架构设计 1. 核心概念与挑战 大数据特征&#xff1a;体量大&#xff08;Volume&#xff09;、多样性&#xff08;Variety&#xff09;、高速性&#xff08;Velocity&#xff09;、价值密度低&#xff08;Value&#xff09;。传统数据库问题&#xff1a;数据过载、性…

【数据结构 · 初阶】- 单链表

目录 一.相关指针知识点 二.链表 1.为什么学了顺序表还要学链表 2.优点 三.实现 1.链表的打印 —— 理解链表结构 (2) 物理结构图 2.链表的尾插 —— 入门 错误写法&#xff1a;tail ! NULL 总结&#xff1a; 正确代码物理图解&#xff1a; (2) 尾插整体代码 (思考…

按键消抖(用状态机实现)

基于状态机的设计代码 module key_filter(clk,rst,key,key_p_flag,key_r_flag,key_state);input clk,rst;input key;output reg key_p_flag;output reg key_r_flag;output reg key_state;reg [1:0]r_key; //后面用来判断什么时候pedge&#xff0c;什么时候nedgealways…

大数据(7.2)Kafka万亿级数据洪流下的架构优化实战:从参数调优到集群治理

目录 一、海量数据场景下的性能之殇1.1 互联网企业的数据增长曲线1.2 典型性能瓶颈分析 二、生产者端极致优化2.1 批量发送黄金法则2.1.1 分区选择算法对比 2.2 序列化性能突破 三、消费者端并发艺术3.1 多线程消费模式演进3.1.1 消费组Rebalance优化 3.2 位移管理高阶技巧 四、…

MyBatis深度解析与实战指南:细节完整,从入门到精通

MyBatis深度解析与实战指南&#xff1a;细节完整&#xff0c;从入门到精通 整理这份笔记&#xff0c;是因为学习 MyBatis 时发现很多教程要么只讲基础 CRUD&#xff0c;要么直接跳到 Spring 整合&#xff0c;对 MyBatis 核心特性讲解不全面&#xff0c;基础部分也不够完整。实…

【科学技术部政务服务平台-用户注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【Audio开发三】音频audio中帧frameSize ,周期大小periodsize,缓冲区buffer原理详解以及代码流程分析

一、基础概述 在分析获取最小帧数前&#xff0c;我们先来了解几个相关的概念。 1&#xff0c;帧 帧&#xff08;frame&#xff09;&#xff1a;表示一个完整的声音单元&#xff0c;所谓的声音单元是指一个采样样本。如果是双声道&#xff0c;那么一个完整的声音单元就是 2 个样…

K8S学习之基础七十五:istio实现灰度发布

istio实现灰度发布 上传镜像到harbor 创建两个版本的pod vi deployment-v1.yaml apiVersion: apps/v1 kind: Deployment metadata:name: appv1labels:app: v1 spec:replicas: 1selector:matchLabels:app: v1apply: canarytemplate:metadata:labels:app: v1apply: canaryspec…

C++蓝桥杯填空题(攻克版)

片头 嗨~小伙伴们&#xff0c;咱们继续攻克填空题&#xff0c;先把5分拿到手~ 第1题 数位递增的数 这道题&#xff0c;需要我们计算在整数 1 至 n 中有多少个数位递增的数。 什么是数位递增的数呢&#xff1f;一个正整数如果任何一个数位不大于右边相邻的数位。比如&#xf…

【Python】数据结构

【Python】数据结构&#xff1a; Series&#xff1a;1、通过列表创建Series类对象2、显示地给数据指定标签索引3、通过字典创建Series类对象4、获取索引5、获取数据 DataFrame&#xff1a;1、通过数组创建一个DataFrame类对象2、指定列索引3、指定行索引4、获取列的数据5、查看…