准备工作
注册账号并申请高德Key
-
首先,注册开发者账号,成为高德开放平台开发者
-
登录之后,再进入「应用管理」 页面「创建新应用」
-
为应用添加 Key,「服务平台」一项请选择「 Web 端 ( JSAPI ) 」,设置域名白名单,可选(建议设置域名白名单)。
- 添加成功后,可获取到key值和安全密钥jscode ( 自2021年12月02日升级,升级之后所申请的 key 必须配备安全密钥 jscode 一起使用)
注意:此次升级不会影响之前已获得 key 的使用;升级之后的新增的key必须要配备安全密钥一起使用,具体用法请您参看下文《JSAPI key和安全密钥设置和使用》 (本次key升级新增安全密钥,是为了提升广大用户的对自己的key安全有效管理,降低明文传输被窃取的风险 。)
项目Html设置
JSAPI key搭配静态安全密钥以明文设置(不安全,建议开发环境用):
引入地图 JSAPI 脚本之前增加设置 JSAPI 安全密钥的脚本标签,并将您的安全密钥「您申请的安全密钥」替换为您的安全密钥;(注意这个设置必须是在 JSAPI 的脚本加载之前进行设置,否则设置无效。)
<script type="text/javascript">
window._AMapSecurityConfig = {
securityJsCode:'您申请的安全密钥',
}
</script>
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
引入npm
映入高德地图的npm包
npm i @amap/amap-jsapi-loader --save
正式搭建
template
添加div标签作为地图容器,同时为该div指定id属性; 地图id为"container"
添加div标签作为路径提示容器,同时为该div指定id属性; 提示id为"panel"
<div class="map">
<div id="container" />
<div id="panel" />
</div>
初始化地图
首先我们先进行地图的初始化,将申请好的Web端开发者Key,版本号和你所需要的plugins进行地图的注册,返回来的结果AMap就可以进行挂载到我们div上了,然后再进行路径查询方法,将查到的路径在地图上显示,并且在panel上展示出来详细的路口
//进行地图初始化
function initMap() {
AMapLoader.load({
key: "申请好的Web端开发者Key", // 申请好的Web端开发者Key,首次调用 load 时必填
plugins: ["AMap.AutoComplete", "AMap.PlaceSearch", "AMap.Driving", "AMap.DragRoute"],
version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
Loca: {
version: "2.0.0"
}
})
.then((AMap) => {
const map = new AMap.Map("container", {
//设置地图容器id
plugins: ["AMap.AutoComplete", "AMap.PlaceSearch", "AMap.Driving", "AMap.DragRoute"],
center: [113.08982, 28.32427], //地图中心点
zoom: 10 //地图显示的缩放级别
})
// 路径查询方法
const goView = () => {
// eslint-disable-next-line no-undef
const driving = new AMap.Driving({
map: map,
// 驾车路线规划策略,AMap.DrivingPolicy.LEAST_TIME是最快捷模式
policy: AMap.DrivingPolicy.LEAST_TIME,
// panel 指定将结构化的路线详情数据显示的对应的DOM上,传入值需是DOM的ID
panel: "panel"
})
// 根据起终点经纬度或者模糊地址规划驾车导航路线
driving.search(
[
{ keyword: props.startName, city: "长沙" },
{ keyword: props.endName, city: "长沙" }
],
function (status: any, result: any) {
// result 即是对应的驾车导航信息,相关数据结构文档请参考 https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingResult
if (status === "complete") {
console.log("绘制驾车路线完成", result)
} else {
console.log("获取驾车数据失败:" + result)
}
}
)
}
goView() // 获取线路规划
})
.catch((e) => {
console.log(e)
})
}
展示图
完整代码
我这里是用的element-plus的dialog来展示,起始地和终点都是来自父组件的props
<script lang="ts" setup>
import { ref } from "vue"
import AMapLoader from "@amap/amap-jsapi-loader"
const props = defineProps(["startName", "endName"])
console.log(props)
//进行地图初始化
function initMap() {
AMapLoader.load({
key: "申请好的Web端开发者Key", // 申请好的Web端开发者Key,首次调用 load 时必填
plugins: ["AMap.AutoComplete", "AMap.PlaceSearch", "AMap.Driving", "AMap.DragRoute"],
version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
Loca: {
version: "2.0.0"
}
})
.then((AMap) => {
const map = new AMap.Map("container", {
//设置地图容器id
plugins: ["AMap.AutoComplete", "AMap.PlaceSearch", "AMap.Driving", "AMap.DragRoute"],
center: [113.08982, 28.32427], //地图中心点
zoom: 10 //地图显示的缩放级别
})
const goView = () => {
// eslint-disable-next-line no-undef
const driving = new AMap.Driving({
map: map,
// 驾车路线规划策略,AMap.DrivingPolicy.LEAST_TIME是最快捷模式
policy: AMap.DrivingPolicy.LEAST_TIME,
// panel 指定将结构化的路线详情数据显示的对应的DOM上,传入值需是DOM的ID
panel: "panel"
})
// 根据起终点经纬度规划驾车导航路线
driving.search(
[
{ keyword: props.startName, city: "长沙" },
{ keyword: props.endName, city: "长沙" }
],
function (status: any, result: any) {
// result 即是对应的驾车导航信息,相关数据结构文档请参考 https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingResult
if (status === "complete") {
console.log("绘制驾车路线完成", result)
} else {
console.log("获取驾车数据失败:" + result)
}
}
)
}
goView() // 获取线路规划
})
.catch((e) => {
console.log(e)
})
}
initMap()
const dialogTableVisible = ref(false)
const changeDialog = () => {
dialogTableVisible.value = !dialogTableVisible.value
}
//暴露方法
defineExpose({
changeDialog,
initMap
})
</script>
<template>
<el-dialog v-model="dialogTableVisible" title="配送路径" width="1000px">
<div class="map">
<div id="container" />
<div id="panel" />
</div>
</el-dialog>
</template>
<style scoped lang="scss">
.map {
width: 100%;
height: 600px;
background-color: #fff;
position: relative;
#container {
padding: 0px;
margin: 0px;
width: 100%;
height: 100%;
}
#panel {
position: absolute;
top: 0;
width: 300px;
height: 400px;
overflow-y: scroll;
opacity: 0.8;
border-radius: 4px;
&::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
}
}
</style>