vue2+高德地图web端开发(一)(个人整理的笔记)

前言

在此声明本文章是本人学习整理的笔记,偶然间看到B站的视频,已获得原创作者简明编程的同意

准备工作 

成为开发者并创建 key

高德api网址:https://lbs.amap.com

具体可看官方文档:https://lbs.amap.com/api/javascript-api-v2/prerequisites

npm 引入高德 

安装使用 Loader

npm i @amap/amap-jsapi-loader --save 

新建组件:

 编写基础结构

<template>
    <div id="container"></div>
  </template>
  
  <script>
  export default {
  
  }
  </script>
  
  <style scoped>
  #container {
    padding: 0px;
    margin: 0px;
    width: 100%;
    height: 100%;
    position:absolute
  }
  </style>

注意:这里的地图盒子的样式一定要加上position:absolute

 一开始不知道,地图一直不显示出来,经过多方查阅才知道。

相对定位(relative),绝对定位(absolute),固定定位(fixed)_position:absolute-CSDN博客

 引入AMapLoader

import AMapLoader from '@amap/amap-jsapi-loader'
    window._AMapSecurityConfig = {
  		securityJsCode: '你的安全密钥'
    }

初始化地图

methods:{
    initMap(){
        AMapLoader.load({
            key:"",             // 申请好的Web端开发者Key,首次调用 load 时必填
            version:"2.0",      // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
            plugins:[''],       // 需要使用的的插件列表,如比例尺'AMap.Scale'等
        }).then((AMap)=>{
            const map = new AMap.Map("container",{  //设置地图容器id
                viewMode:"3D",    //是否为3D地图模式
                zoom:5,           //初始化地图级别
                center:[105.602725,37.076636], //初始化地图中心点位置
            });
        }).catch(e=>{
            console.log(e);
        })
    },
},

 调用方法对页面进行渲染

mounted() {
    //DOM初始化完成进行地图初始化
    this.initMap()
}

 导入使用组件

<template>
  <div>
      <MapView />
  </div>
</template>

<script>
import MapView from "./components/MapView.vue";
export default {
components: {MapView}
}
</script>

<style>
</style>

效果展示:

导入控件

有三种导入地图控件间的方法:(this的用法以及在普通函数和箭头函数的指向相关知识)

一种是官方推荐的异步加载方式:

<template>
  <div id="container"></div>
</template>

<script>
import AMapLoader from "@amap/amap-jsapi-loader";
window._AMapSecurityConfig = {
  securityJsCode: "6c59a952bf5373b78b97c3152618998c",
};
export default {
  data() {
    
  },
  methods: {
    initMap() {
      AMapLoader.load({
        key: "5b243c91635abec127c6b8c2c80ca2d2", // 申请好的Web端开发者Key,首次调用 load 时必填
        version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
       
      }).then((AMap) => {
        const map = new AMap.Map("container", {
          //设置地图容器id
          viewMode: "3D", //是否为3D地图模式
          zoom: 10, //初始化地图级别
          center: [121.473667, 31.230525], //初始化地图中心点位置
        })
        // 异步加载多个组件
        map.plugin(
          ["AMap.ToolBar", "AMap.Scale", "AMap.ControlBar", 'AMap.HawkEye',"AMap.MapType"],
          function(){
            // 添加比例尺控件
            map.addControl(new AMap.Scale());

            // 添加工具栏控件
            map.addControl(new AMap.ToolBar());

            // 添加地图类型切换控件
            map.addControl(new AMap.MapType());
            
            map.addControl(new AMap.HawkEye());

            map.addControl(new AMap.ControlBar())

            // 其他地图初始化代码...
          })
          }
        ).catch((e) => {
          console.log(e);
        
      })
    },
  },
  mounted() {
    //DOM初始化完成进行地图初始化
    this.initMap();
  },
};
</script>

<style scoped>
#container {
  padding: 0px;
  margin: 0px;
  width: 100%;
  height: 100%;
  position: absolute;
}
</style>

 第二种是箭头函数:

<template>
  <div id="container"></div>
</template>

<script>
import AMapLoader from "@amap/amap-jsapi-loader";
window._AMapSecurityConfig = {
  securityJsCode: "6c59a952bf5373b78b97c3152618998c",
};
export default {
  data() {
    return{
      map:null
    }
  },
  methods: {
    initMap() {
      AMapLoader.load({
        key: "5b243c91635abec127c6b8c2c80ca2d2", // 申请好的Web端开发者Key,首次调用 load 时必填
        version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
       
      }).then((AMap) => {
        this.map = new AMap.Map("container", {
          //设置地图容器id
          viewMode: "3D", //是否为3D地图模式
          zoom: 10, //初始化地图级别
          center: [121.473667, 31.230525], //初始化地图中心点位置
        })
        // 异步加载多个组件
        AMap.plugin(
          ["AMap.ToolBar", "AMap.Scale", "AMap.ControlBar", 'AMap.HawkEye',"AMap.MapType"],
          ()=>{
            // 添加比例尺控件
            this.map.addControl(new AMap.Scale());

            // 添加工具栏控件
            this.map.addControl(new AMap.ToolBar());

            // 添加地图类型切换控件
            this.map.addControl(new AMap.MapType());

            this.map.addControl(new AMap.HawkEye());

            this.map.addControl(new AMap.ControlBar())

            // 其他地图初始化代码...
          })
          }
        ).catch((e) => {
          console.log(e);
        
      })
    },
  },
  mounted() {
    //DOM初始化完成进行地图初始化
    this.initMap();
  },
};
</script>

<style scoped>
#container {
  padding: 0px;
  margin: 0px;
  width: 100%;
  height: 100%;
  position: absolute;
}
</style>

注意:

一开始是这么写是错误的:

  const map = new AMap.Map("container", {
          //设置地图容器id
          viewMode: "3D", //是否为3D地图模式
          zoom: 10, //初始化地图级别
          center: [121.473667, 31.230525], //初始化地图中心点位置
        });
        // 异步加载多个组件
        AMap.plugin(
          ["AMap.ToolBar", "AMap.Scale", "AMap.OverView"],
          function () {
            // 添加比例尺控件
            map.addControl(new AMap.Scale());

            // 添加工具栏控件
            map.addControl(new AMap.ToolBar());

            // 添加鹰眼图控件
            // 注意:AMap.HawkEye 控件在新版高德地图API中可能已经被移除或更名,你可能需要查找替代方案
            // 如果存在,可以这样添加:
            // this.map.addControl(new AMap.HawkEye());

            // 添加地图类型切换控件
            map.addControl(new AMap.MapType());

            // 添加地理定位控件
            map.addControl(new AMap.Geolocation());

            // 其他地图初始化代码...
          }
        )

在异步加载插件的回调中,我们需要确保回调函数的上下文(this)正确指向Vue实例,因为在JavaScript中,函数的上下文(也就是this的值)是由该函数在哪里被调用决定的,而不是在哪里被定义。在普通的函数调用中,this通常指向全局对象(在浏览器中是window)。然而,在Vue的方法中,this应该指向Vue实例。

在你的代码中,AMap.plugin方法的回调函数是一个普通函数,而不是箭头函数。普通函数有自己的this上下文,它不会被外部作用域中的this值所影响。因此,如果你直接在Vue的方法中使用普通函数作为回调函数,那么在该回调函数中,this将不会指向Vue实例,而是指向全局对象(在浏览器中是window)。

为了解决这个问题,你可以使用箭头函数作为回调函数。箭头函数不会创建它自己的this上下文,它会捕获其所在上下文的this值作为自己的this值。因此,在箭头函数中,this将指向Vue实例,就像在其他Vue方法中一样。

以下是代码示例:

AMap.plugin( 
["AMap.ToolBar", "AMap.Scale", "AMap.OverView"], 
(AMap) => { // 使用箭头函数作为回调函数 
// 添加比例尺控件 
map.addControl(new AMap.Scale()); 


// 添加工具栏控件 
map.addControl(new AMap.ToolBar()); 


// 添加地图类型切换控件 
map.addControl(new AMap.MapType()); 


// 添加地理定位控件 
map.addControl(new AMap.Geolocation()); 


// 其他地图初始化代码... 
} 
).catch((e) => { 
console.log(e); 
});

在这个修改后的示例中,箭头函数(AMap) => {...}作为AMap.plugin的回调函数,它将捕获并保留外部作用域中的this值(即Vue实例),因此在回调函数中你可以正常访问Vue实例的方法和数据。

