高德地图在Vue3中的使用方法

1.地图初始化

        容器创建:通过 <div> 标签定义地图挂载点。

<div id="container" style="height: 300px; width: 100%; margin-top: 10px;"></div>

        密钥配置:绑定高德地图安全密钥,确保 API 合法调用。

        参数配置:定义地图缩放比例、初始中心点经纬度(数组格式 [lng, lat])。

        标记点初始化:创建 Marker 实例用于后续定位

// 初始化地图(完全异步化)
const initMap = async () => {// 确保DOM已渲染await nextTick();// 检查容器是否存在const container = document.getElementById('container');if (!container) {console.error('地图容器不存在,可能对话框尚未完全渲染');return false;}if (mapLoaded.value && map.value) return true; // 如果已经加载过且地图已初始化,直接返回try {// 设置安全配置(window as any)._AMapSecurityConfig = {securityJsCode: '76f83426ac3692c440bc1efd2b15fff6'};// 动态加载高德地图JSawait new Promise((resolve, reject) => {if ((window as any).AMap) return resolve(true); // 如果已经加载过,直接返回const script = document.createElement('script'); // 创建script标签script.src = 'https://webapi.amap.com/maps?v=2.0&key=f10b74bad0d89466b9e174aaefb9a3f7&plugin=AMap.Geocoder';script.onload = resolve; // 加载成功后调用 resolve 函数script.onerror = reject; // 加载失败后调用 reject 函数document.head.appendChild(script);});// 再次检查容器是否存在 (id 是唯一的)if (!document.getElementById('container')) {console.error('地图容器在脚本加载后不存在');return false;}// 初始化地图map.value = new (window as any).AMap.Map('container', {zoom: 13, // 初始缩放级别为 13center: [116.397428, 39.90923], // 初始中心点为 [116.397428, 39.90923],即天安门广场});// 初始化标记marker.value = new (window as any).AMap.Marker({map: map.value});mapLoaded.value = true;return true; // 返回 true 表示成功加载} catch (error) {console.error('地图初始化失败:', error);proxy?.$modal.msgError('地图加载失败');return false; // 返回 false 表示加载失败}
};

2.地址选择与解析

级联选择器:选择省、市、县三级行政区(普通省份为三级,直辖市可能缺少县级)。

详细地址输入:用户手动补充街道、楼栋等详细信息。

地址合并:将级联选择结果与输入框内容拼接成完整地址字符串。

地理编码:调用高德地图 API 将地址转为经纬度。

更新标记点:将解析后的经纬度更新到地图标记。

防抖函数:控制高频触发的事件或函数的执行频率,确保在事件连续快速触发时,只在最后一次触发后的一段时间内执行一次目标操作。

