141.在 Vue 3 中使用 OpenLayers Link 交互:把地圖中心點 / 縮放級別 / 旋轉角度實時寫進 URL,并同步解析顯示

本文分享一個前端小技巧:借助 OpenLayers 的 Link 交互 在瀏覽器地址欄實時記錄地圖狀態,同時把這些參數解析出來展示在頁面上。

  • ? 雙向同步:拖動、縮放、旋轉地圖時,URL 自動更新;手動修改 URL 或后退 / 前進,也能把地圖狀態恢復。

  • ? Vue?3 + Composition API 全家桶寫法,代碼易拆易擴展。

  • ? 無需后端,純前端即可玩轉「場景定位」功能,適合 DEMO 分享、地圖書簽、協同定位等場景。


1?? 效果演示

功能
地圖操作 → URL 更新
改變 URL → 地圖跳轉
同步參數面板實時展示

2?? 技術棧 & 版本

依賴版本說明
Vue^3.xComposition API
Vite^5.x構建工具,CLI 同理
OpenLayers^7.x地圖渲染
MapTiler可選底圖瓦片服務
TypeScript非必需文中示例使用原生 JS

3?? 原理概述

  1. Link 交互

    import Link from 'ol/interaction/Link'
    map.addInteraction(new Link())
    
    • 監聽 moveendrotateend 等事件,把 中心坐標(經緯度)、縮放級別、旋轉角 寫入 URL(?x=...&y=...&z=...&r=...)。

    • 支持瀏覽器前進 / 后退,自動恢復地圖狀態。

  2. window.addEventListener('popstate', …)

    • 捕捉地址欄變動(包括用戶手動編輯 / 點擊歷史棧按鈕)。

    • 調用自定義 parseUrlParams() 更新頁面側欄信息。

  3. 解析展示
    使用 URLSearchParams + 可選哈希解析,將參數列表渲染到 <div class="url-info"> 中,實時可視化。


4?? 完整代碼

4.1 目錄結構建議

src/assets/components/pages/MapLinkDemo.vue   <- 本文示例main.js

4.2 MapLinkDemo.vue

一口氣粘貼即可跑通(若使用 TS,把 refmap 類型補上即可)。

<!--* @Author: 彭麒* @Date: 2025/7/1* @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中使用Link在URL地址欄上顯示地圖中心點、zoom level、旋轉角度信息</div></div><!-- 添加URL參數顯示區域 --><div class="url-info"><h3>URL 參數信息:</h3><div v-if="urlParams.length > 0"><div v-for="(param, index) in urlParams" :key="index" class="param-item"><span class="param-name">{{ param.name }}:</span><span class="param-value">{{ param.value }}</span></div></div><div v-else>無參數</div></div><div id="vue-openlayers" ref="mapEl"></div></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import 'ol/ol.css'
import { Map, View } from 'ol'
import Tile from 'ol/layer/Tile'
import TileJSON from 'ol/source/TileJSON'
import Link from 'ol/interaction/Link' // 核心交互
import { DragRotateAndZoom, defaults as defaultInteractions } from 'ol/interaction'const mapEl = ref(null)
const urlParams = ref([])
let map = null// 解析 URL 參數
function parseUrlParams() {const searchParams = new URLSearchParams(window.location.search)const params = []searchParams.forEach((value, key) => {params.push({ name: key, value: value })})// 也可以提取哈希部分的參數const hash = window.location.hash.substring(1)if (hash) {const hashParams = new URLSearchParams(hash)hashParams.forEach((value, key) => {params.push({ name: `hash:${key}`, value: value })})}urlParams.value = params
}// 初始化底圖
function loadMapTiler(type = 'streets') {// 清空原有圖層map.getLayers().getArray().forEach((layer) => {if (layer) map.removeLayer(layer)})const url = `https://api.maptiler.com/maps/${type}/tiles.json?key=RbTrJIUQMw0c6xtn6kZr`const source = new TileJSON({url: url,tileSize: 512,crossOrigin: 'anonymous'})const tileLayer = new Tile({ source })map.addLayer(tileLayer)
}// 初始化地圖
function initMap() {map = new Map({target: mapEl.value,layers: [],view: new View({center: [13247019.404399557, 4721671.572580107],zoom: 3}),interactions: defaultInteractions().extend([new DragRotateAndZoom()])})// 添加 Link 交互:將地圖狀態同步到 URLmap.addInteraction(new Link())// 加載默認地圖圖層loadMapTiler('streets')// 初始解析URL參數parseUrlParams()// 添加URL變化監聽window.addEventListener('popstate', parseUrlParams)// 監聽地圖移動事件,以便在地圖變化時更新URL參數顯示map.on('moveend', parseUrlParams)
}onMounted(() => {initMap()
})
</script><style scoped>
.container {width: 840px;margin: 50px auto;border: 1px solid #42B983;
}#vue-openlayers {width: 800px;height: 470px;margin: 0 auto;border: 1px solid #42B983;position: relative;
}.url-info {width: 800px;margin: 10px auto;padding: 10px;border: 1px dashed #42B983;background-color: #f5f5f5;
}.param-item {margin: 5px 0;
}.param-name {font-weight: bold;margin-right: 5px;
}.param-value {color: #1976d2;
}
</style>

5?? 關鍵點拆解

玩法說明
Link()內置于 OpenLayers,自動將視圖狀態序列化到 URL,格式默認 ?x={lon}&y={lat}&z={zoom}&r={rotation}
瀏覽器歷史棧popstate 事件可捕獲前進 / 后退;利用 URL -> 地圖狀態的反向解析能力(Link 已幫你處理)
雙向可視化解析函數既能給側欄,也可用于調試 —— 一眼看到經緯度與縮放

6?? 常見問題 & 解決方案

問題可能原因處理建議
地址欄參數是 EPSG:3857 值,看不懂默認投影為 Web Mercator 米制坐標修改 Link({ projection: 'EPSG:4326' }) 或手動轉換
刷新后回到初始視圖你手動把 center/zoom/rotation 寫到組件初始化了,覆蓋了歷史initMap 前檢測 URL,若含有效參數則省略初始視圖
地址超長可自定義 Linkparams 過濾,只保留關鍵字段例:new Link({ params: ['x','y','z'] })

7?? 延伸玩法

  1. 地圖書簽分享
    把當前 URL 發給同事 / 客戶,打開即定位到同一視角。

  2. 集成后臺數據
    后端記錄重要坐標 → 前端讀取 URL → 打開地圖直達目標區域。

  3. 批量截圖腳本
    借助無頭瀏覽器 + URL 參數,批量生成不同視角的靜態地圖圖片。


8?? 結語

一行 new?Link(),即可為地圖加上「自帶 GPS」的能力。
如果本文對你有幫助,別忘了 點贊 👍、收藏 ?、評論 💬 —— 你的支持是我持續分享的最大動力!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87128.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87128.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87128.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字人的形象與內容,虛擬形象背后的權益暗戰

&#xff08;首席數據官高鵬律師數字經濟團隊創作&#xff0c;AI輔助&#xff09; 當某科技公司的虛擬偶像在直播間收獲百萬打賞時&#xff0c;當某品牌的數字代言人形象被篡改成表情包全網傳播時&#xff0c;當網紅博主的AI分身開始替代真人直播帶貨時&#xff0c;一場關于數…

【python】pdf拆成圖片,加中文,再合成pdf

前期搞了個pdf加頁腳&#xff0c;但是搞了半天中文加不了&#xff0c;就換了個思路。 直接說結論&#xff0c;pdf拆成圖片&#xff0c;加中文&#xff0c;再合成pdf&#xff0c;會導致pdf模糊。 import os import fitz # PyMuPDF from PIL import Image, ImageDraw, ImageFon…

分布式爬蟲數據存儲開發實戰

分布式爬蟲存儲的核心矛盾在于&#xff1a;既要高吞吐又要強一致性&#xff0c;還要避免重復。比如Kafka雖然吞吐高但無法去重&#xff0c;Redis去重快但容量有限。所以我們可能低估了狀態同步的復雜度——比如暫停爬蟲時如何保證內存中的URL狀態不丟失。 分布式爬蟲的數據存儲…

探秘阿里云Alibaba Cloud Linux:云時代的操作系統新寵

引言&#xff1a;云時代的操作系統變革 在云計算技術蓬勃發展的當下&#xff0c;企業的數字化轉型進程被極大地加速&#xff0c;而作為云計算底層支撐的操作系統&#xff0c;也迎來了前所未有的變革與挑戰。傳統操作系統在應對云計算環境中的大規模資源調度、高彈性擴展以及安…

使用pyflink進行kafka實時數據消費

目錄 背景 代碼demo 踩坑記錄 1、kafka連接器&#xff0c;kafka客戶端jar包找不到 2、java模塊系統訪問限制 3、執行demo任務&#xff0c;一直報錯連接kafka topic超時 總結 背景 實際項目中經常遇到source是kafka&#xff0c;需要實時消費kafka某個topic中的數據&#x…

軟件測試理論框架與發展:分類、原則與質量保障策略

第一章 一、計算機軟件的發展分類 早期軟件開發的特點&#xff1a; 軟件規模小、復雜程度低、開發過程不規范 測試的情況&#xff1a; 測試等同于調試 目的糾正軟件的已經知道的故障 投入少&#xff0c;介入晚 成為一種發現軟件的活動&#xff08;1957&#xff09; 測試不等于…

未知威脅攻擊原理和架構

大家讀完覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; 未知威脅&#xff08;Unknown Threats&#xff09;指利用零日漏洞、合法工具濫用、高級逃逸技術等**繞過傳統特征檢測**的攻擊&#xff0c;其核心在于**動態對抗防御體系的認知盲區**。以下從攻擊原理、…

基于Netty-WebSocket構建高性能實時通信服務

引言&#xff1a;WebSocket在現代應用中的重要性 在當今實時交互應用盛行的時代&#xff0c;WebSocket協議已成為實現雙向通信的核心技術。相比傳統的HTTP輪詢&#xff0c;WebSocket提供了&#xff1a; 真正的全雙工通信極低的延遲&#xff08;毫秒級&#xff09;高效的連接管…