这样做可以确保在回调函数中正确访问Vue实例,从而能够正确地调用Vue实例中的方法和访问其数据属性。

 那能否写成下面的两种呢

 this.map = new AMap.Map("container", {
          //设置地图容器id
          viewMode: "3D", //是否为3D地图模式
          zoom: 10, //初始化地图级别
          center: [121.473667, 31.230525], //初始化地图中心点位置
        })
        // 异步加载多个组件
        this.map.plugin(
          ["AMap.ToolBar", "AMap.Scale", "AMap.ControlBar", 'AMap.HawkEye',"AMap.MapType"],
          ()=>{
            // 添加比例尺控件
            this.map.addControl(new AMap.Scale());

            // 添加工具栏控件
            this.map.addControl(new AMap.ToolBar());

            // 添加地图类型切换控件
            this.map.addControl(new AMap.MapType());

            this.map.addControl(new AMap.HawkEye());

            this.map.addControl(new AMap.ControlBar())

            // 其他地图初始化代码...
          })
          }
        )
const map = new AMap.Map("container", {
          //设置地图容器id
          viewMode: "3D", //是否为3D地图模式
          zoom: 10, //初始化地图级别
          center: [121.473667, 31.230525], //初始化地图中心点位置
        })
        // 异步加载多个组件
        AMap.plugin(
          ["AMap.ToolBar", "AMap.Scale", "AMap.ControlBar", 'AMap.HawkEye',"AMap.MapType"],
          function(){
            // 添加比例尺控件
            map.addControl(new AMap.Scale());

            // 添加工具栏控件
            map.addControl(new AMap.ToolBar());

            // 添加地图类型切换控件
            map.addControl(new AMap.MapType());

            map.addControl(new AMap.HawkEye());

            map.addControl(new AMap.ControlBar())

            // 其他地图初始化代码...
          })
          }
        )

当然是可以的

还有第三种方法——在loader的plugins中进行引入:

<template>
  <div id="container"></div>
</template>

<script>
import AMapLoader from "@amap/amap-jsapi-loader";
window._AMapSecurityConfig = {
  securityJsCode: "6c59a952bf5373b78b97c3152618998c",
};
export default {
  data() {
    return{
      map:null
    }
  },
  methods: {
    initMap() {
      AMapLoader.load({
        key: "5b243c91635abec127c6b8c2c80ca2d2", // 申请好的Web端开发者Key,首次调用 load 时必填
        version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        plugins:["AMap.ToolBar", "AMap.Scale", "AMap.ControlBar", 'AMap.HawkEye',"AMap.MapType"]
      }).then((AMap) => {
        const map = new AMap.Map("container", {
          //设置地图容器id
          viewMode: "3D", //是否为3D地图模式
          zoom: 10, //初始化地图级别
          center: [121.473667, 31.230525], //初始化地图中心点位置
        })    
            // 添加比例尺控件
            map.addControl(new AMap.Scale());

            // 添加工具栏控件
            map.addControl(new AMap.ToolBar());

            // 添加地图类型切换控件
            map.addControl(new AMap.MapType());

            map.addControl(new AMap.HawkEye());

            map.addControl(new AMap.ControlBar())

            // 其他地图初始化代码...
        
      }).catch((e) => {
          console.log(e);
        
      })
    },
  },
  mounted() {
    //DOM初始化完成进行地图初始化
    this.initMap();
  },
};
</script>

<style scoped>
#container {
  padding: 0px;
  margin: 0px;
  width: 100%;
  height: 100%;
  position: absolute;
}
</style>

异步加载的主要用处是提高网页的加载速度和用户体验。具体来说,异步加载有以下几个优点:

  1. 非阻塞性:与同步加载相比,异步加载不会阻止浏览器的后续处理与解析。这意味着当浏览器加载某个组件(如 JavaScript 文件或 API)时,它不会停止渲染页面或执行其他脚本。这可以显著提高页面的加载速度,因为浏览器可以同时处理多个任务。
  2. 减少依赖:异步加载允许你在其他脚本执行之前或之后加载特定的 JavaScript 文件或 API。这可以减少脚本之间的依赖关系,使得代码更加模块化和可维护。
  3. 按需加载:异步加载可以根据需要动态地加载 JavaScript 文件或 API。这意味着你可以只在需要时才加载特定的功能或组件,从而减少不必要的网络请求和资源浪费。
  4. 更好的用户体验:由于异步加载可以减少页面加载时间并避免阻塞,因此它可以提供更好的用户体验。用户可以更快地看到和交互页面内容,而不会因为等待某个组件加载而感到烦恼。

在开发实践中,异步加载通常用于加载大型 JavaScript 库、第三方 API、广告脚本等。通过使用异步加载技术,你可以优化网页的性能并提升用户的满意度。

效果展示

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值