// 防抖函数
const debounce = (fn: Function, delay: number) => {let timer: ReturnType<typeof setTimeout>; // 用于存储定时器的返回值return function (this: any, ...args: any[]) {clearTimeout(timer); // 清除上一次的定时器timer = setTimeout(() => fn.apply(this, args), delay); // 设置新的定时器};
};
// 处理地址选择变化(核心逻辑)
const handleAddressChange = debounce(async () => {try {await initMap();const selectedLabels = form.value.addressArray?.map(code => codeToText[code]) || []; // 获取选中的省市区const detailAddress = form.value.addressDetail?.trim() || ''; // 获取详细地址const fullAddress = [...selectedLabels, detailAddress].join(''); // 拼接完整地址// 这里赋值给addressform.value.address = fullAddress;if (!fullAddress) return; // 如果地址为空,不进行解析const geocoder = new (window as any).AMap.Geocoder({city: selectedLabels[0] || '' // 根据选中的省设置地图上的城市});interface GeocoderResult {status: string; // 状态码result: any; // 解析结果}const { status, result } = await new Promise<GeocoderResult>((resolve, reject) => {geocoder.getLocation(fullAddress, (status, result) => {if (status === 'complete') resolve({ status, result }); // 成功解析else reject(new Error(result?.info || '地址解析失败')); // 失败});});if (status === 'complete' && result.geocodes?.length) {// geocodes 是高德地图API返回的地理编码结果数组,它包含了地址解析后的地理信息。/** geocodes:[{*      location : 包含经纬度坐标(lng, lat)*      formattedAddress : 格式化后的完整地址*      addressComponent : 地址组成信息(省、市、区等)*      level : 地址匹配的精确度级别* }]*/const lnglat = result.geocodes[0].location;map.value?.setCenter(lnglat); // 将地图中心移动到解析后的位置marker.value?.setPosition(lnglat); // 将标记移动到解析后的位置// 更新表单坐标form.value.longitude = lnglat.lng;form.value.latitude = lnglat.lat;}} catch (error) {console.error('地址解析错误:', error);proxy?.$modal.msgError(error.message);}
}, 500);

3. 直辖市特殊处理以及回显

问题背景:直辖市(如北京、上海)的级联数据层级缺失(如 北京市 -> 北京市)。
直接拼接会导致地址重复(如 北京市北京市朝阳区xx路)。

修复逻辑:通过判断省、市名称是否相同,动态修正地址字符串

/** 修改按钮操作 */
const handleUpdate = async (row?: TenantVO) => {reset();await getTenantPackage();const _id = row?.id || ids.value[0];const res = await getTenant(_id);Object.assign(form.value, res.data);// 确保对话框完全打开dialog.visible = true;dialog.title = '修改租户';try {// 等待地图初始化完成await initMap();// 判读经纬度是否有值if (form.value.longitude && form.value.latitude) {map.value?.setCenter([form.value.longitude, form.value.latitude]); // 将地图中心移动到解析后的位置marker.value?.setPosition([form.value.longitude, form.value.latitude]); //  将标记移动到解析后的位置// 执行逆地理编码// 传入经纬度数组 [form.value.longitude, form.value.latitude] ,获取地址信息const geocoder = new (window as any).AMap.Geocoder();const { status, result } = await new Promise((resolve, reject) => {geocoder.getAddress([form.value.longitude, form.value.latitude], (status, result) => {if (status === 'complete') resolve({ status, result });else reject(new Error(result?.info || '地址解析失败'));});});if (status === 'complete' && result.regeocode) {const address = result.regeocode.formattedAddress;const addressComponent = result.regeocode.addressComponent;const province = addressComponent.province;const city = addressComponent.city || province; // 如果没有city,使用province代替 因为直辖市没有city字段/*** addressComponent = {*    province: "北京市",*    city: "", // 直辖市可能没有city字段*    district: "朝阳区"*   }*/const district = addressComponent.district;// 更新表单中的地址信息form.value.address = address;// 将省市区转换为级联选择器需要的code格式const findCode = (name, data) => {// name 为省市区名称,data 为 regionData 数据包含了中国的省、市、区三级行政区划信息for (const item of data) {if (item.label === name) return item.value;if (item.children && item.children.length > 0) {const childCode = findCode(name, item.children); // 递归查找子级if (childCode) return childCode; // 如果找到了,返回code}}return null;};const provinceCode = findCode(province, regionData); // 查找省的codelet cityCode = findCode(city, regionData); // 查找市的codeconst districtCode = findCode(district, regionData); // 查找区的code// 设置级联选择器值if (provinceCode && cityCode && districtCode) {cityCode = cityCode.length == 2 ? cityCode + '01' : cityCode; // 给直辖市的市code添加01form.value.addressArray = [provinceCode, cityCode, districtCode];}// 设置详细地址// 需要三元运算符,因为直辖市会重复显示,所以进行判断 直辖市的 province 和 city 是一样的province == city ? form.value.addressDetail = address.replace(`${province}${district}`, '') : form.value.addressDetail = address.replace(`${province}${city}${district}`, '');// console.log(province, city, district);}} else {// 默认显示天安门广场const tiananmenPosition = [116.397428, 39.90923];map.value?.setCenter(tiananmenPosition);marker.value?.setPosition(tiananmenPosition);}} catch (error) {console.error('地图操作错误:', error);if (!form.value.longitude || !form.value.latitude) {// 如果是没有经纬度的情况,不显示错误提示return;}proxy?.$modal.msgError('地图加载失败,请检查网络连接或稍后再试');}
};

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

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

相关文章

RabbitMQ发布订阅模式深度解析与实践指南

目录 RabbitMQ发布订阅模式深度解析与实践指南1. 发布订阅模式核心原理1.1 消息分发模型1.2 核心组件对比 2. 交换机类型详解2.1 交换机类型矩阵2.2 消息生命周期 3. 案例分析与实现案例1&#xff1a;基础广播消息系统案例2&#xff1a;分级日志处理系统案例3&#xff1a;分布式…

中小型培训机构都用什么教务管理系统?

在教育培训行业快速发展的今天&#xff0c;中小型培训机构面临着学员管理复杂、课程体系多样化、教学效果难以量化等挑战。一个高效的教务管理系统已成为机构运营的核心支撑。本文将深入分析当前市场上适用于中小型培训机构的教务管理系统&#xff0c;重点介绍爱耕云这一专业解…

C++虚函数食用笔记

虚函数定义与作用&#xff1a; virtual关键字声明虚函数&#xff0c;虚函数可被派生类override(保证返回类型与参数列表&#xff0c;名字均相同&#xff09;&#xff0c;从而通过基类指针调用时&#xff0c;实现多态的功能 virtual关键字: 将函数声明为虚函数 override关键…

运算放大器相关的电路

1运算放大器介绍 解释&#xff1a;运算放大器本质就是一个放大倍数很大的元件&#xff0c;就如上图公式所示 Vp和Vn相差很小但是放大后输出还是会很大。 运算放大器不止上面的三个引脚&#xff0c;他需要独立供电&#xff1b; 如图比较器&#xff1a; 解释&#xff1a;Vp&…

华为OD机试真题——通信系统策略调度(用户调度问题)(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Ubuntu 系统默认已安装 python,此处只需添加一个超链接即可

步骤 1&#xff1a;确认 Python 3 的安装路径 查看当前 Python 3 的路径&#xff1a; which python3 输出类似&#xff1a; /usr/bin/python3 步骤 2&#xff1a;创建符号链接 使用 ln -s 创建符号链接&#xff0c;将 python 指向 python3&#xff1a; sudo ln -s /usr/b…

深度学习-分布式训练机制

1、分布式训练时&#xff0c;包括train.py的全部的代码都会在每个gpu上运行吗&#xff1f; 在分布式训练&#xff08;如使用 PyTorch 的 DistributedDataParallel&#xff0c;DDP&#xff09;时&#xff0c;每个 GPU 上运行的进程会执行 train.py 的全部代码&#xff0c;但通过…

yarn的介绍

### Yarn 的基本概念 Yarn 是 Hadoop 生态系统中的一个重要组成部分&#xff0c;它是一种分布式资源管理框架&#xff0c;旨在为大规模数据处理提供高效的资源管理和调度能力。以下是关于 Yarn 的一些核心概念&#xff1a; #### 1. **Yarn 的定义** Yarn 是一个资源调度平台&a…

Spring-messaging-MessageHandler接口实现类ServiceActivatingHandler

ServiceActivatingHandler实现了MessageHandler接口&#xff0c;所以它是一个MessageHandler&#xff0c;在spring-integration中&#xff0c;它也叫做服务激活器&#xff08;Service Activitor&#xff09;&#xff0c;因为这个类是依赖spring容器BeanFactory的&#xff0c;所…

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化

针对深度学习入门新手目标不明确 知识体系杂乱的问题 拟开启快速入门深度学习系列文章的创作 旨在帮助大家快速的入门深度学习 写在前面&#xff1a; 本系列按照吴恩达系列课程顺序发布(说明一下为什么不直接看原笔记 因为内容太多 没有大量时间去阅读 所有作者需要一次梳理…

KingBase问题篇

安装环境 操作系统&#xff1a;CentOS7 CPU&#xff1a;X86_64架构 数据库&#xff1a;KingbaseES_V008R006C009B0014_Lin64_install.iso 项目中遇到的问题 Q1. 执行sql中有字符串常量&#xff0c;且用双引号包裹&#xff0c;执行报错 A1. 默认KingBase不认双引号&#xff0…

濒危仙草的重生叙事:九仙尊米斛花节如何以雅集重构中医药文化IP

五月的霍山深处,层峦叠翠之间,中华仙草霍山米斛迎来一年一度的花期。九仙尊以“斛韵雅集,春野茶会”为主题,举办为期半月的米斛花文化节,融合中医药文化、东方美学与自然体验,打造一场跨越古今的沉浸式文化盛宴。活动涵盖古琴雅集、书法创作、茶道冥想、诗歌吟诵、民族歌舞等多…

LeetCode100.1 两数之和

今天晚上看了许多关于未来计算机就业的视频&#xff0c;有种正被贩卖焦虑的感觉&#xff0c;翻来覆去下决定先做一遍leetcode100给自己降降温&#xff0c;打算每周做四题&#xff0c;尽量尝试不同的方法与不同的语言。 一开始想到的是暴力解法&#xff0c;两层循环。数据量为1e…

python制造一个报错

以下是用Python制造常见错误的示例及解析&#xff0c;涵盖不同错误类型&#xff0c;便于理解调试原理&#xff1a; 一、语法错误 (SyntaxError) # 错误1&#xff1a;缺少冒号 if Trueprint("这行不会执行")# 错误2&#xff1a;缩进错误 def func(): print("未对…

idea整合maven环境配置

idea整合maven 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a;每个知识点&#xff0c;都是写出代码…

Node.js中那些常用的进程通信方式

文章目录 1 什么是子进程?2 核心方法详解2.1 `child_process.spawn(command, [args], [options])`2.2 `child_process.exec(command, [options], callback)`2.3 `child_process.execFile(file, [args], [options], callback)`2.4 `child_process.fork(modulePath, [args], [op…

Vue3吸顶导航的实现

吸顶导航实现 【实现目标】&#xff1a; 在Layout页面中&#xff0c;浏览器上下滚动时&#xff0c;距离顶部距离大于80px吸顶导航显示&#xff0c;小于则隐藏。 【实现过程】&#xff1a; 通过layout接口获取分类列表内容并使用categorystore进行状态管理&#xff0c;获取到…

双向长短期记忆网络-BiLSTM

5月14日复盘 二、BiLSTM 1. 概述 双向长短期记忆网络&#xff08;Bi-directional Long Short-Term Memory&#xff0c;BiLSTM&#xff09;是一种扩展自长短期记忆网络&#xff08;LSTM&#xff09;的结构&#xff0c;旨在解决传统 LSTM 模型只能考虑到过去信息的问题。BiLST…

2025年Flutter项目管理技能要求

在2025年&#xff0c;随着Flutter技术的广泛应用和项目复杂度的提升&#xff0c;项目管理的重要性愈发凸显。Flutter项目管理不仅需要技术能力&#xff0c;还需要良好的沟通、协调、规划和执行能力。本文将详细探讨2025年Flutter项目管理应具备的技能要求&#xff0c;帮助项目管…

OpenCV CUDA模块中逐元素操作------数学函数

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在OpenCV的CUDA模块中&#xff0c;确实存在一系列用于执行逐元素数学运算的函数&#xff0c;包括指数、对数、平方根等。这些函数对于高级图像处…