128.在 Vue 3 中使用 OpenLayers 实现绘制矩形截图并保存地图区域

📌 本文将介绍如何在 Vue 3 中使用 OpenLayers 实现:
1)用户可在地图上绘制矩形;
2)自动截取该区域地图为图片;
3)一键保存为本地 PNG 图片。

✨效果如下图所示


🧠一、前言

在地图类 Web 应用中,我们经常有这样的需求:

  • 想截取某个区域的地图;

  • 想让用户自由框选区域后下载;

  • 或作为报告附图、图片处理的输入。

本文就带大家用 Vue 3 + OpenLayers 来实现“绘制矩形并截图保存”功能,完整、实用、即插即用。


🔧二、核心技术栈

技术说明
Vue 3前端框架,使用 Composition API
OpenLayers地图引擎,支持绘制、图层操作等
Element PlusUI 组件库,用于按钮控制

📦三、项目初始化

推荐使用 Vite 快速构建 Vue 3 项目:

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

安装必要依赖:

npm install ol element-plus

main.js 中引入 Element Plus:

import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' app.use(ElementPlus)

✍️四、完整实现代码(Composition API 写法)

我们将完整功能封装在一个组件中,以下为 MapScreenshot.vue 代码:

<!--* @Author: 彭麒* @Date: 2025/5/15* @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><h4><el-button type="primary" size="small" @click="drawBox">绘制矩形截图</el-button><el-button type="danger" size="small" @click="clearSource">清除图层</el-button></h4><div id="vue-openlayers"></div></div>
</template><script setup>
import { onMounted, ref } from 'vue'import 'ol/ol.css'
import { Map, View } from 'ol'
import TileLayer from 'ol/layer/Tile'
import VectorLayer from 'ol/layer/Vector'
import OSM from 'ol/source/OSM'
import VectorSource from 'ol/source/Vector'
import Draw, { createBox } from 'ol/interaction/Draw'
import { Style, Fill, Stroke } from 'ol/style'// 创建响应式引用
const map = ref(null)
const draw = ref(null)
const source = new VectorSource({ wrapX: false })// 初始化地图
const initMap = () => {const raster = new TileLayer({source: new OSM(),})const vector = new VectorLayer({source,style: new Style({fill: new Fill({color: 'rgba(0,0,0,0)',}),stroke: new Stroke({color: 'darkgreen',width: 2,}),}),})map.value = new Map({target: 'vue-openlayers',layers: [raster, vector],view: new View({projection: 'EPSG:4326',center: [116.1206, 39.034996],zoom: 10,}),})
}// 清除图层
const clearSource = () => {source.clear()
}// 绘制矩形并截图保存
const drawBox = () => {if (draw.value) {map.value.removeInteraction(draw.value)}draw.value = new Draw({source,type: 'Circle',geometryFunction: createBox(),})map.value.addInteraction(draw.value)draw.value.on('drawend', (e) => {if (draw.value) {map.value.removeInteraction(draw.value)}map.value.renderSync()const extent = e.feature.getGeometry().getExtent()const leftTop = map.value.getPixelFromCoordinate([extent[0], extent[3]])const bottomRight = map.value.getPixelFromCoordinate([extent[2], extent[1]])const width = Math.abs(bottomRight[0] - leftTop[0])const height = Math.abs(bottomRight[1] - leftTop[1])const minx = leftTop[0]const miny = leftTop[1]const mapCanvas = document.getElementsByClassName('ol-layer')[0].children[0]const ctx = mapCanvas.getContext('2d')const imageData = ctx.getImageData(minx, miny, width, height)const canvas = document.createElement('canvas')canvas.width = widthcanvas.height = heightcanvas.getContext('2d').putImageData(imageData, 0, 0)const dataUrl = canvas.toDataURL()const link = document.createElement('a')link.download = '我的图片.png'link.href = dataUrllink.click()})
}onMounted(() => {initMap()
})
</script><style scoped>
.container {width: 840px;height: 590px;margin: 50px auto;border: 1px solid #42B983;
}
#vue-openlayers {width: 800px;height: 420px;margin: 0 auto;border: 1px solid #42B983;position: relative;
}
</style>

🎁五、功能说明

功能说明
绘制矩形鼠标在地图拖动绘制一个矩形区域
截图区域自动计算该区域对应的 canvas 像素范围
保存图片提取该 canvas 区域内容,生成 PNG 并下载
清除图层一键清空绘制的图形,保持地图干净

