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
繁體地址,請注明出處:http://hk.pswp.cn/web/79975.shtml
英文地址,請注明出處:http://en.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 θ(這里是提示詞嵌入向量),梯度下降的更新公式為: