vue项目中引入高德地图

2023-11-18

近期在用vue做一个环保类的项目,要求使用高德地图。原生js api官方案例比较多,对于新手友好,但是在vue项目中加载是一个难以解决的问题。而专门为vue使用高德地图诞生的 vue-AMap 组件听起来很美好,但由于需要学习高德原生语法和vue-AMap语法,再加之该组件的文档和示例太少,用起来非常糟糕。
那么我们如何既能使用原生api,又能解决加载问题呢?

1.大大的推荐

AMapJS, 一款基于AMap高德地图构建的API加载器

尽管这个东西不是为vue解决高德地图加载而专门开发的加载器,但是,它成功的被我运用到了项目中,所以,今日份推荐给你。
文档地址

2.vue项目中 AMapJS 加载器的安装与使用

贴一张图,方便下方的阅读。
在这里插入图片描述
安装

 通过 npm 安装
npm i amap-js -S

引入

import AMapJS from 'amap-js'

使用(入口函数)

mounted() {
    this.$nextTick(() => {
      // dom 挂载完毕,再加载地图
      this.entry()
    })
  },
  methods: {
    // 地图加载的入口函数
    async entry() {
      // 创建 AMapJSAPI loader
      this.amapLoader = new AMapJS.AMapLoader({
      // 高德地图的key
        key: 'your key',
        version: '1.4.15',
        plugins: []
      })
      // 创建AMapUI Loader
      this.amapuiLoader = new AMapJS.AMapUILoader({
        version: '1.1'
      })
      // 加载基础的js api,加载DistrictLayer插件,加载UI
      if (
        (await this.amapLoader.load()) &&
        (await this.amapLoader.loadPlugin(['AMap.DistrictLayer'])) &&
        (await this.amapuiLoader.load())
      ) {
        const { AMap } = this.amapLoader
        // 使用data 中的 AMap 保存,全局使用
        this.AMap = AMap
        // UI控件加载
        const [BasicControl] = await this.amapuiLoader.loadUI([
          'control/BasicControl'
        ])
        // 保存到 data,全局使用
        this.BasicControl = BasicControl
        // 构建地图容器
        this.map = new this.AMap.Map('map', {
          zoom: 9,
          center: [112, 33.1],
          // 设置地图样式(比较具有简约美的风格)
          mapStyle: 'amap://styles/fresh'
        })
        // 绘制行政区域,挂载到地图上
        this.map.add(this.disProvince())
        // 加载图层、缩放UI控件的函数
        this.loadUi()
      }
      return true
    }

UI加载:示例为 加载图层、缩放控件函数
高德官方该控件的使用,点击快速跳转

// 图层、缩放控件加载
    async loadUi() {
      // 如果不存在这两个UI控件就创建
      if (!this.bz && !this.bl) {
      // 使用 bz,data保存了一下缩放UI控件
        this.bz = new this.BasicControl.Zoom({
          position: {
            top: this.ctrlTop + 'px',
            right: this.ctrlRight
          }
        })
        // data保存图层切换UI控件
        this.bl = new this.BasicControl.LayerSwitcher({
          position: {
            top: this.ctrlTop + 90 + 'px',
            right: this.ctrlRight
          }
        })
      }
      // 缩放控件挂到地图上
      this.map.addControl(this.bz)
      // 图层切换控件挂到地图上
      this.map.addControl(this.bl)
    }

插件加载: 示例为 加载简易行政区
高德官方该插件的使用,点击快速跳转

// 绘制行政区的函数
    disProvince() {
      return new this.AMap.DistrictLayer.Province({
        zIndex: 10,
        // 展示的区域 ------------------------------------行政区码注意修改
        adcode: ['411***'],
        // 确定展示的等级(1的话,只展示市,2展示县区)
        depth: 2,
        styles: {
        //行政区要填充的颜色
          fill: (area) => {
            var adcode = area.adcode
            // 调用颜色函数
            return this.getColorByAdcode(adcode)
          },
          'province-stroke': 'cornflowerblue',
          'city-stroke': 'white', // 中国地级市边界
          'county-stroke': 'rgba(255,255,255,0.5)' // 中国区县边界
        }
      })
    },
    /* 颜色赋值函数 该函数阅读起来有一点晦涩,大致意思就是要渲染的行政区码,作为一个属性
    如果该 colors[adcode] 不存在,我们就取一个颜色,为其放里边,然后赋值给当前行政区要渲染的 fill 填充颜色中。
    如此一来,也就是说,要渲染的行政区必然有颜色,不渲染的行政区,自然也就没有颜色
    data中高亮行政区域颜色存放变量,colors: {}
    参数: 行政区码 adcode
    */
    getColorByAdcode(adcode) {
      if (!this.colors[adcode]) {
        var gb = Math.random() * 155 + 50
        this.colors[adcode] = 'rgba(' + gb + ',' + gb + ',255, 0.5)'
      }
      // 返回行政区的填充颜色
      return this.colors[adcode]
    }

3.补充

因为vue独特的加载方式,再加之新手对于高德地图api和AMapJS的不熟悉,结合我个人的使用经验,这里我再整理一下。

下边的内容请结合上文阅读。

3.1 基础 js api 的加载

  • 基础配置
// 创建 AMapJSAPI loader
      this.amapLoader = new AMapJS.AMapLoader({
      // 高德地图的key
        key: 'your key',
        version: '1.4.15',
        plugins: []
      })
  • 加载基础的 js api
    个人理解,这里的代码和上面的代码一块,相当于原生中的
    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
		await this.amapLoader.load()
  • 保存 AMap
    这个地方的意思,相当于是从加载过来的 js api 解析出来AMap
		const { AMap } = this.amapLoader
		// 使用data 中的 AMap 保存,全局使用
		this.AMap = AMap
  • 创建并配置地图
// 构建地图容器
        this.map = new this.AMap.Map('map', {
          zoom: 9,
          center: [112, 33.1],
          // 设置地图样式(比较具有简约美的风格)
          mapStyle: 'amap://styles/fresh'
        })

3.2 UI加载

  • 基础配置
// 创建AMapUI Loader
      this.amapuiLoader = new AMapJS.AMapUILoader({
        version: '1.1'
      })
  • 加载UI
    个人理解,这里的代码和上面的代码一块,相当于原生加载UI组件库
    <script src="//webapi.amap.com/ui/1.1/main.js"></script>
		await this.amapuiLoader.load()
  • 获取并保存基础控件
    大大的注意: 这里一定要用一个 [ ] 将返回的UI控件包一下,才能成功。
    其他UI控件也是如此,尽管我不知道为何如此,但一定要相信我(尝试了无数次的结果)
		// UI控件加载
        const [BasicControl] = await this.amapuiLoader.loadUI([
          'control/BasicControl'
        ])
        // 保存到 data,全局使用
        this.BasicControl = BasicControl
  • 创建控件实例
    这里就不解释了
this.bz = new this.BasicControl.Zoom({
          position: {
            top: this.ctrlTop + 'px',
            right: this.ctrlRight
          }
        })
  • 控件挂载到地图
    有了这一步,UI 才能到我们的地图上
// 缩放控件挂到地图上
      this.map.addControl(this.bz)

3.3 插件加载

  • 加载插件
    这句话相当于原生中加载插件
		await this.amapLoader.loadPlugin(['AMap.DistrictLayer'])
  • 构造插件实例
// 绘制行政区的函数
    disProvince() {
      return new this.AMap.DistrictLayer.Province({...})
      }
  • 挂载到地图
this.map.add(this.disProvince())

到此,高德中最常用的三个地方已经介绍的非常详细了。

4.结语

不得已必须要使用高德地图做这个项目,自己因此也不得已必须要去研究它,前前后后在地图加载上都搞了很多天,也查阅了太多的网络资料,自己精神几度濒临崩溃,幸运的是,在自己的不懈摸索下终于成功实现了自己的需求。

为了各位能够更快的在vue项目中使用高德地图,也为了记录,因此,十分认真的写下了这篇博客。

个人以为,这篇文章可以说是全 csdn 中介绍 vue 使用 高德地图最详细的文章了,尽管疏漏颇多,但是经历了实践的磨练,可以拿去一试了!

非常感谢您的阅读,求赞!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue项目中引入高德地图 的相关文章

  • 在上传之前预览图像 VUEjs [重复]

    这个问题在这里已经有答案了 我知道这个问题已经被问过 但我不知道如何在vuejs中使用代码 我尝试了很多但没有任何结果 我还添加了我的代码 有人可以帮帮我吗 这是我的代码 谢谢 html
  • 以下文档我无法创建 Vue.js 3 的实例

    The code https stackblitz com edit vue ttt file src main js https stackblitz com edit vue ttt file src main js 问题 我正在尝试在
  • 如何封装Vuejs项目中的常用功能?最佳实践

    我正在开发一个使用 Vuejs 作为前端的中型项目 我正在探索的封装 分离可能在许多组件中使用的常用方法的选项包括 mixins 方法和插件方法 混合方法我必须在每个要使用 mixin 方法的组件 文件 中编写一条 import 语句 由于
  • vuejs中如何获取组件编译后的html内容

    我有一个这样的组件
  • nuxt.js - 如何在服务器端为所有客户端缓存 axios 调用

    我正在使用 vue nuxt js 应用程序 我想知道是否可以为所有客户端缓存 axios webservice 调用 我必须获取一些货币参考数据 而每个客户都必须调用这些数据并没有多大意义 有人可以给我一些提示 甚至是一个例子吗 谢谢 这
  • 使用 jquery-chosen 插件更新 vuejs 模型值

    尝试使用jquery 选择 http harvesthq github io chosen 使用 vue 问题是这个插件隐藏了我应用的实际选择v model 所以当我选择一个值时 vue 不会将其识别为选择更改事件 并且模型值不会更新 当我
  • Vue Router - 使用 Vue 2 Composition API 获取路由参数

    我正在使用Vue 2 组合 API https github com vuejs composition api并想从我的 Vue Router 访问路由参数setup method 如中所述Vue 路由器文档 https next rou
  • 为网格注入浏览器前缀不适用于 Vue

    我已经在这件事上浪费了一个下午的时间了 我被难住了 我发现IE11不支持grid template我需要使用 ms grid columns and ms grid rows相反 我正在尝试生成一些 CSS 并通过 Vue 方法注入它 这适
  • 如何突出显示 Vuetify 菜单中的所选项目?

    我的侧边栏中有一个菜单 使用 vue router
  • 是否可以限制用户登录 Firebase 应用的设备数量?

    语境 我正在帮助使用 Vue 更新 Cordova 应用程序 以从基于订阅的收入 用户必须付费才能访问该应用程序 转变为基于广告的收入 用户可以免费注册 但将拥有他们在使用应用程序时显示的广告 我们想要做的一部分是限制用户可以拥有帐户的设备
  • 如何在Vuejs中动态管理页面标题?

    我构建一个应用程序 我有一个带有页面标题的标题 目前 我使用视图路由器来定义我的标题 path events name events component Events meta title Liste des v nements 在我的刀片
  • Vue.js 动态图像路径未加载

    我试图在单个文件组件中动态加载图像 但收到错误消息 指出无法找到该模块 我想我正在尝试做同样的事情这个帖子 https stackoverflow com questions 40491506 vue js dynamic images n
  • 如何从 vue 组件调用 App.vue 中的方法

    我有一个 vue 组件和一个 vue 元素声明 如下所示 Vue component todo item template li This is a todo li methods test function I am getting an
  • node.js、vue.js 和express.js 堆栈开发

    我正在尝试使用 Linux 上的 Visual Studio Code IDE 使用 vue js express js 和 node js 创建一个 Web 应用程序 根据网上的一些文档 我读到安装 vue js 后 可以创建一个vue
  • 模拟安装挂钩 Jest 测试装置

    我正在对组件进行一些单元测试 但是 在某些组件中 我有一些东西在运行mounted使我的测试失败的钩子 我设法模拟了我不需要的方法 但是 我想知道是否有一种解决方法可以模拟mounted钩住自己 components attendeesLi
  • Web 扩展中共享 vuex 状态(死对象问题)

    我正在尝试在网络扩展中使用共享的 vue js 状态 状态存储在后台脚本的 DOM 中并呈现在弹出页面中 第一次尝试 我的第一次尝试是使用一个没有 vuex 的简单商店 背景 js var store count 0 popup js br
  • 如何在 Atom 中启用 .vue 文件的语法突出显示?

    我开始使用 Vue js 我遇到的第一个问题是我的 IDE Atom 无法美化我的 vue 文件 这一切都只是白色的文字 如何让 Atom 正确突出显示 vue 文件 语言 vue https atom io packages langua
  • Nuxt.js 多个资源的根路由和根级 slugs

    我正在使用 Nuxt 构建一个电子商务前端 我希望为尽可能多的资源提供根级 slugs 最重要的是目录路径和产品 URL 一个明显的方法是使用 Nuxt 文件结构进行路由创建 com category men Tshirt com cate
  • 不使用Vue可以使用Vuex吗? (Vuex 服务器端?)

    Vuex 抱怨如果不调用 Vue use Vuex 就无法创建新的 store 实例 虽然这通常没问题 但我正在摆弄使用同一商店编写后端 前端的想法 有人知道答案吗 Thanks TL DR 你可以在 Node 中完美使用 Vuex 无需浏
  • 在 Vue.js 中隐藏 div onclick

    以下 jQuery 的 Vue js 等价物是什么 btn click function hideMe hide jQuery 开箱即用 而 Vue js 则不然 要初始化 Vue js 组件或应用程序 您必须将该组件及其数据绑定到模板内的

随机推荐

  • 学习Kali渗透测试笔记

    Kali渗透测试 一 什么是渗透测试 1 软件测试 2 安全测试与渗透测试 3 渗透测试 二 渗透测试的目标 1 网络硬件设备 2 主机操作系统 3 应用系统 4 数据库系统 三 渗透测试的意义 四 渗透测试的方法分类 1 按照信息掌握程度
  • LiteOrm "cannot be instantiated"

    错误提示 java lang Class
  • 【深度强化学习】(5) DDPG 模型解析,附Pytorch完整代码

    大家好 今天和各位分享一下深度确定性策略梯度算法 Deterministic Policy Gradient DDPG 并基于 OpenAI 的 gym 环境完成一个小游戏 完整代码在我的 GitHub 中获得 https github c
  • 网络管理服务器篇之Apache

    一 软件简介 1 Apache是最流行的Web服务器端软件之一 快速 可靠 可通过简单的API扩展 Perl Python解释器可被编译到服务器中 完全免费 完全源代码开放 如果你需要创建一个每天有数百万人访问的Web服务器 Apache可
  • 【文件上传绕过】五、文件后缀大小写绕过

    文章目录 一 黑名单 二 源码 三 大小写绕过 一 黑名单 本pass禁止上传 php php5 php4 php3 php2 php1 html htm phtml pHp pHp5 pHp4 pHp3 pHp2 pHp1 Html Ht
  • String类详解

    目录 一 创建字符串的四种方式 1 直接赋值 2 通过构造方法创建对象 3 通过字符数组创建对象 4 通过String类的静态方法valueOf 任意数据类型 gt 转为字符串 二 字符串比较相等 equals方法 equalsIgnore
  • ICMP协议Ping方法的Python实现解析

    ICMP协议Ping方法的Python实现解析 说明 本代码适合Windows 没有在其他系统下进行测试 参考对象为https github com samuel python ping 流程 选择目标网址 解析对方ip地址 构造数据报 添
  • KVM 虚拟机的热迁移

    热迁移 顾名思义在虚拟机不关机的情况下将KVM虚拟机进行迁移 准备工作 两台KVM虚拟机 一台nfs虚拟机 centos7 4系统 主机 IP地址 主机名 KVM01 10 00 11 kvm01 KVM02 10 0 0 12 kvm02
  • SSM简单项目

    暑假项目实训花了2个星期做的项目 前台完成了大部分 后台做了一点点 其中主要运用了ssm框架技术 layui前端技术 拦截器 阿里云支付宝接口 阿里云短信验证接口 layui轮播图 流加载 分页 表单 表格等技术 访问网站 http www
  • 明智而审慎地使用多重继承——条款40

    当多重继承 multiple inheritance MI 进入设计景框 程序有可能从一个以上的base classes继承相同名称 如函数 typedef等等 那会导致较多的歧义机会 例如 class BorrowableItem 图书馆
  • 《unix环境高级编程》--- 进程环境

    终止码 main中返回一个整型值与用该值调用exit是等价的 include
  • jemalloc C++实践

    jemalloc是一种通用的malloc 3 实现 优点是避免内存碎片和可伸缩并发支持 下载源码 wget https github com jemalloc jemalloc releases download 5 2 1 jemallo
  • IA-YOLO项目中DIP模块的初级解读

    IA YOLO项目源自论文Image Adaptive YOLO for Object Detection in Adverse Weather Conditions 其提出端到端方式联合学习CNN PP和YOLOv3 这确保了CNN PP
  • mysql篇---windows环境

    1 windows环境下的mysql忘记密码了会很麻烦 试了好多种攻略都不行 只得重装 所以安装好后 要找个记事本写root密码 2 如果重装的话 直接到mysql官网 下载最新版 https dev mysql com downloads
  • 区块链:如何学习区块链技术?

    To strive to seek to find and not to yield 奋斗 探索 寻求 永不屈服 1 中本聪的关于比特币的白皮书 英文原版 Bitcoin A Peer to Peer Electronic Cash Sys
  • c++用vector先按学生的年级排序,再按学生的分数排序算法

    VectorSort cpp 定义控制台应用程序的入口点 include stdafx h include stdio h include string h include
  • PDF各种编辑方法(页码重排、解密、导入书签、导入注释、合并)

    目录 一 PDF重排页码 二 PDF解密 三 PDF导入和导出书签 四 PDF导入和导出注释 五 PDF合并 一 PDF重排页码 操作流程 如下图所示 打开 福昕高级PDF编辑器 gt 打开待处理的PDF文件 gt 点击软件界面左侧第二个图
  • js循环数组实现模糊匹配

  • Linux 下rm删除命令提示 /bin/rm: argument list too long的解决办法

    假设我们要删除文件夹test test下有很多文件 如果我们使用rm test 命令进行删除 则会出现 bin rm argument list too long无法删除的报错提示 报错提示原因 文件夹下的文件数目过多 命令行过长所致 解决
  • vue项目中引入高德地图

    近期在用vue做一个环保类的项目 要求使用高德地图 原生js api官方案例比较多 对于新手友好 但是在vue项目中加载是一个难以解决的问题 而专门为vue使用高德地图诞生的 vue AMap 组件听起来很美好 但由于需要学习高德原生语法和