🧩六、关键技术解析

createBox() 与 Draw

import { createBox } from 'ol/interaction/Draw'
  • createBox() 是一个 geometryFunction,配合 type: 'Circle' 使用时,会把圆形绘制转换为矩形绘制。

  • 非常巧妙地实现了“绘制矩形”的能力!

getPixelFromCoordinate() 实现截图区域定位

将地理坐标转换为像素坐标,才能从 canvas 中精确提取图像:

map.getPixelFromCoordinate([x, y])

🧪七、实测效果截图


🔚八、总结

本文介绍了如何在 Vue 3 中集成 OpenLayers,并实现一个非常实用的截图保存功能。通过绘制矩形,可以对地图任意区域进行截图提取,非常适合:

  • 地图分析应用;

  • 地理标注报告;

  • 自定义地图素材裁剪;


📎九、联系方式

🧑‍💻作者:彭麒
📧Email:1062470959@qq.com
📌CSDN主页:欢迎点赞 + 收藏 + 关注

如本文对你有帮助,欢迎留言交流!

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

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

相关文章

单片机 | 基于STM32的智能马桶设计

基于STM32的智能马桶设计结合了传感器技术、嵌入式控制及物联网功能,旨在提升用户体验并实现健康监测。以下是其设计原理、功能模块及代码框架的详细解析: 一、系统架构与核心功能 智能马桶的系统架构通常分为主控模块、传感器模块、执行器模块、通信模块及用户交互模块,主…

最短路与拓扑(2)

1、信使 #include<bits/stdc.h> using namespace std; const int N105; int n,m; int g[N][N]; int dist[N]; bool st[N]; const int INF0x3f3f3f3f;int dij(){memset(dist,0x3f,sizeof dist);dist[1]0;for(int i1;i<n;i){int t0;for(int j1;j<n;j){if(!st[j]&…

当 AI 邂逅丝路:揭秘「丝路智旅」,用 RAG 重塑中阿文化旅游体验

目录 系统命名:丝路智旅 (Silk Road Intelligent Travel)系统概述系统架构设计系统功能模块技术选型:为何是它们?系统优势与特点未来展望与扩展总结在数字浪潮席卷全球的今天,古老的丝绸之路正在以一种全新的方式焕发生机。当深厚的文化底蕴遇上尖端的人工智能技术,会碰撞…

SQLPub:一个提供AI助手的免费MySQL数据库服务

给大家介绍一个免费的 MySQL 在线数据库环境&#xff1a;SQLPub。它提供了最新版本的 MySQL 服务器测试服务&#xff0c;可以方便开发者和测试人员验证数据库功能&#xff0c;也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址&#xff1a; https://sqlpub.com/ SQLP…

list简单模拟实现

成员变量迭代器&#xff08;重点&#xff09;ListIterator运算符重载begin、end 插入、删除inserterase头插、尾插、头删、尾删 operator->const_iterator拷贝构造operator析构函数完整代码 由于前面已经模拟实现了vector&#xff0c;所以这里关于一些函数实现就不会讲的过于…

【计算机视觉】基于Python的相机标定项目Camera-Calibration深度解析

基于Python的相机标定项目Camera-Calibration深度解析 1. 项目概述技术核心 2. 技术原理与数学模型2.1 相机模型2.2 畸变模型 3. 实战指南&#xff1a;项目运行与标定流程3.1 环境配置3.2 数据准备3.3 执行步骤3.4 结果验证 4. 常见问题与解决方案4.1 角点检测失败4.2 标定结果…

多光谱影像:解锁遥感奥秘的 “彩色钥匙”

在遥感领域&#xff0c;多光谱影像犹如一把神奇的 “彩色钥匙”&#xff0c;为我们开启洞察地球表面与大气层的全新视角。 图片来源于星图云开放平台 多光谱影像&#xff0c;顾名思义&#xff0c;就是利用遥感平台上的多光谱传感器&#xff0c;同时对地球目标地物在多个不同光谱…

【ROS2】ROS节点启动崩溃:rclcpp::exceptions::RCLInvalidArgument

1、问题描述 启动ROS节点时,直接崩溃,打印信息如下: terminate called after throwing an instance of rclcpp::exceptions::RCLInvalidArgumentwhat(): failed to create guard condition: context argument is null, at ./src/rcl/guard_condition.c:65 [ros2run]: Abo…

MinerU安装(pdf转markdown、json)

在Windows上安装MinerU&#xff0c;参考以下几个文章&#xff0c;可以成功安装&#xff0c;并使用GPU解析。 整体安装教程&#xff1a; MinerU本地化部署教程——一款AI知识库建站的必备工具 其中安装conda的教程&#xff1a; 一步步教你在 Windows 上轻松安装 Anaconda以及使…

aws 实践创建policy + Role

今天Cyber 通过image 来创建EC2 的时候,要添加policy, 虽然是administrator 的role, 参考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:

【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for

1、问题描述 在ROS2工程中,编译使用Qt实现的库,在其它ROS2包链接该库时,报错: /usr/bin/ld: XXX undefined reference to `vtable for2、原因分析 查看链接失败的几个函数接口都是,信号函数(signals 标记的函数)。因为信号函数都只有定义,没有实现,在执行ROS2 colc…

数据库--处理模型(Processing Model)(二)

执行查询的方法有很多,接下来将介绍以更高效和更有效率的方式执行分析工作负载(在OLAP系统中)的不同技术,包括以下内容: 执行并行性(Execution Parallelism)执行引擎(Execution Engines)执行操作符输出(Execution Operator Output)中间数据表示(Intermediate Data …

PostgreSQL pgrowlocks 扩展详解

一、简介 pgrowlocks 是 PostgreSQL 官方提供的扩展模块&#xff0c;用于查看指定表中每一行当前的行级锁&#xff08;Row Lock&#xff09;信息。它非常适用于&#xff1a; 并发冲突排查行级锁等待分析死锁前兆探测热点数据行分析 二、安装与启用 1. 安装前提&#xff08;…

关于xammp数据库打开不了,但是日志没错误的问题解决以及其数据库的备份

这里参考了两篇文章 解决Xampp中mysql无法启动的问题_xampp里面mysql的stop启动不起来-CSDN博客 mysqli_real_connect(): (HY000/1045): Access denied for user ‘root‘‘localhost‘ (using password: YES-CSDN博客 相信很多和我一样&#xff0c;很久没登xammp突然数据库…

在UI 原型设计中,交互规则有哪些核心要素?

在UI 原型设计中&#xff0c;交互规则主要有三个核心要素&#xff0c;分别为重要性、原则与实践&#xff0c;具体表现在&#xff1a; 一、交互规则在 UI 原型设计中的重要性 明确交互逻辑&#xff1a;设计阶段制定交互规则&#xff0c;清晰定义界面元素操作响应。 如社交应用…

BFD与VRRP联动

一、概述 在前面的文章我们学习了VRRP与BFD协议,VRRP(虚拟路由冗余协议)的主要特点是当Master(主)设备出现故障时,Backup(备用)设备能够快速接替Master的转发工作,尽量缩短数据流的中断时间。 在没有采用BFD与VRRP联动机制前,当Master出现故障时,VRRP依靠Backup设置的超时时间来…

Protobuf3协议关键字详解与应用实例

一、核心语法与基础关键字 syntax 声明协议版本&#xff0c;必须为文件的第一行非空、非注释内容。 syntax "proto3"; // 显式指定proto3语法&#xff0c;否则编译器默认使用proto2message 定义消息类型&#xff0c;包含一组结构化字段。支持嵌套消息定义&#xff…

如何在线免费压缩PDF文档?

PDF文件太大&#xff0c;通常是因为内部嵌入字体和图片。怎么才能将文件大小减减肥呢&#xff0c;主要有降低图片清晰度和去除相关字体两个方向来实现文档效果。接下来介绍三个免费压缩PDF实用工具。 &#xff08;一&#xff09;iLoveOFD在线转换工具 iLoveOFD在线转换工具&a…

NSSCTF [GFCTF 2021]where_is_shell

889.[GFCTF 2021]where_is_shell(system($0)64位) [GFCTF 2021]where_is_shell (1) 1.准备 motalymotaly-VMware-Virtual-Platform:~$ file shell shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.s…

深度学习中的提示词优化:梯度下降全解析

深度学习中的提示词优化:梯度下降全解析 在您的代码中,提示词的更新方向是通过梯度下降算法确定的,这是深度学习中最基本的优化方法。 一、梯度下降与更新方向 1. 核心公式 对于可训练参数 θ \theta θ(这里是提示词嵌入向量),梯度下降的更新公式为: