如何在 Vue 3 中實現百度地圖位置選擇器組件


如何在 Vue 3 中實現百度地圖位置選擇器組件

前言

在開發前端應用時,地圖選擇器是一個非常常見的需求。尤其是在一些需要用戶選擇地址的場景,如電商平臺、旅游網站、酒店預定等,百度地圖組件能提供準確的地理位置服務。在本文中,我們將一步步展示如何使用 Vue 3 和 Element Plus 來實現一個百度地圖位置選擇器組件。這個組件允許用戶通過地圖選擇位置,并展示詳細的地址信息。

準備工作

在開始實現之前,我們需要確保已經安裝了以下依賴:

  • Vue 3:Vue.js 是我們前端應用的基礎框架。
  • Element Plus:一個基于 Vue 3 的組件庫,提供了許多高質量的 UI 組件。
  • 百度地圖 API:百度地圖 API 提供了豐富的地圖功能接口,供我們在網頁中嵌入地圖,并獲取地理位置信息。

安裝依賴

如果你還沒有安裝這些依賴,可以通過以下命令安裝:

npm install vue@next element-plus

同時,為了能在 Vue 項目中使用百度地圖,我們需要引入百度地圖的 API。在 index.html 中,添加以下代碼:

<script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=YOUR_API_KEY"></script>

記得將 YOUR_API_KEY 替換成你自己的百度地圖 API 密鑰。

實現步驟

1. 創建百度地圖組件

我們先從創建百度地圖組件開始,這個組件將允許用戶在地圖上選擇位置。

1.1 創建 BaiduMapPicker.vue 組件

首先,我們創建一個 BaiduMapPicker.vue 組件,用于加載地圖和處理用戶選擇的位置。

<template><div id="map" style="height: 100%;"></div>
</template><script setup lang="ts">
import { onMounted, ref, watch } from 'vue';const location = ref({latitude: 26.61246398970894,longitude: 106.59077252491133,
});// 初始化百度地圖
onMounted(() => {const map = new BMapGL.Map("map");const point = new BMapGL.Point(location.value.longitude, location.value.latitude);map.centerAndZoom(point, 15);map.addOverlay(new BMapGL.Marker(point));map.addEventListener('click', (e: any) => {location.value.latitude = e.latlng.lat;location.value.longitude = e.latlng.lng;map.clearOverlays();map.addOverlay(new BMapGL.Marker(e.latlng));});
});
</script><style scoped>
#map {width: 100%;height: 100%;
}
</style>
1.2 說明
  • 地圖初始化:我們通過百度地圖的 BMapGL.Map 類來創建一個地圖實例,傳入 longitudelatitude 初始化地圖的中心位置,并設置縮放級別。
  • 點擊事件:監聽地圖上的點擊事件,用戶每點擊一次地圖,地圖會更新位置并重新標記。

2. 創建主頁面,使用地圖組件

接下來,我們將在主頁面中使用剛剛創建的 BaiduMapPicker 組件。我們會在彈窗中展示地圖,并允許用戶選擇位置。

2.1 創建主頁面
<template><Dialog v-model="dialogVisible" :title="dialogTitle" width="1000px"><div class="container"><h2>選擇位置</h2><BaiduMapPickerv-model="location"@update:location="handleLocationUpdate"/><div class="location-info"><h3>選中的位置信息:</h3><p>緯度:{{ location.latitude }}</p><p>經度:{{ location.longitude }}</p></div></div><template #footer><el-button @click="submitForm" type="primary">確定</el-button><el-button @click="cancel" type="default">取消</el-button></template></Dialog>
</template><script setup lang="ts">
import { ref } from 'vue';
import { ElButton, ElDialog } from 'element-plus';
import BaiduMapPicker from '@/components/BaiduMapPicker.vue';const dialogVisible = ref(false);
const dialogTitle = ref("選擇地址");
const location = ref({ latitude: 26.61246398970894, longitude: 106.59077252491133 });const handleLocationUpdate = (newLocation: { latitude: number, longitude: number }) => {location.value = newLocation;
};const submitForm = () => {dialogVisible.value = false;console.log("提交的位置:", location.value);
};const cancel = () => {dialogVisible.value = false;
};
</script><style scoped>
.container {padding: 20px;
}.location-info {margin-top: 20px;background-color: #f5f7fa;padding: 15px;border-radius: 5px;
}h2 {margin-bottom: 15px;font-size: 1.5em;
}h3 {margin-bottom: 10px;
}p {font-size: 1em;margin: 5px 0;
}
</style>
2.2 說明
  • Dialog 彈窗:我們使用了 Element Plus 的 Dialog 組件來展示百度地圖和位置信息。當用戶點擊“確定”時,我們可以通過 submitForm 方法提交選中的位置。
  • 位置更新:當用戶點擊地圖時,handleLocationUpdate 會被觸發,更新 location 數據并顯示在頁面上。

3. 彈窗控制與位置展示

我們使用了 Element Plus 的 Dialog 組件來控制彈窗的顯示與隱藏,確保用戶體驗良好。

const dialogVisible = ref(false); // 控制彈窗的顯示
const dialogTitle = ref("選擇地址"); // 彈窗標題

通過這種方式,我們實現了一個簡單而直觀的地址選擇功能。

效果展示

3.1 位置選擇

用戶可以在彈窗中看到百度地圖,點擊任意位置,地圖上的標記會隨之更新,顯示選中的緯度和經度。

3.2 提交結果

點擊“確定”后,用戶選擇的經緯度數據會被提交,并可以用于后續的業務邏輯。


總結

通過這篇博客,我們學習了如何在 Vue 3 中使用百度地圖 API 實現一個位置選擇器組件。該組件不僅支持位置選擇功能,還能夠展示用戶選擇的詳細地址信息。通過 Vue 3 和 Element Plus 的結合,我們能夠快速開發出高質量的 UI 組件,提升用戶體驗。

小貼士

  1. API 密鑰保護:在生產環境中,記得將百度地圖的 API 密鑰保存在安全的地方,避免暴露在前端代碼中。
  2. 優化加載速度:考慮到地圖加載時間較長,可以對地圖組件進行懶加載,提升用戶體驗。

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

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

相關文章

Python中如何用正則表達式精準匹配IP地址?

在網絡編程和數據處理時&#xff0c;我們經常需要從文本中提取或驗證IP地址。Python的正則表達式(re模塊)是完成這個任務的利器。但你知道怎么寫才能準確匹配各種合法的IP地址嗎&#xff1f;今天我們就來詳細探討這個問題。 為什么需要IP正則表達式&#xff1f; 假設你正在分…

spring--聲明式事務

聲明式事務 1、回顧事務 要么都成功&#xff0c;要么都失敗&#xff01; 事務在項目開發中&#xff0c;十分重要&#xff0c;涉及數據的一致性問題 確保完整性和一致性 事務ACID&#xff1a; 原子性&#xff1a;事務是原子性操作&#xff0c;由一系列動作組成&#xff0c;…

Kotlin 學習-集合

/*** kotlin 集合* List:是一個有序列表&#xff0c;可通過索引&#xff08;下標&#xff09;訪問元素。元素可以在list中出現多次、元素可重復* Set:是元素唯一的集合。一般來說 set中的元素順序并不重要、無序集合* Map:&#xff08;字典&#xff09;是一組鍵值對。鍵是唯一的…

WPF 五子棋項目文檔

WPF 五子棋項目文檔 1. 項目概述 本項目是一個使用 Windows Presentation Foundation (WPF) 技術棧和 C# 語言實現的桌面版五子棋&#xff08;Gomoku&#xff09;游戲。它遵循 MVVM&#xff08;Model-View-ViewModel&#xff09;設計模式&#xff0c;旨在提供一個結構清晰、可…

計算機操作系統——死鎖(詳細解釋和處理死鎖)

系列文章目錄 計算機操作系統-計算機系統中的死鎖 文章目錄 系列文章目錄前言一、資源問題&#xff1a; 計算機系統當中的死鎖&#xff1a; 二、死鎖的定義、必要條件和處理方法&#xff1a; 1.死鎖的定義&#xff1a;2.產生死鎖的必要條件&#xff1a;3.處理死鎖的方法&#…

Springboot項目正常啟動,訪問資源卻出現404錯誤如何解決?

我在自己的springboot項目中的啟動類上同時使用了SprinBootApplication和ComponentScan注解, 雖然項目能夠正常啟動,但是訪問資源后,返回404錯誤,隨后在啟動類中輸出bean,發現controller創建失敗: 而后我將ComponentScan去掉后資源就能訪問到了. 原因 SprinBootApplication本身…

第十五屆藍橋杯C/C++B組省賽真題講解(分享去年比賽的一些真實感受)

試題A——握手問題 一、解題思路 直接用高中學的排列組合思路 二、代碼示例 #include<bits/stdc.h> using namespace std; int fun(int n) {int sum0;for(int i0;i<n;i){for(int ji1;j<n;j)sum; } return sum; } int main() {cout<<fun(50)-fun(7); }三、…

動態規劃(6)——01背包問題

歡迎來到博主的專欄&#xff1a;算法解析 博主ID&#xff1a;代碼小號 文章目錄 牛客網——【模板】01背包題目解析題目1算法原理題目1題解代碼。問題2算法原理問題2題解代碼01背包問題的滾動數組優化 牛客網——【模板】01背包 題目解析 關于I/O相關的東西博主就不多贅述了&a…

TQTT_KU5P開發板教程---實現流水燈

文檔實現功能介紹 本文檔是學習本開發板的基礎&#xff0c;通過設置計數器使led0到led7依次閃爍&#xff0c;讓用戶初步認識vivado基本的開發流程以及熟悉項目的創建。本開發板的所有教程所使用的軟件都是vivado2024.1版本的。可以根據網上的教程下載與安裝。 硬件資源 此次教程…

Spring 中的 @Cacheable 緩存注解

1 什么是緩存 第一個問題&#xff0c;首先要搞明白什么是緩存&#xff0c;緩存的意義是什么。 對于普通業務&#xff0c;如果要查詢一個數據&#xff0c;一般直接select數據庫進行查找。但是在高流量的情況下&#xff0c;直接查找數據庫就會成為性能的瓶頸。因為數據庫查找的…

SEER: Self-Aligned Evidence Extraction for Retrieval-AugmentedGeneration

一、動機 如何從檢索到的段落中提取證據&#xff0c;以降低計算成本并提升最終的RAG性能&#xff0c;然而這一問題仍然具有挑戰性。 現有方法 嚴重依賴于基于啟發式的增強&#xff0c;面臨以下幾個問題&#xff1a; &#xff08;1&#xff09;由于手工制作的上下文過濾&…

毫米波測試套裝速遞!高效賦能5G/6G、新材料及智能超表面(RIS)研發

德思特&#xff08;Tesight&#xff09;作為全球領先的測試測量解決方案提供商&#xff0c;始終致力于為前沿技術研發提供高精度、高效率的測試工具。 針對毫米波技術在高頻通信、智能超表面&#xff08;RIS&#xff09;、新材料等領域的快速應用需求&#xff0c;我們推出毫米…

三維激光測量助力企業檢測效率提升3倍

智能制造與數字化浪潮席卷下&#xff0c;三維掃描技術已成為工業檢測領域不可或缺的工具。面對傳統檢測手段的精度瓶頸與效率局限&#xff0c;三維掃描儀&#xff0c;以毫米級精度、非接觸式測量與超高速掃描三大核心優勢&#xff0c;為汽車制造、航空航天、消費電子等行業的品…

SQL:Normalization(范式化)

目錄 Normalization&#xff08;范式化&#xff09; 為什么需要 Normalization&#xff1f; &#x1f9e9; 表格分析&#xff1a; 第一范式&#xff08;1NF&#xff09; 什么是第一范式&#xff08;First Normal Form&#xff09;&#xff1f; 第二范式&#xff08;2NF&am…

#MES系統運維問題分析思路

一套適用于90% MES運維現場問題的排查分析思維模型&#xff0c;叫做&#xff1a; &#x1f50d; MES系統問題分析七步法&#xff08;現場實戰適用&#xff09; ? 第一步&#xff1a;明確問題現象&#xff08;What&#xff09; 問題要說清楚&#xff0c;“不能操作”這種模糊描…

達夢數據庫-學習-18-ODBC數據源配置(Linux)

一、環境信息 名稱值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系統CentOS Linux release 7.9.2009 (Core)內存4G邏輯核數2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…

js 效果展示 拿去練手

自學完整功能&#xff0c;拿去練手。 鼠標移動放大 通過網盤分享的文件&#xff1a;圖片放大 鏈接: https://pan.baidu.com/s/1w8SjtKi4kUNDnZtRDfYMeQ?pwd95p6 提取碼: 95p6 通過網盤分享的文件&#xff1a;圖片動畫效果 鏈接: https://pan.baidu.com/s/1Pjphx-Cc4HQQNNujr…

使用 TFIDF+分類器 范式進行企業級文本分類(二)

1.開場白 上一期講了 TF-IDF 的底層原理&#xff0c;簡單講了一下它可以將文本轉為向量形式&#xff0c;并搭配相應分類器做文本分類&#xff0c;且即便如今的企業實踐中也十分常見。詳情請見我的上一篇文章 從One-Hot到TF-IDF&#xff08;點我跳轉&#xff09; 光說不練假把…

硬件設計-MOS管快速關斷的原因和原理

目錄 簡介&#xff1a; 來源&#xff1a; MOS管快關的原理 先簡單介紹下快關的原理&#xff1a; 同電阻時為什么關斷時間會更長 小結 簡介&#xff1a; 本章主要介紹MOS快速關斷的原理和原因。 來源&#xff1a; 有人會問&#xff0c;會什么要求快速關斷&#xff0c;而…

Linux進階命令

目錄 一、touch 1. 基本語法 2. 常用選項 二、which 1. 基本語法 2. 主要功能 3. 常用選項 三、find 1. 基本語法 2. 常用選項和表達式 四、more 1. 基本語法 2. 常用操作 3. 對比 more 和 less 五、grep 1. 基本語法 2. 常用選項 六、wc 1. 基本語法 2. 常…