• 在 vue3 中使用高德地图


    前言:定位地图位置所需要的经纬度,可以通过 拾取坐标 获取。

    一:快速上手

    1. 安装依赖

    1. npm install @amap/amap-jsapi-loader
    2. # or
    3. pnpm add @amap/amap-jsapi-loader
    4. # or
    5. yarn add @amap/amap-jsapi-loader

    2. 创建组件 src/components/Map.vue

    1. <script setup>
    2. import { onMounted, onUnmounted } from "vue";
    3. import AMapLoader from "@amap/amap-jsapi-loader";
    4. let map = null;
    5. onMounted(() => {
    6. AMapLoader.load({
    7. key: "", // 申请好的Web端开发者Key,首次调用 load 时必填
    8. version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
    9. plugins: [], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    10. })
    11. .then((AMap) => {
    12. map = new AMap.Map("container", {
    13. // 设置地图容器id
    14. viewMode: "3D", // 是否为3D地图模式
    15. zoom: 11, // 初始化地图级别
    16. center: [116.397428, 39.90923], // 初始化地图中心点位置
    17. });
    18. })
    19. .catch((e) => {
    20. console.log(e);
    21. });
    22. });
    23. onUnmounted(() => {
    24. map?.destroy();
    25. });
    26. script>
    27. <template>
    28. <div id="container">div>
    29. template>
    30. <style scoped>
    31. #container {
    32. width: 100%;
    33. height: 800px;
    34. }
    35. style>

    3. 获取 key 值

    注册高德账号,注册成功后登录,然后 添加 key 值。复制添加后的 Key 值到组件,就可以使用了。

    二:地图配置

    参考文档 地图 JS API

    1. 展示地图

    1.1. 加载 JS API

    1. AMapLoader.load({
    2. key: "「你申请的应用key」", //申请好的Web端开发者key,调用 load 时必填
    3. version: "2.0", //指定要加载的 JS API 的版本,缺省时默认为 1.4.15
    4. })
    5. .then((AMap) => {
    6. //JS API 加载完成后获取AMap对象
    7. })
    8. .catch((e) => {
    9. console.error(e); //加载错误提示
    10. });

    1.2. 地图初始化

    1. const map = new AMap.Map("container", {
    2. viewMode: "2D", //默认使用 2D 模式
    3. zoom: 11, //地图级别
    4. center: [116.397428, 39.90923], //地图中心点
    5. });

    1.3. 主题样式

    通过在地图初始化时设置 mapStyle 修改主题样式,官方主题有 amap://styles/ 后面拼接:normal、grey、whitesmoke、dark、light、graffiti

    1. map = new AMap.Map("container", {
    2. mapStyle: "amap://styles/whitesmoke", //设置地图的显示样式
    3. });

    2. 展示图层

    2.1 创建图层

    1. const layer = new AMap.createDefaultLayer({
    2. zooms: [3, 20], //可见级别
    3. visible: true, //是否可见
    4. opacity: 1, //透明度
    5. zIndex: 0, //叠加层级
    6. });

    2.2 加载图层

    1. const map = new AMap.Map("container", {
    2. viewMode: "2D", //默认使用 2D 模式
    3. zoom: 11, //地图级别
    4. center: [116.397428, 39.90923], //地图中心点
    5. layers: [layer], //layer为创建的默认图层
    6. });

    2.3 创建实时交通路况图层

    1. const traffic = new AMap.TileLayer.Traffic({
    2. autoRefresh: true, //是否自动刷新,默认为false
    3. interval: 180, //刷新间隔,默认180s
    4. });
    5. map.add(traffic); //通过add方法添加图层

    2.4 路况图层的显示和隐藏

    1. traffic.show(); //显示路况图层
    2. traffic.hide(); //隐藏路况图层

    3. 添加地图控件

    JS API 提供了众多的控件,需要引入之后才能使用这些控件的功能。常见的地图控件有:缩放工具条 ToolBar、比例尺 Scale、定位按钮 Geolocation 等。

    3.1 引入地图控件

    1. //异步加载控件
    2. AMap.plugin("AMap.ToolBar", function () {
    3. var toolbar = new AMap.ToolBar(); //缩放工具条实例化
    4. map.addControl(toolbar);
    5. });

    3.2 控制地图控件显示/隐藏

    1. toolbar.show(); //缩放工具展示
    2. toolbar.hide(); //缩放工具隐藏

    4. 添加点标记

    点标记是地图覆盖物中非常重要的要素之一,可以用来标记地图上的某个位置。

    4.1 自定义 Marker

    自定义 Marker 内容可以是字符串拼接的 DOM 元素。可以根据 class 名去定义样式。

    1. //点标记显示内容
    2. const markerContent = `
    3. X
    4. `;
  • 4.2 创建 Marker 对象

    1. const position = new AMap.LngLat(116.397428, 39.90923); //Marker 经纬度
    2. const marker = new AMap.Marker({
    3. position: position,
    4. content: markerContent, //将 html 传给 content
    5. offset: new AMap.Pixel(-13, -30), //以 icon 的 [center bottom] 为原点
    6. });

    4.3 将 Marker 添加到地图

    map.add(marker);

    4.4 给 Marker 绑定事件

    1. function clearMarker() {
    2. map.remove(marker); //清除 marker
    3. }
    4. document.querySelector(".close-btn").onclick = clearMarker; //绑定点击事件

    5. 添加多边形

    多边形矢量图是地图覆盖物重要的地图要素之一,可以用来突出标记某个区域的形状。

    5.1 创建地图

    1. const map = new AMap.Map("container", {
    2. center: [121.045332, 31.19884], //地图中心点
    3. zoom: 8.8, //地图级别
    4. });

    5.2 创建 Polygon 对象

    AMap.Polygon 对象为用户提供在地图图面绘制多边形的能力。可以为多边形设置填充颜色 fillColor、描边颜色 strokeColor、轮廓线样式等属性。

    tips: path 是多边形轮廓线的节点坐标数组。多边形支持普通多边形,带单个孔多边形,带多个孔多边形类型绘制。

    1. 普通多边形:path = [lnglat, lnglat ...] 或 path = [[lnglat, lnglat ...]]
    2. 带单个孔多边形:path = [[lnglat, lnglat ...], [ lnglat, lnglat ...]]
    3. 带多个孔多边形:path = [[lnglat, lnglat ...], [lnglat, lnglat ... ], [lnglat, lnglat ...] ...]
    1. const pathArr = [
    2. [
    3. [
    4. [121.7789, 31.3102],
    5. [121.7279, 31.3548],
    6. [121.5723, 31.4361],
    7. [121.5093, 31.4898],
    8. [121.5624, 31.4864],
    9. [121.5856, 31.4547],
    10. [121.7694, 31.3907],
    11. [121.796, 31.3456],
    12. [121.7789, 31.3102],
    13. ],
    14. ],
    15. ];
    16. const polygon = new AMap.Polygon({
    17. path: pathArr, //多边形路径
    18. fillColor: "#ccebc5", //多边形填充颜色
    19. strokeOpacity: 1, //线条透明度
    20. fillOpacity: 0.5, //填充透明度
    21. strokeColor: "#2b8cbe", //线条颜色
    22. strokeWeight: 1, //线条宽度
    23. strokeStyle: "dashed", //线样式
    24. strokeDasharray: [5, 5], //轮廓的虚线和间隙的样式
    25. });

    5.3 给 Polygon 添加事件

    1. //鼠标移入更改样式
    2. polygon.on("mouseover", () => {
    3. polygon.setOptions({
    4. fillOpacity: 0.7, //多边形填充透明度
    5. fillColor: "#7bccc4",
    6. });
    7. });
    8. //鼠标移出恢复样式
    9. polygon.on("mouseout", () => {
    10. polygon.setOptions({
    11. fillOpacity: 0.5,
    12. fillColor: "#ccebc5",
    13. });
    14. });

    5.4 添加 Polygon 到地图

    map.add(polygon);

    6. 搜索地点

    AMap.PlaceSearch 地点搜索插件。

    6.1 创建地图

    1. const map = new AMap.Map("container", {
    2. viewMode: "2D", //默认使用 2D 模式
    3. zoom: 11, //地图级别
    4. center: [116.397428, 39.90923], //地图中心点
    5. });

    6.2 引入插件

    通过 AMap.plugin 方法按需引入插件

    1. AMap.plugin(["AMap.PlaceSearch"], function () {
    2. const placeSearch = new AMap.PlaceSearch({
    3. pageSize: 5, //单页显示结果条数
    4. pageIndex: 1, //页码
    5. city: "010", //兴趣点城市
    6. citylimit: true, //是否强制限制在设置的城市内搜索
    7. map: map, //展现结果的地图实例
    8. panel: "my-panel", //结果列表将在此容器中进行展示。
    9. autoFitView: true, //是否自动调整地图视野使绘制的 Marker 点都处于视口的可见范围
    10. });
    11. placeSearch.search("北京大学"); //使用插件搜索关键字并查看结果
    12. });

    6.3 自定义搜索结果

    如果不想使用 JS API 的结果面板,panel 可以缺省或者赋值 false,然后在 search()的回调中处理自己的逻辑,自定义搜索教程前往 输入提示与 POI 搜索。

    1. //在回调函数中使用插件功能
    2. placeSearch.search("北京大学", function (status, result) {
    3. //查询成功时,result 即对应匹配的 POI 信息
    4. });

    7. 路线规划

    AMap.Driving 驾车路线规划插件。JS API 的路线规划种类有:驾车 AMap.Driving、公交 AMap.Transfer、步行 AMap.Walking、骑乘 AMap.Riding 和货车 AMap.TruckDriving 等。

    7.1 确认规划的起点和终点信息

    1. // 使用地名确认起终点
    2. const points = [
    3. { keyword: "北京市地震局(公交站)", city: "北京" }, //起始点坐标
    4. { keyword: "亦庄文化园(地铁站)", city: "北京" }, //终点坐标
    5. ];
    6. // 使用经纬度确认起终点
    7. const startLngLat = [116.379028, 39.865042]; //起始点坐标
    8. const endLngLat = [116.427281, 39.903719]; //终点坐标

    7.2 引入和创建驾车规划插件,获取起终点规划线路

    1. // 使用地点名称规划获取规划路线
    2. // 引入和创建驾车规划插件
    3. AMap.plugin(["AMap.Driving"], function () {
    4. const driving = new AMap.Driving({
    5. map: map,
    6. panel: "my-panel",
    7. });
    8. //获取起终点规划线路
    9. driving.search(points, function (status, result) {
    10. if (status === "complete") {
    11. //status:complete 表示查询成功,no_data 为查询无结果,error 代表查询错误
    12. //查询成功时,result 即为对应的驾车导航信息
    13. console.log(result);
    14. } else {
    15. console.log("获取驾车数据失败:" + result);
    16. }
    17. });
    18. });
    19. // 使用经纬度规划获取规划路线
    20. // 引入和创建驾车规划插件
    21. AMap.plugin(["AMap.Driving"], function () {
    22. const driving = new AMap.Driving({
    23. map: map,
    24. panel: "my-panel",
    25. });
    26. //获取起终点规划线路
    27. driving.search(startLngLat, endLngLat, function (status, result) {
    28. if (status === "complete") {
    29. //status:complete 表示查询成功,no_data 为查询无结果,error 代表查询错误
    30. //查询成功时,result 即为对应的驾车导航信息
    31. console.log(result);
    32. } else {
    33. console.log("获取驾车数据失败:" + result);
    34. }
    35. });
    36. });

    8. 地图生命周期

    8.1 创建地图

    1. var map = new AMap.Map("container", {
    2. zoom: 10, //地图级别
    3. center: [116.397428, 39.90923], //地图中心点
    4. layers: [new AMap.TileLayer.Satellite()], //设置图层,可设置成包含一个或多个图层的数组
    5. mapStyle: "amap://styles/whitesmoke", //设置地图的显示样式
    6. viewMode: "2D", //设置地图模式
    7. });

    8.2 地图加载完成

    1. map.on("complete", function () {
    2. //地图图块加载完成后触发
    3. });

    8.3 地图运行阶段

    1. var map = new AMap.Map("container"); //初始化地图
    2. //在运行阶段添加点标记
    3. const marker = new AMap.Marker({
    4. position: new AMap.LngLat(116.39, 39.9),
    5. });
    6. //将创建的点标记添加到已有的地图实例:
    7. map.add(marker);
    8. //在运行阶段监听地图的点击事件
    9. const clickHandler = function (e) {
    10. console.log(
    11. "您在[ " +
    12. e.lnglat.getLng() +
    13. "," +
    14. e.lnglat.getLat() +
    15. " ]的位置点击了地图!"
    16. );
    17. };
    18. map.on("click", clickHandler);

    8.4 销毁地图对象

    1. //解绑地图的点击事件
    2. map.off("click", clickHandler);
    3. //销毁地图,并清空地图容器
    4. map.destroy();
    5. //地图对象赋值为null
    6. map = null;
    7. //清除地图容器的 DOM 元素
    8. document.getElementById("container").remove(); //"container" 为指定 DOM 元素的id

  • 相关阅读:
    Java实践-物联网loT入门-MQTT传输协议
    uniapp:如何实现点击图片可以全屏展示预览
    《Web安全基础》04. 文件操作安全
    JDK9到底为什么要将String的底层实现由char「」改成了byte「」
    Elasticsearch--Python使用、Django/Flask集成
    Java学习day01
    ApiFox 基本使用教程(浅尝辄止,非广)
    Lombok首字母小写,第二个字母大写,jackson反序列化失败
    Docker实战之Redis主从集群搭建实战
    图像处理ASIC设计方法 笔记5 图像卷积器硬件结构
  • 原文地址:https://blog.csdn.net/weixin_64684095/article/details/138125111