vue2通過leaflet實現圖片點位回顯功能

需求:在圖片上標點了,需要根據標記點在圖片上進行回顯功能,并且不會根據窗口大小導致標記點移位

1.效果

2.下載插件

用到的是leaflet插件:一個交互式地圖 JavaScript 庫,我下載是? "leaflet": "^1.9.4"

npm install leaflet

引入到項目

icon是自帶的圖標

import icon from 'leaflet/dist/images/marker-icon.png';
import * as L from 'leaflet';
import 'leaflet/dist/leaflet.css';

3.主要代碼詳解

圖片加載后需要創建map對象,注意!!如果后端傳的點數據是根據圖片原有大小比如圖片尺寸800*800,x:20,y:20,就是在800像素上的xy的值那么直接設置leftmap的unproject為圖片本身的尺寸即可

?var south_west = that.leftMap.unproject([0, img_original_height], 1); //西南var north_east = that.leftMap.unproject([img_original_width, 0], 1);?

如果圖片原尺寸為800*800,后端傳來尺寸為400*400,x:10,y:10,需要設置如下代碼

      var style = window.getComputedStyle(document.getElementById("roc_map"));var map_height = parseFloat(style.height);     var south_west = that.leftMap.unproject([0, map_height], 1); //西南var north_east = that.leftMap.unproject([img_original_width / this_ratio, 0],1);

創建點:draggable:是否拖拽L.marker上面的這些代碼全部都是坐標轉換的,就是為了應對原有尺寸和后端尺寸不對應的問題

        // 1. 獲取舊圖片尺寸(pointArr中保存的width/height)const oldWidth = obj_.width; // 例如 1036const oldHeight = obj_.height; // 例如 582// 3. 根據地理邊界 this_bounds 計算實際的地理坐標const boundsWidth = this_bounds.getEast() - this_bounds.getWest();const boundsHeight = this_bounds.getNorth() - this_bounds.getSouth();const lng = this_bounds.getWest() + (boundsWidth / oldWidth) * obj_.x;const lat = this_bounds.getNorth() - (+boundsHeight / oldHeight) * obj_.y; // Y軸取反const DefaultIcon = L.icon({iconUrl: icon,iconAnchor: [10, 41]});// 4. 創建標記點(Leaflet的Y軸需要取反)const marker = L.marker([lat, lng], {draggable: false,title: obj_.name,icon: DefaultIcon}).addTo(that.leftMap);

創建點彈窗,彈窗樣式自行設計

   const popup = L.popup().setContent('加載中...');marker.bindPopup(popup);

4.完整代碼