咸蝦米項目總結1--const用法

在 UniApp&#xff08;或 Vue 3&#xff09;中&#xff0c;聲明一個空對象可使用下面這2種寫法&#xff1a; // 寫法1 const a ref(null);// 寫法2 const a ref({}); 在UniApp中&#xff0c;const a ref()用法概述&#xff1a; 用途&#xff1a; 創建一個響應式引用&#x…

在mac下手動編譯遷移的android版webrtc組件

我原先使用的android版webrtc是在linux下編譯的&#xff0c;現在因為某些原因需要把整個庫遷移到mac下編譯。 把代碼遷移完后&#xff0c;正常是需要通過gclient sync 重新構建編譯環境&#xff0c;但是由于網絡限制等方面原因&#xff0c;會導致完成的比較慢。 在摸索一陣后…

Linux 命令:mkdir

Linux mkdir 命令詳細教程 一、mkdir 命令的基本功能 mkdir&#xff08;Make Directory&#xff09;是 Linux 系統中用于創建新目錄&#xff08;文件夾&#xff09;的基礎命令。它支持一次性創建單個或多個目錄&#xff0c;以及遞歸創建多層目錄結構&#xff0c;是文件系統操…

Django 數據遷移全解析:makemigrations migrate 常見錯誤與解決方案

1. 遷移機制與底層原理 在 Django 中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff09;是連接模型&#xff08;Model&#xff09;和數據庫結構的橋梁。Django 鼓勵開發者通過編寫 Python 類&#xff08;模型&#xff09;來定義業務數據結構&#xff0c;而不是…

SuperGlue:使用圖神經網絡學習特征匹配

摘要 本文提出了 SuperGlue&#xff0c;一種神經網絡&#xff0c;用于通過聯合尋找對應關系并排除不可匹配點來匹配兩組局部特征。匹配結果通過求解一個可微的最優傳輸問題來估計&#xff0c;該問題的代價由一個圖神經網絡預測。我們引入了一種基于注意力的靈活上下文聚合機制…

ssh -T git@github.com失敗后解決方案

這個錯誤表示你的 SSH 連接無法到達 GitHub 服務器。以下是詳細解決方案&#xff0c;按照優先級排序&#xff1a; 首選解決方案&#xff1a;使用 SSH over HTTPS&#xff08;端口 443&#xff09; 這是最有效的解決方案&#xff0c;因為許多網絡會阻止 22 端口&#xff1a; …

從蘋果事件看 ARM PC市場的未來走向

最近&#xff0c;蘋果宣布部分搭載 Intel 處理器的 Mac 不再支持最新的 macOS 系統更新&#xff0c;這一消息猶如一顆石子投入平靜湖面&#xff0c;激起層層漣漪。它不僅讓 Intel 芯片在 Mac 產品線上徹底成為歷史&#xff0c;也促使我們重新審視 PC 行業的發展脈絡&#xff0c…

vue + element ui 實現超出寬度展示..,鼠標移入顯示完整內容

vue element ui 實現超出寬度展示…&#xff0c;鼠標移入顯示完整內容 代碼理念&#xff1a; 當高度大于對應行數的高度 則說明需要展示"…" 子組件 <template><div class"tooltip"><div ref"tooltipRef" :class"[tooltip…

HarmonyOSNext應用無響應全解析:從機制到實戰的卡死問題排查

HarmonyOSNext應用無響應全解析&#xff1a;從機制到實戰的卡死問題排查 ##Harmony OS Next ##Ark Ts ##教育 本文適用于教育科普行業進行學習&#xff0c;有錯誤之處請指出我會修改。 喂喂喂&#xff01;應用卡成PPT了&#xff1f;點啥都沒反應&#xff1f;別慌&#xff01…

git 遷移之獲取原庫所有分支

以下是一個安全的 Bash 腳本&#xff0c;用于將遠程 Git 倉庫的所有分支檢出到本地&#xff08;自動跳過已存在的分支&#xff09;&#xff1a; #!/bin/bash# 獲取所有遠程分支&#xff08;排除 HEAD&#xff09; remote_branches$(git branch -r | grep -v HEAD\|->)# 循環…

設計模式 | 適配器模式

適配器模式&#xff08;Adapter Pattern&#xff09; 是結構型設計模式中的連接器大師&#xff0c;它允許不兼容接口的類能夠協同工作。本文將深入探索適配器模式的核心思想、實現技巧以及在C中的高效實踐&#xff0c;解決現實開發中的接口兼容性問題。 為什么需要適配器模式 …

RTL 級機器人電機控制器的 FPGA 設計

借助Verilog&#xff0c;在FPGA中實現了帶編碼器的兩臺電機的電機控制系統的RTL級設計。 介紹 借助硬件描述語言 (HDL) Verilog 和 AMD Vivado 設計套件&#xff0c;在 AMD Spartan-7 FPGA 中實現帶編碼器的兩個電機的控制器系統的 RTL 設計。 在這個項目中&#xff0c;使用了搭…