前言
在此声明本文章是本人学习整理的笔记,偶然间看到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>
异步加载的主要用处是提高网页的加载速度和用户体验。具体来说,异步加载有以下几个优点:
- 非阻塞性:与同步加载相比,异步加载不会阻止浏览器的后续处理与解析。这意味着当浏览器加载某个组件(如 JavaScript 文件或 API)时,它不会停止渲染页面或执行其他脚本。这可以显著提高页面的加载速度,因为浏览器可以同时处理多个任务。
- 减少依赖:异步加载允许你在其他脚本执行之前或之后加载特定的 JavaScript 文件或 API。这可以减少脚本之间的依赖关系,使得代码更加模块化和可维护。
- 按需加载:异步加载可以根据需要动态地加载 JavaScript 文件或 API。这意味着你可以只在需要时才加载特定的功能或组件,从而减少不必要的网络请求和资源浪费。
- 更好的用户体验:由于异步加载可以减少页面加载时间并避免阻塞,因此它可以提供更好的用户体验。用户可以更快地看到和交互页面内容,而不会因为等待某个组件加载而感到烦恼。
在开发实践中,异步加载通常用于加载大型 JavaScript 库、第三方 API、广告脚本等。通过使用异步加载技术,你可以优化网页的性能并提升用户的满意度。
效果展示