<!--* @Description:* @Author: 請叫我歐皇!* @Date: 2025-04-28 14:58:23* @FilePath: \vue-secondMenu-test-master\src\page\test4\zongti\02.leftjs.vue
-->
<template><div class="leaflet-box"><div id="roc_map" class="map"></div></div>
</template><script>
import icon from 'leaflet/dist/images/marker-icon.png';
import * as L from 'leaflet';
import 'leaflet/dist/leaflet.css';
export default {data() {return {pointArr: [{x: 80,y: 50,name: '測試111',group: ['測試111'],point_id: 1,sn: '123456789',width: 800,height: 572},{x: 200,y: 0,name: '測試222',group: ['測試222'],point_id: 2,sn: '123456789',width: 800,height: 572},{x: 200,y: 200,name: '測試333',group: ['測試222'],point_id: 3,sn: '123456789',width: 800,height: 572}],leftMap: null};},mounted() {this.initLeaflet();},methods: {initLeaflet() {let that = this;let pointArr = this.pointArr;var mark_map = {};var this_img = new Image();let imgs = 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg';// this_img.src = "../images/01.jpg";this_img.src = imgs;this_img.onload = function () {var img_original_width = this_img.width,img_original_height = this_img.height;// 在初始化地圖前檢查是否已存在地圖實例if (that.leftMap) {that.leftMap.remove(); // 移除舊地圖that.leftMap = null;}that.leftMap = new L.Map('roc_map', {minZoom: 1,maxZoom: 4,center: [0, 0],zoom: 1,crs: L.CRS.Simple,zoomControl: false,attributionControl: false// zoomControl: false, // 禁用默認的縮放控件});var south_west = that.leftMap.unproject([0, img_original_height], 1); //西南var north_east = that.leftMap.unproject([img_original_width, 0], 1);var this_bounds = new L.LatLngBounds(south_west, north_east);L.imageOverlay(imgs, this_bounds).addTo(that.leftMap);that.leftMap.fitBounds(this_bounds);init_p();//   init_grid_2();function init_p() {for (var i = 0; i < pointArr.length; i++) {let obj_ = pointArr[i];// 1. 獲取舊圖片尺寸(pointArr中保存的width/height)const oldWidth = obj_.width; // 例如 1036const oldHeight = obj_.height; // 例如 582// 3. 根據地理邊界 this_bounds 計算實際的地理坐標const boundsWidth = this_bounds.getEast() - this_bounds.getWest();const boundsHeight = this_bounds.getNorth() - this_bounds.getSouth();const lng = this_bounds.getWest() + (boundsWidth / oldWidth) * obj_.x;const lat = this_bounds.getNorth() - (+boundsHeight / oldHeight) * obj_.y; // Y軸取反const DefaultIcon = L.icon({iconUrl: icon,iconAnchor: [10, 41]});// 4. 創建標記點(Leaflet的Y軸需要取反)const marker = L.marker([lat, lng], {draggable: false,title: obj_.name,icon: DefaultIcon}).addTo(that.leftMap);const popup = L.popup().setContent('加載中...');marker.bindPopup(popup);// 最新監測時間:2025-12-23 00:00:00 累計變化量X:1234.45mm 累計變化量Y:12345.567mm// .bindPopup(that.getBindPopup(obj_))marker.on('click', async function (e) {that.sendPointInfo = { ...obj_ };// Show loading messagemarker.bindPopup("<div style='width:260px;height:150px;font-size:12px' class='popup'>加載中...</div>").openPopup();try {const popupContent = `<div style='width:260px;height:150px;font-size:13px' class='popup'><div class="title">點編號:${obj_.name}</div><ul><li>sn:${obj_.sn}</li></ul></div>`;popup.setContent(popupContent);//                             }} catch (error) {popup.setContent('請求數據時出錯');}});mark_map[obj_.point_id] = marker;}}};}}
};
</script><style lang="scss" scoped>
.leaflet-box {width: 100%;height: 800px;.map {width: 50%;height: 70%;margin: 40px;}
}
</style>

文章到此結束,希望對你有所幫助~

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

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

相關文章

OmniDocBench:一鍵評測PDF解析算法

絕大多數文檔格式都能無損轉換至PDF&#xff0c;解決了PDF解析&#xff0c;也就相當于解決了絕大多數文檔的解析。所以&#xff0c;PDF解析算法是文檔服務的基石技術。 PDF解析算法目前有兩類技術路線 pipeline方法&#xff0c;整合layout analysis, OCR, formula/table reco…

[按鍵精靈安卓/ios腳本插件開發] 遍歷獲取LuaAuxLib函數庫命令輔助工具

LuaAuxLib庫 LuaAuxLib是按鍵精靈所有內置命令所在的庫文件&#xff0c;有多種方式來獲取LuaAuxLib庫下的函數命令&#xff0c;例如反編譯按鍵精靈手機端庫文件等。這里咱們來介紹一種淺顯易懂的方式來獲取&#xff0c;直接for循環遍歷獲取函數名。 ScanLuaAuxLib 我們寫一個自…

深度學習和計算機視覺的關系的理解

深度學習和計算機視覺的關系 深度學習作為人工智能的重要分支&#xff0c;近年來在計算機視覺領域取得了革命性突破。計算機視覺的核心任務包括圖像分類、目標檢測、語義分割等&#xff0c;而深度學習通過神經網絡模型自動學習圖像特征&#xff0c;極大提升了這些任務的準確率…

springboot開發項目 SLF4J+Logback日志框架集成【最終篇】

在這篇文章之前&#xff0c;實際對于 springboot和SLF4JLogback日志框架的使用 我已經分享過3篇關于springboot 日志的文章了。為什么會在寫這篇最終篇&#xff0c;因為 前3篇分享的關于springBoot框架日志的配置方案&#xff0c; 發現了一個問題&#xff1a;只有項目啟動的時候…

phpstudy無法啟動apache,80端口被占用,完美解決

phpstudy無法啟動apache&#xff0c;80端口被占用&#xff0c;完美解決 解決方法一(最推薦) 依次點擊網站-管理-修改 將端口由80改為81&#xff0c;再點擊確認后即可重新啟動apache。 需要注意的是&#xff0c;網站的訪問由127.0.0.1變為127.0.0.1:81。默認是80的端口所以可以不…

Loggers 配置解析(log4j.xml)

Loggers 配置解析 我們通過下面的例子來理解 log4j 的 Loggers 配置是如何決定日志輸出規則的。 <Loggers><!-- 根Logger&#xff1a;全局配置 --><Root level"debug"><AppenderRef ref"consoleAppender" level"info"/&g…

Java 大視界 -- Java 大數據在智能政務輿情監測與引導中的情感分析與話題挖掘技術(272)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

[NocoDB] 在局域網中調整Float類型顯示精度的部署經驗

在單位局域網環境中,NocoDB有效地連接MySQL數據庫和前端服務,做為中間件很方便。然而,在實際應用中,我們也會遇到一些較為隱藏的設置問題,比如此次經歷的 float 顯示精度不匹配問題。 問題環境 實際數據庫:MySQL,表中有 float 類型的數據 原始數據來源:Excel表格 數據轉…

Dockerfile 常見指令詳解

Dockerfile 是一個文本文件&#xff0c;包含了一系列用于構建 Docker 鏡像的指令。以下是 Dockerfile 中常見指令的詳細解釋&#xff1a; 基礎指令 1. FROM 指定基礎鏡像&#xff0c;必須為第一條指令&#xff08;注釋除外&#xff09;。 FROM ubuntu:20.04 FROM python:3.…

InnoDB Cluster 與 NDB Cluster 對比及部署指南

InnoDB Cluster 與 NDB Cluster 對比及部署指南 一、核心區別對比 特性InnoDB ClusterNDB Cluster存儲引擎InnoDBNDB (內存優先)架構設計基于Group Replication分布式架構(數據節點管理節點SQL節點)一致性模型最終一致性/強一致性強一致性數據持久化磁盤存儲為主內存存儲為主…

PySide環境配置及工具使用

文章目錄 [toc]1 概述1.1 PySide 能做什么&#xff1f;1.2 PySide 的優點1.3 PySide 的缺點1.4 示例代碼&#xff08;簡單窗口&#xff09; 2 環境準備2.1 安裝必要軟件2.2 修改 pip 源 3 PySide23.1 環境要求3.2 配置PySide23.3 工具配置 4 PySide64.1 環境4.2 配置PySide64.3…

數據標注師學習內容

目錄 文本標注詞性標注實體標注 圖像標注語音標注 文本標注 詞性標注 第一篇 第二篇 實體標注 點擊這里 關系標注 事件標注 意圖標注 關鍵詞標注 分類標注 問答標注 對話標注 圖像標注 拉框標注 關鍵點標注 2D標注 3D標注 線標注 目標跟蹤標注 OCR標注 圖像分類標注 語音…

【linux】文件與目錄命令 - rsync

文章目錄 1. 基本用法2. 常用參數3. 用法舉例4. 注意事項 rsync 命令用于快速同步文件和目錄&#xff0c;可用于本地和遠程傳輸&#xff0c;支持增量同步、壓縮、權限保留等特性。 1. 基本用法 語法&#xff1a; rsync [選項] 源 目標功能&#xff1a; 高效增量同步&#xff…

互聯網大廠Java求職面試:電商系統高并發設計

互聯網大廠Java求職面試&#xff1a;電商系統高并發設計 文章內容 面試官&#xff08;技術總監&#xff09;與鄭薪苦的對話 面試官&#xff1a; “鄭薪苦&#xff0c;歡迎來到我們的面試。今天我們會圍繞一個非常熱門的話題——電商系統的高并發設計進行深入探討。你之前在某…

Nginx跨云反向代理排錯:解密配置參數的“陷阱”

前言&#xff1a;在當今的云計算環境中&#xff0c;跨云平臺的應用部署變得越來越常見。為了驗證跨云平臺反向代理的可行性&#xff0c;我們進行了一次測試。本次測試將后端程序部署在阿里云服務器&#xff0c;同時使用在騰訊云注冊的已備案國內域名。我們在騰訊云控制臺將域名…

股票賬戶的管理和交易

中國證券登記結算有限責任公司&#xff08;簡稱“中國結算”&#xff09;確實是負責股票的賬戶管理&#xff08;開戶、銷戶&#xff09;和登記、存管、清算、交收等后臺業務的中央機構。它確保了股票所有權的準確記錄和交易后資金與證券的最終轉移。 而股票的交易業務&#xff…

Arcgis地理配準變換方法說明

零階多項式 - 將使用零階多項式來平移數據。 當已對數據進行地理配準但通過微小的平移可以更好的排列數據時&#xff0c;通常使用該多項式。 執行零階多項式平移只需要一個連接線。相似性多項式 - 將使用一階變換&#xff0c;嘗試保持原始柵格的形狀。 RMS 錯誤會高于其他多項式…

深入理解 C++ volatile 與 atomic:五大用法解析 + 六大高頻考點

一、volatile volatile是C中一個非常重要的關鍵字。volatile關鍵字告訴編譯器&#xff0c;被修飾的變量可能會在程序控制之外被改變&#xff0c;因此編譯器不能對該變量的訪問進行優化。什么意思呢&#xff1f;現代處理器架構中&#xff0c;有寄存器&#xff0c;L1緩存&#x…

跨主機管理Docker容器化應用的操作與技巧

哈嘍&#xff0c;大家好&#xff0c;我是左手python&#xff01; 環境準備與 Docker 安裝 在開始跨主機管理 Docker 容器化應用之前&#xff0c;需要確保所有主機上都安裝了 Docker 引擎&#xff0c;并且這些主機之間可以通過 SSH 協議進行通信。本節將詳細介紹環境準備和 Doc…

編程實踐:sigmastar330 調用IVE圖像處理加速

說明:本專欄文章有兩種解鎖方案 1:付費訂閱,暢享所有文章 2:免費獲取,點擊下方鏈接,關注,自動獲取免費鏈接 https://free-img.400040.xyz/4/2025/04/29/6810a50b7ac8b.jpg 主題:利用IVE進行圖像處理加速 Sigmastar 支持的硬件操作,基本都在:mi_ive.h 文件中,本文…