在 Web 应用中集成多种地图 API 的实现与管理

在 Web 开发中,集成地图服务是常见的需求之一,尤其是在需要定位、路线规划或展示地理信息的应用中。常见的地图 API 服务包括百度地图、谷歌地图和雅虎地图等。在这篇文章中,我们将深入探讨如何在 Web 应用中同时集成多个地图 API,并有效管理它们的加载状态,以保证应用的稳定性和流畅性。

需求分析

不同地区的用户可能对地图服务有不同的偏好和需求。例如,在中国大陆,百度地图因其本土化的优势而广泛使用;而在全球范围内,谷歌地图则是最常见的选择。此外,像雅虎地图等其他地图服务也可能根据特定的需求而被使用。

因此,如何在同一应用中支持多个地图 API,并有效管理这些地图的加载和使用,是一个技术挑战。我们需要考虑以下几个方面:

  1. 地图加载的异步性:不同地图 API 的加载时间可能不同,如何确保地图资源按需加载且不影响用户体验?
  2. 地图加载状态管理:如何避免多个地图 API 同时加载,或是加载失败的情况?
  3. 性能优化:如何保证地图加载过程不会拖慢页面的渲染速度?

为了解决这些问题,我们设计了一个灵活的解决方案,通过 MapManager 类来动态加载和管理不同地图服务,并且为每种地图服务提供独立的加载机制。

解决方案

1. 地图 API 配置

我们首先为每种地图服务定义了相应的配置参数。配置包括地图的初始中心位置、缩放级别、控件选项等。例如,谷歌地图和yandex地图的配置如下:

/**
 * 谷歌地图样式以及初始化配置
 */
export const GOOGLE_MAP_CONFIG = {
  mapId: '9472f1820066bc70',
  center: { lat: 22.548362, lng: 114.066144 },
  gestureHandling: 'greedy',
  zoomControl: true,
  fullscreenControl: false,
  zoom: 16,
  backgroundColor: '#1a202e',
  controlSize: 24,
}


/**
 * YANDEX地图样式配置以及初始化配置
 * controls:['default']  可选 'default'|'geolocationControl'|'fullscreenControl'|'searchControl'|'trafficControl'|'typeSelector'|'zoomControl'|'routeButtonControl'|'routePanelControl'
 *  文档参考 https://yandex.com/dev/jsapi-v2-1/doc/en/v2-1/ref/reference/control.Manager
 */
export const YANDEX_MAP_CONFIG = {
  center: [55.76, 37.64], // 定位中心  [lat, lng]
  zoom: 10, // 缩放比例
  controls: [], // 控制器
}
2. 动态加载地图脚本

为了提高页面加载速度并避免阻塞主线程,我们采用了动态加载地图脚本的方式。每个地图 API 都有独立的加载逻辑,通过 loadScript 方法动态加载地图脚本。以下是谷歌地图的加载方法:




static loaders = {
  googleMap(type, ak = 'your-api-key') {
    const loader = new Loader({ apiKey: ak, version: 'weekly', language: 'zh-CN' })
    return new Promise(resolve => {
      if (window.google) {
        MapManager.setStatus(type, 'loaded')
        return resolve()
      }
      MapManager.setStatus(type, 'loading')
      loader.load().then(() => {
        MapManager.setStatus(type, 'loaded')
        resolve()
      })
    })
  },
}

此处,我们通过 Loader 类(来自 Google Maps API)来加载谷歌地图的脚本,其他地图的加载也采用类似的方式。

百度离线地图:

  offlineMap(type) {
      return new Promise(resolve => {
        MapManager.setStatus(type, 'loading')
        window.mapLoadFinsh = () => {
          MapManager.setStatus(type, 'loaded')
          resolve()
        }
        loadScript('/baiduMap/baidumap_offline_v2_load.js')
      })
    },

百度在线2D 

 async baiduOnlineMap(type, ak) {
      MapManager.setStatus(type, 'loading')
      await new Promise(resolve => {
        window.onlineMapLoaded = resolve
        loadScript('//api.map.baidu.com/api?v=3.0&ak=' + ak + '&callback=onlineMapLoaded')
      })
      await Promise.all([require('./markerClusterer.js'), loadScript('https://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay.js')])
      MapManager.setStatus(type, 'loaded')
    },




export const loadScript = src =>
  new Promise((resolve, reject) => {
    let script = document.createElement('script')
    script.type = 'text/javascript'
    script.src = src
    script.onload = resolve
    script.onerror = reject
    document.body.appendChild(script)
  })

百度地图3D

onlineMapGL(type, ak) {
      return new Promise(resolve => {
        MapManager.setStatus(type, 'loading')
        window.onlineMapGLLoaded = () => {
          MapManager.setStatus(type, 'loaded')
          resolve()
        }
        loadScript('//api.map.baidu.com/api?v=3.0&&type=webgl&ak=' + ak + '&callback=onlineMapGLLoaded')
      })
    },

 yandexMap

async yandexMap(type, ak = '') {
      return new Promise(resolve => {
        MapManager.setStatus(type, 'loading')
        window.yandexMapLoaded = () => {
          MapManager.setStatus(type, 'loaded')
          resolve()
        }
        loadScript('//api-maps.yandex.ru/2.1/?apikey=' + ak + '&lang=' + store.state.locale + '&onload=yandexMapLoaded')
      })
3. 管理地图加载状态

为了确保每个地图 API 在加载过程中不会相互干扰,我们设计了一个状态管理系统。每个地图类型都有一个对应的加载状态,状态值可以是 'unloaded''loading''loaded'。状态管理的代码如下:

static status = {
  googleMap: 'unloaded',
}

static setStatus(type, status) {
  MapManager.status[type] = status
}

static getStatus(type) {
  return MapManager.status[type]
}

通过 getStatussetStatus 方法,我们能够随时获取和修改每个地图的加载状态,确保在加载完成之前不执行后续操作。

4. 轮询加载状态

在某些情况下,地图加载可能因为网络延迟或其他因素而花费较长时间。为了避免因加载时间过长而影响用户体验,我们实现了一个轮询机制,定时检查地图的加载状态。直到地图加载完成或超时,才能继续后续操作。

static pollStatus(type, interval = 300, timeout = 60e3) {
  return new Promise(resolve => {
    const start = Date.now()
    const timer = setInterval(() => {
      const now = Date.now()
      if (now - start > timeout) {
        clearInterval(timer)
      }
      if (MapManager.getStatus(type) === 'loaded') {
        clearInterval(timer)
        resolve()
      }
    }, interval)
  })
}

这个方法通过 setInterval 每隔一段时间检查一次地图的加载状态,直到加载完成或超时。

5. API 密钥管理

不同的地图服务需要不同的 API 密钥。为了方便管理,我们在 MapManager 类中定义了一个 getAk 方法,根据地图类型返回相应的 API 密钥。代码如下:

static getAk(type) {
  const akMap = {
    googleMap: 'your-google-api-key',
    yandexMap: 'your-yandex-api-key',
  }
  return akMap[type]
}

这样,我们能够灵活管理每个地图服务的 API 密钥,确保每种地图都能正常加载。

总结

在这篇文章中,我们展示了如何在 Web 应用中集成多个地图 API(如百度、谷歌、雅虎等),并通过动态加载脚本、状态管理和轮询机制来确保地图的高效加载和稳定性。通过这种方案,开发者可以轻松应对地图加载失败、性能问题等挑战,提升用户体验。

如果你在集成地图 API 的过程中遇到任何问题,或者有其他优化方案,欢迎在评论区与我分享!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI

通义灵码是基于阿里巴巴通义大模型研发的AI 智能编码助手,在通义灵码 1.0 时代,我们针对代码的生成、补全和问答,通过高效果、低时延,研发出了国内最受欢迎的编码助手。 在通义灵码 2.0 发布会上,阿里云通义实验室自然…

Linux网络_套接字_UDP网络_TCP网络

一.UDP网络 1.socket()创建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET网络 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;适用于 IPv4 协议。用于网络通信AF_INET6&#xff1a;IPv6 地址族&a…

endnote x9 如何将参考文献和文中的应用格式由annotated变为编码,例[1],[2]

在 EndNote X9 中&#xff0c;将参考文献和文中引用格式更改为编码形式&#xff08;如 [1], [2]&#xff09;需要以下步骤&#xff1a; 1. 选择合适的输出样式 打开 EndNote X9。点击菜单栏的 "Edit" > "Output Styles" > "Open Style Manage…

用户中心项目教程(二)---umi3的使用出现的错误

目录 1.情况的说明 2.遇到的问题 1&#xff09;第一个问题-关于npx的使用 2&#xff09;第二个问题--unsupport问题 3&#xff09;第三个收获--nodejs安装问题 4&#xff09;第四个收获---nvm下载问题 5&#xff09;第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…

【面试宝典】Java中创建线程池的几种方式以及区别

强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 创建线程池有多种方式&#xff0c;主要通过 Java 的 java.util.concurrent 包提供的 Executors 工具类来实现。以下是几…

Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

通过视觉语言模型蒸馏进行 3D 形状零件分割

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01;对应英文要求比较高&#xff0c;特此说明&#xff01; Abstract This paper proposes a cross-modal distillation framework, PartDistill, which transfers 2D knowledge from vision-language models …

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff09; Transformer-LSTM模型的架构&#xff1a;输入层&#xff1a;多个变量作…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排&#xff08;schedule&#xff09;和监控工作流的平台。它用于编排 ETL&#xff08;Extract-Transform-Load&#xff0…

电脑风扇声音大怎么办? 原因及解决方法

电脑风扇是电脑的重要组件之一&#xff0c;它的作用是为电脑的各个部件提供冷却&#xff0c;防止电脑过热。然而&#xff0c;有时候我们会发现电脑风扇的声音特别大&#xff0c;不仅影响我们的使用体验&#xff0c;也可能是电脑出现了一些问题。那么&#xff0c;电脑风扇声音大…

Oracle报错ORA-01078、LRM-00109

虚拟机异常关机后&#xff0c;rac数据库备机无法启动数据库&#xff0c;报错如下 解决方法&#xff1a; 找到如下路径文件 执行&#xff1a; cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…

.Net Core微服务入门系列(一)——项目搭建

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

Ability Kit-程序框架服务(类似Android Activity)

文章目录 Ability Kit&#xff08;程序框架服务&#xff09;简介Stage模型开发概述Stage模型应用组件应用/组件级配置UIAbility组件概述概述声明配置 生命周期概述生命周期状态说明Create状态WindowStageCreate**和**WindowStageDestroy状态WindowStageWillDestroy状态Foregrou…

Harmony OS 5.0.1 模拟器报未开启 Hyper-V解决方法

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 今天在写Harmony NEXT版本的元服务的时候&#xff0c;突然模拟器无法启动了&#xff0…

WPS数据分析000004

目录 一、表格阅读技巧 冻结窗格 拆分窗口 新建窗口 阅读模式 护眼模式 二、表格打印技巧 打印预览 打印缩放 打印区域 打印标题 分页打印 打印位置 页眉页脚 逐份打印 三、表格保护技巧 锁定单元格 隐藏公式 文档权限 文件加密 一、表格阅读技巧 冻结窗…

LabVIEW桥接传感器数据采集与校准程序

该程序设计用于采集来自桥接传感器的数据&#xff0c;执行必要的设置&#xff08;如桥接配置、信号采集参数、时间与触发设置&#xff09;&#xff0c;并进行适当的标定和偏移校正&#xff0c;最终通过图表呈现采集到的数据信息。程序包括多个模块&#xff0c;用于配置通道、触…

2025西湖论剑-babytrace

前言 就做了下题目&#xff0c;pwn1/3 都是签到&#xff0c;pwn2 后面绕 ptrace 有点意思&#xff0c;简单记录一下 漏洞分析 子进程中的读/写功能没有检查负数的情况&#xff0c;存在越界读写&#xff1a; void __fastcall get_value(__int64 *int64_arr) {__int64 ll; //…

【统计的思想】假设检验(一)

假设检验是统计学里的重要方法&#xff0c;同时也是一种“在理想与现实之间观察求索”的测试活动。假设检验从概率的角度去考察理想与现实之间的关系&#xff0c;籍此来缓解测试可信性问题。 我们先来看一个例子。民航旅客服务系统&#xff0c;简称PSS系统&#xff0c;有一种业…

GPT-5 传言:一场正在幕后发生的 AI 变革

新的一年&#xff0c;让我们从一个引人入胜的话题开始&#xff1a;如果我告诉你&#xff0c;GPT-5 并非虚构&#xff0c;而是真实存在呢&#xff1f;它不仅真实存在&#xff0c;而且正在你看不见的地方悄然塑造着世界。我的基本假设是&#xff1a;OpenAI 已经秘密开发出 GPT-5&…

【20】Word:小许-质量管理-论文❗

目录 题目​ NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下&#xff0c;F12Fn是另存为的作用布局→页面设置对话框→纸张&#xff1a;大小A4→页边距&#xff1a;上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…