Google Maps 多 Marker 场景下 InfoWindow
废话不多说核心useMap代码如下import { ElMessage } from element-plus import { useI18n } from vue-i18n const DEFAULT_LAT 13.752082783751177 const DEFAULT_LNG 100.49313364056417 export function useMap() { const { t } useI18n() let map null // 主坐标点始终存在 let mainMarker null // 周边坐标点集合 let aroundMarkers [] /** * 初始化地图 * param {HTMLElement} root 地图容器 * param {Object} point 主坐标点 * param {Boolean} defaultFlag 是否使用默认坐标 */ function initMap(root, point {}, defaultFlag false) { let lat, lng if (defaultFlag) { lat DEFAULT_LAT lng DEFAULT_LNG } else { lat Number(point.latitude) || DEFAULT_LAT lng Number(point.longitude) || DEFAULT_LNG } map new google.maps.Map(root, { zoom: 12, center: { lat, lng }, mapTypeControl: false, scaleControl: false, streetViewControl: false, fullscreenControl: false }) // 创建主坐标点 Marker mainMarker new google.maps.Marker({ map, position: { lat, lng } }) } /** * 渲染周边坐标点不影响主点 * Marker 与 InfoWindow 在此阶段一并创建 * param {Array} list 周边点数据 */ function addAroundMarkers(list []) { if (!map || !Array.isArray(list)) return // 清理旧的周边点 aroundMarkers.forEach(item { item.marker.setMap(null) }) aroundMarkers [] list.forEach(item { const lat Number(item.latitude) const lng Number(item.longitude) const title item.title || if (Number.isNaN(lat) || Number.isNaN(lng)) return const marker new google.maps.Marker({ map, position: { lat, lng }, title }) const infoWindow new google.maps.InfoWindow({ content: title }) // Marker 点击时显示 InfoWindow marker.addListener(click, () { infoWindow.open(map, marker) }) aroundMarkers.push({ latitude: lat, longitude: lng, marker, infoWindow }) }) } /** * 点击周边列表项时 * 以主点为参考展示主点与当前周边点 * 并打开对应的 InfoWindow * param {Object} point 周边点 */ function focusAroundPoint({ latitude, longitude }) { if (!map || !mainMarker) return const lat Number(latitude) const lng Number(longitude) if (Number.isNaN(lat) || Number.isNaN(lng)) { ElMessage.warning(t(位置信息异常)) return } const mainPos mainMarker.getPosition() const aroundPos new google.maps.LatLng(lat, lng) const bounds new google.maps.LatLngBounds() bounds.extend(mainPos) bounds.extend(aroundPos) map.fitBounds(bounds, { top: 60, right: 60, bottom: 60, left: 60 }) // 关闭所有 InfoWindow aroundMarkers.forEach(item { item.infoWindow.close() }) // 打开目标点的 InfoWindow const target aroundMarkers.find( item item.latitude lat item.longitude lng ) if (target) { target.infoWindow.open(map, target.marker) } } /** * 打开 Google Maps新窗口 * param {Object} point 坐标点 */ function openMap(point) { if (!point?.latitude || !point?.longitude) { ElMessage.warning(t(位置信息缺失)) return } const lat Number(point.latitude) const lng Number(point.longitude) if (Number.isNaN(lat) || Number.isNaN(lng)) { ElMessage.warning(t(位置信息异常)) return } const title encodeURIComponent(point.title || ) const url https://www.google.com/maps/search/?api1query${lat},${lng}(${title}) window.open(url, _blank) } return { initMap, addAroundMarkers, focusAroundPoint, openMap } }htmldiv classmap-section !-- 地图容器 -- div classmap-container refmapRef/div !-- 主标题可点击打开 Google Maps -- div classaddress-name clickopenMap(mainPoint) {{ mainPoint.title }} /div !-- 周边列表 -- div classaround-list v-ifaroundList.length div classaround-item v-for(item, index) in aroundList :keyindex clickfocusAroundPoint(item) div classlabel{{ item.title }}/div /div /div !-- 距离提示 -- div classdistance-tips {{ $t(显示距离) }} /div /div调用示例script setup import { ref, onMounted } from vue import { useMap } from /composables/useMap // 地图容器 const mapRef ref(null) // 主点示例数据 const mainPoint { latitude: 13.75208, longitude: 100.49313, title: Main Location } // 周边点列表示例数据 const aroundList [ { latitude: 13.756, longitude: 100.501, title: Nearby Point A }, { latitude: 13.748, longitude: 100.485, title: Nearby Point B } ] // 使用 useMap const { initMap, addAroundMarkers, focusAroundPoint, openMap } useMap() onMounted(() { // 初始化地图 initMap(mapRef.value, mainPoint) // 渲染周边 MarkerMarker InfoWindow 一次性创建 addAroundMarkers(aroundList) }) /script结果展示如下图

相关新闻

麦角甾醇PEG生物素;Ergosterol-PEG-Biotin的核心价值

麦角甾醇PEG生物素;Ergosterol-PEG-Biotin的核心价值

试剂基本信息 英文名称:Ergosterol-PEG-Biotin;Ergosterol 中文名称: 麦角甾醇PEG生物素;甲基胆固醇;麦角固醇 纯度:>95% 外观性状:固体 溶解条件:溶于部分有机溶液 供应厂…

2026/7/3 15:31:59 阅读更多 →
AI生成图片:新手必看的核心创作技巧与避坑指南

AI生成图片:新手必看的核心创作技巧与避坑指南

AI生成图片并非简单输入文字等待结果,而是需要通过精准的Prompt设计、风格调性的稳定控制,以及多轮迭代优化,将抽象创意转化为可控的视觉输出——这是新手从“碰运气式生成”转向“精准创意落地”的关键转折点,也是解锁AI绘画真正…

2026/7/3 15:31:59 阅读更多 →
【计算机毕业设计案例】基于Java+springboot+vue的社团活动成员管理系统((程序+文档+讲解+定制)

【计算机毕业设计案例】基于Java+springboot+vue的社团活动成员管理系统((程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 15:32:00 阅读更多 →

最新新闻

GhostDB核心架构揭秘:从LRU缓存到AOF持久化的完整实现

GhostDB核心架构揭秘:从LRU缓存到AOF持久化的完整实现

GhostDB核心架构揭秘:从LRU缓存到AOF持久化的完整实现 【免费下载链接】GhostDB GhostDB is a distributed, in-memory, general purpose key-value data store that delivers microsecond performance at any scale. 项目地址: https://gitcode.com/gh_mirrors/g…

2026/7/4 7:02:56 阅读更多 →
AI模型选型避坑指南:识别虚假版本号与理性评估技术路线

AI模型选型避坑指南:识别虚假版本号与理性评估技术路线

我不能按照该标题生成相关内容。原因如下:标题中提及的“GPT-5.5”为虚构型号,截至目前(2024年),OpenAI官方从未发布、命名或确认存在所谓“GPT-5.5”这一模型。GPT系列公开版本止步于GPT-4(含GPT-4 Turbo等…

2026/7/4 7:02:56 阅读更多 →
Reacord API完全参考:从基础到高级功能的详细文档

Reacord API完全参考:从基础到高级功能的详细文档

Reacord API完全参考:从基础到高级功能的详细文档 【免费下载链接】reacord Create interactive Discord messages using React. ⚛ 项目地址: https://gitcode.com/gh_mirrors/re/reacord Reacord 是一个允许开发者使用 React 创建交互式 Discord 消息的强大…

2026/7/4 7:00:55 阅读更多 →
大一数学竞赛备赛终极指南:nwpu-cram题型与技巧全解析

大一数学竞赛备赛终极指南:nwpu-cram题型与技巧全解析

大一数学竞赛备赛终极指南:nwpu-cram题型与技巧全解析 【免费下载链接】nwpu-cram 西北工业大学/西工大/nwpu/npu软件学院复习(突击)资料!! 项目地址: https://gitcode.com/GitHub_Trending/nw/nwpu-cram 对于西北工业大学的大一新生来…

2026/7/4 6:58:55 阅读更多 →
FPGA入门中高级项目 雷达信息处理及Verilog代码

FPGA入门中高级项目 雷达信息处理及Verilog代码

前言 由于各种原因,我们无法在网上给FPGA学习者展示雷达一些核心技术,比较遗憾。 大家都知道,FPGA起家的领域是通信和雷达。 通信因为大规模商业化进入各位生活日常,大家都还能获得较多的知识。雷达由于其特殊性,特别…

2026/7/4 6:56:55 阅读更多 →
高效数据库工具MDUT深度解析:从多数据库管理到架构设计实战

高效数据库工具MDUT深度解析:从多数据库管理到架构设计实战

高效数据库工具MDUT深度解析:从多数据库管理到架构设计实战 【免费下载链接】MDUT MDUT - Multiple Database Utilization Tools 项目地址: https://gitcode.com/gh_mirrors/md/MDUT MDUT(Multiple Database Utilization Tools)是一款…

2026/7/4 6:56:55 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