49.在 Vue 3 中使用 OpenLayers 实现单击鼠标显示经纬度(引用 Popup 扩展版)

news/2025/1/2 10:15:10/

在 WebGIS 开发中,OpenLayers 是一个功能强大的开源库,提供了丰富的地图渲染与交互功能。本文将介绍如何在 Vue 3 中使用 OpenLayers,通过单击地图上的某一点,弹出一个显示经纬度坐标的弹窗,具体实现基于 Popup 扩展库。


效果展示

实现的效果如下:

  • 加载 OSM(OpenStreetMap)作为底图。
  • 在鼠标单击地图的任意位置时,显示该点的经纬度坐标。
  • 使用 Popup 扩展库美化弹窗样式。

完整代码

以下是完整代码实现,包含 Vue 3 组件代码和样式。

1. 组件模板与脚本

<!-- * @Author: 彭麒 * @Date: 2024/12/28 * @Email: 1062470959@qq.com * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。 --> <template> <button class="back-button" @click="goBack">返回</button> <div class="container"> <div class="w-full flex justify-center flex-wrap"> <div class="font-bold text-[24px]"> 在 Vue 3 中使用 OpenLayers 单击鼠标获得坐标经纬度(引用 Popup 扩展版) </div> </div> <div id="vue-openlayers"></div> </div> </template> <script setup> import { ref, onMounted } from 'vue'; import 'ol/ol.css'; import 'ol-popup/src/ol-popup.css'; import { Map, View } from 'ol'; import { transform } from 'ol/proj'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; import { toStringHDMS } from 'ol/coordinate'; import Popup from 'ol-popup'; import router from "@/router"; const map = ref(null); const goBack = () => { router.push('/OpenLayers'); }; const initializeMap = () => { // 创建地图实例 map.value = new Map({ target: 'vue-openlayers', layers: [ new TileLayer({ title: 'OSM', type: 'base', visible: true, source: new OSM(), }), ], view: new View({ center: [13247019.404399557, 4721671.572580107], // 初始中心点 projection: 'EPSG:3857', zoom: 5, }), }); // 创建 Popup 实例 const popup = new Popup(); map.value.addOverlay(popup); // 单击事件监听 map.value.on('singleclick', (evt) => { const prettyCoord = toStringHDMS( transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'), 2 ); popup.show( evt.coordinate, `<div><h2>坐标为</h2><p>${prettyCoord}</p></div>` ); }); }; onMounted(() => { initializeMap(); }); </script> <style scoped> .container { width: 840px; height: 520px; margin: 50px auto; border: 1px solid #42B983; } #vue-openlayers { width: 800px; height: 400px; margin: 0 auto; border: 1px solid #42B983; position: relative; } button.back-button { display: block; margin: 20px auto; padding: 8px 16px; background-color: #42B983; color: #fff; border: none; border-radius: 4px; cursor: pointer; } </style>


2. 项目依赖

确保已安装以下依赖:

javascript">npm install ol ol-popup

功能说明

1. 地图初始化
  • 使用 OpenLayers 创建地图实例,添加 OSM 图层作为底图。
  • 设置地图的中心点坐标为 [13247019.404399557, 4721671.572580107](投影坐标),并设置缩放级别为 5
2. 坐标转换

使用 transform 函数将 OpenLayers 的投影坐标(EPSG:3857)转换为地理坐标(EPSG:4326),并格式化为度、分、秒(HDMS)格式,方便阅读。

3. 弹窗显示
  • 利用 ol-popup 扩展库,创建弹窗实例并添加到地图中。
  • 在单击事件中调用 popup.show(),显示弹窗内容。

运行效果

将代码运行后,你将看到一个可交互的地图,当用户单击地图上的某一点时,会弹出一个窗口,显示该点的经纬度坐标,格式如下:

javascript">坐标为 39°54′50.13″N 116°23′29.92″E


样式优化

你可以根据需要自定义弹窗的样式,例如:

.ol-popup { background-color: rgba(0, 0, 0, 0.75); color: #fff; padding: 8px; border-radius: 4px; min-width: 200px; font-family: Arial, sans-serif; 
}

项目扩展

  1. 支持多语言
    添加国际化功能,适配多语言用户。

  2. 坐标存储
    点击后将坐标存储到一个列表中,允许用户复制或导出坐标。

  3. 多图层支持
    添加多个图层(例如卫星图层)切换功能。


总结

通过本示例,我们展示了如何在 Vue 3 中结合 OpenLayers 和 Popup 实现单击地图显示坐标的功能。此功能适用于地图交互中的各种场景,如位置查询、信息展示等。希望本文能为您的项目开发提供帮助!如果有任何问题或需求,欢迎在评论区留言讨论!


http://www.ppmy.cn/news/1559453.html

相关文章

WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

爬虫数据存储:Redis、MySQL 与 MongoDB 的对比与实践

爬虫的核心任务是从网络中提取数据&#xff0c;而存储这些数据是流程中不可或缺的一环。根据业务需求的不同&#xff0c;存储的选择可能直接影响数据处理的效率和开发体验。本文将介绍三种常用的存储工具——Redis、MySQL 和 MongoDB&#xff0c;分析它们的特点&#xff0c;并提…

note 41:账务系统开发规范

目录 系统设计 防重控制 流量控制 并发控制 异常处理 备份机制 系统开发​​​​​​​ 前端队列操作 外系统交互 ​​​​​​​​​​​​​​ 系统设计 防重控制 对于进入到系统中的数据&#xff08;文件导入、手工录入、系统直连等&#xff09;以及本系统发往外…

windows C#-嵌套类型

在类、构造或接口中定义的类型称为嵌套类型。 例如 public class Container {class Nested{Nested() { }} } 不论外部类型是类、接口还是构造&#xff0c;嵌套类型均默认为 private&#xff1b;仅可从其包含类型中进行访问。 在上一个示例中&#xff0c;Nested 类无法访问外部…

Tonghttpserver6.0.1.3 使用整理(by lqw)

文章目录 1.声明2.关于单机版控制台和集中管理控制台3.单机版控制台3.1安装&#xff0c;启动和查看授权信息3.2一些常见的使用问题&#xff08;单机控制台&#xff09;3.3之前使用的是nginx&#xff0c;现在要配nginx.conf上的配置&#xff0c;在THS上如何配置3.4如何配置密码过…

存储块的删除与状态查询

目录 存储块的删除 设计实现 存储块的删除 仅需删除任务列表的所有任务&#xff0c;无需在意空闲存储块。 设计实现 存储块的删除&#xff08;清空过程中可能有任务就绪&#xff0c;需执行一次调度&#xff09;存储块的状态查询&#xff08;当前存储块的计数、允许的最大计数、…

计算机毕业设计Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

JVM运行时数据区的详细解析

JVM&#xff08;Java虚拟机&#xff09;的运行时数据区是JVM在执行Java程序时使用的内存区域。这些区域被划分为多个部分&#xff0c;每个部分都有其特定的功能和生命周期。以下是各部分的详细介绍&#xff1a; 1. 方法区 (Method Area) 方法区是所有线程共享的内存区域&…