在 vue3 中使用高德地图

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

一:快速上手

1. 安装依赖

npm install @amap/amap-jsapi-loader
# or
pnpm add @amap/amap-jsapi-loader
# or
yarn add @amap/amap-jsapi-loader

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

<script setup>
import { onMounted, onUnmounted } from "vue";
import AMapLoader from "@amap/amap-jsapi-loader";

let map = null;

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

onUnmounted(() => {
  map?.destroy();
});
</script>

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

<style scoped>
#container {
  width: 100%;
  height: 800px;
}
</style>

3. 获取 key 值

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

二:地图配置

参考文档 地图 JS API

1. 展示地图

1.1. 加载 JS API

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

1.2. 地图初始化

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

1.3. 主题样式

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

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

2. 展示图层

2.1 创建图层

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

2.2 加载图层

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

2.3 创建实时交通路况图层

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

2.4 路况图层的显示和隐藏

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

3. 添加地图控件

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

3.1 引入地图控件

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

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

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

4. 添加点标记

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

4.1 自定义 Marker

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

//点标记显示内容
const markerContent = `<div class="custom-content-marker">
<img src="//a.amap.com/jsapi_demos/static/demo-center/icons/dir-via-marker.png">
<div class="close-btn" onclick="clearMarker()">X</div>
</div>`;

4.2 创建 Marker 对象

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

4.3 将 Marker 添加到地图

map.add(marker);

4.4 给 Marker 绑定事件

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

5. 添加多边形

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

5.1 创建地图

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

5.2 创建 Polygon 对象

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

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

普通多边形:path = [lnglat, lnglat ...] 或 path = [[lnglat, lnglat ...]]
带单个孔多边形:path = [[lnglat, lnglat ...], [ lnglat, lnglat ...]]
带多个孔多边形:path = [[lnglat, lnglat ...], [lnglat, lnglat ... ], [lnglat, lnglat ...] ...]
const pathArr = [
  [
    [
      [121.7789, 31.3102],
      [121.7279, 31.3548],
      [121.5723, 31.4361],
      [121.5093, 31.4898],
      [121.5624, 31.4864],
      [121.5856, 31.4547],
      [121.7694, 31.3907],
      [121.796, 31.3456],
      [121.7789, 31.3102],
    ],
  ],
];
const polygon = new AMap.Polygon({
  path: pathArr, //多边形路径
  fillColor: "#ccebc5", //多边形填充颜色
  strokeOpacity: 1, //线条透明度
  fillOpacity: 0.5, //填充透明度
  strokeColor: "#2b8cbe", //线条颜色
  strokeWeight: 1, //线条宽度
  strokeStyle: "dashed", //线样式
  strokeDasharray: [5, 5], //轮廓的虚线和间隙的样式
});

5.3 给 Polygon 添加事件

//鼠标移入更改样式
polygon.on("mouseover", () => {
  polygon.setOptions({
    fillOpacity: 0.7, //多边形填充透明度
    fillColor: "#7bccc4",
  });
});
//鼠标移出恢复样式
polygon.on("mouseout", () => {
  polygon.setOptions({
    fillOpacity: 0.5,
    fillColor: "#ccebc5",
  });
});

5.4 添加 Polygon 到地图

map.add(polygon);

6. 搜索地点

AMap.PlaceSearch 地点搜索插件。

6.1 创建地图

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

6.2 引入插件

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

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

6.3 自定义搜索结果

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

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

7. 路线规划

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

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

// 使用地名确认起终点
const points = [
  { keyword: "北京市地震局(公交站)", city: "北京" }, //起始点坐标
  { keyword: "亦庄文化园(地铁站)", city: "北京" }, //终点坐标
];

// 使用经纬度确认起终点
const startLngLat = [116.379028, 39.865042]; //起始点坐标
const endLngLat = [116.427281, 39.903719]; //终点坐标

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

// 使用地点名称规划获取规划路线
// 引入和创建驾车规划插件
AMap.plugin(["AMap.Driving"], function () {
  const driving = new AMap.Driving({
    map: map,
    panel: "my-panel",
  });
  //获取起终点规划线路
  driving.search(points, function (status, result) {
    if (status === "complete") {
      //status:complete 表示查询成功,no_data 为查询无结果,error 代表查询错误
      //查询成功时,result 即为对应的驾车导航信息
      console.log(result);
    } else {
      console.log("获取驾车数据失败:" + result);
    }
  });
});

// 使用经纬度规划获取规划路线
// 引入和创建驾车规划插件
AMap.plugin(["AMap.Driving"], function () {
  const driving = new AMap.Driving({
    map: map,
    panel: "my-panel",
  });
  //获取起终点规划线路
  driving.search(startLngLat, endLngLat, function (status, result) {
    if (status === "complete") {
      //status:complete 表示查询成功,no_data 为查询无结果,error 代表查询错误
      //查询成功时,result 即为对应的驾车导航信息
      console.log(result);
    } else {
      console.log("获取驾车数据失败:" + result);
    }
  });
});

8. 地图生命周期

8.1 创建地图

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

8.2 地图加载完成

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

8.3 地图运行阶段

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

8.4 销毁地图对象

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/571024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面向对象三大特征(python)

目录 1. 封装 为什么使用封装&#xff1f; 如何实现封装&#xff1f; 一个简单的封装示例 二.继承 为什么使用继承&#xff1f; 如何实现继承&#xff1f; 一个简单的继承示例 使用继承的好处 三.多态 为什么使用多态&#xff1f; 如何实现多态&#xff1f; 一个简…

面向对象介绍

1、面向对象程序设计 2、数据抽象 3、实体、对象、类之间的关系 4、从计算机的观点看对象 5、抽象 6、封装 7、继承 8、多态 9、面向对象编程方法的特性 10、面向对象编程的优缺点

IEEE PDF eXpress Validating Pdf..之后Error in converting file

在将自己写好的pdf论文转化为IEEE出版的pdf论文格式的时候&#xff0c;错误如下图&#xff1a; 解决办法如下&#xff1a;失败之后&#xff0c;那里有一个选项按钮&#xff0c;叫做manual request&#xff0c;也就是人工转换&#xff0c;点那个申请就可以了&#xff0c;然后也挺…

mathtype设置公式编号,公式居中以及编号靠右

在word中实现&#xff1a; 1. 首先点击栏&#xff0c;选择更多栏去看 看到栏的宽度&#xff0c;然后去设置样式 在开始-样式中设置,新建样式&#xff1a; 新建样式&#xff0c;然后设置格式-制表位&#xff0c;选择对齐方式&#xff0c;居中对齐设置刚才的一半&#xff0c;右…

Windows10安装配置nodejs环境

一、下载 下载地址&#xff1a;https://nodejs.cn/download/ ​ 二、安装 1、找到node-v16.17.0-x64.msi安装包, 根据默认提示安装, 过程中间的弹窗不勾选 2、安装完成后, 打开powershell(管理员身份) ​ 3、命令行输入 node -v 和 npm -v 如下图所示则nodejs安装成功 ​ 三…

【线程池总结】

文章目录 线程池介绍线程池的优点线程池的执行流程线程池池参数&#xff1a;线程池的状态常见的线程池FixedThreadPool&#xff08;有限线程数的线程池&#xff09;&#xff1a;ScheduledThreadPool&#xff08;定时线程池&#xff09;scheduleWithFixedDelaySingleThreadExecu…

synchronized的底层原理

目录 介绍 实现原理 对象头 Monitor&#xff08;监视器&#xff09; 锁升级 偏向锁 轻量级锁 重量级锁 锁的优缺点 介绍 synchronized 是 Java 中的关键字&#xff0c;它用于锁定代码块或方法&#xff0c;以确保同一时刻只有一个线程可以进入被锁定的部分。这在多线程…

企商在线亮相2024中国生成式AI大会,展出多元异构算力服务

4月18—19日&#xff0c;由知名媒体机构智东西与智猩猩共同主办的2024中国生成式AI大会在北京举行&#xff0c;55位重量级产学研投界代表同台分享。企商在线作为算力行业代表企业&#xff0c;参展生成式AI展区&#xff0c;现场展出企商在线AI算力平台及异构算力服务。 大会以“…

NodeRed节点编辑用于边缘计算和规则引擎,能做带UI界面和业务逻辑的上位机或前端应用吗?

网站&#xff1a;hhtp://www.uiotos.net 先说结论&#xff0c;可以&#xff0c;但是需要有页面嵌套继承类似的技术&#xff0c;实现页面模块化封装&#xff0c;否则难以实现复杂应用。 相信目光敏锐的人都在关注节点编辑在自身行业的应用&#xff01; NodeRed在边缘计算做数据…

四、Flask进阶

Flask-Cache pip install flask-caching安装flask_cache初始化 # ext.py from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_caching import Cachedb SQLAlchemy() migrate Migrate() cache Cache(config{CACHE_TYPE: simple # 缓存…

debian配置distcc分布式编译

前言 distcc 是一个用于在网络上的多台机器上分发 C、C、Objective C 或 Objective C 代码构建的程序。 distcc 应始终生成与本地构建相同的结果&#xff0c;易于安装和使用&#xff0c;并且通常比本地编译快得多。 distcc 不要求所有机器共享文件系统、同步时钟或安装相同的…

编写一款2D CAD/CAM软件(十四)绘制工具栏

前面的文章已经封装了数个最基本的图元&#xff0c;但是视图的呈现是基于测试数据形成的。为了尽快完善软件交互的框架和能力&#xff0c;本文将增加工具栏。 资源文件 1.首先&#xff0c;创建按钮图标。使用绘图软件构建出工具栏按钮的图标&#xff0c;绘图软件多种多样&…

使用 Rust 后,我​​使用 Python 的方式发生了变化

使用 Rust 后&#xff0c;我​​使用 Python 的方式发生了变化 Using type hints where possible, and sticking to the classic “make illegal state unrepresentable” principle. 尽可能使用类型提示&#xff0c;并坚持经典的“使非法状态不可表示”原则。 近年来&#xff…

PyTorch Conv2d 前向传递中发生了什么?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

决策大模型专题(一)

决策智能不应该停留在以前的思维中了&#xff0c;现在开一个专题来学习一下决策论坛的老师们的精彩的内容。本内容来自决策大模型论坛&#xff0c;张伟楠老师的内容整理。 决策大模型 是新一代人工智能的底层技术&#xff0c;它可以去赋能&#xff0c;智能体也就是AI agent&a…

C++进阶:map与set容器的使用

目录 1. 关联式容器map与set2. set与multiset的接口与使用2.1 set的接口与使用2.1.1 成员函数2.1.2 迭代器2.1.3 容量相关2.1.4 修改相关 2.1.5 查找&#xff0c;计数与补充2.2 multiset的接口与使用 3. map与multimap的接口与使用3.1 map的接口与使用3.1.1 map的使用补充3.1.2…

小孩子不懂事,写着玩的

目录 Web攻防 特有漏洞 ASP安全 ASPX&#xff08;.NET&#xff09;安全 PHP安全 JavaWeb安全 JS&#xff0c;Node.js安全 Java安全 Python安全 通用漏洞 SQL注入 MySQL-root高权限读写注入 PostgreSQL-高权限读写注入 MSSQL-sa高权限读写执行注入 SQL注入体系 o…

QWidget 类

QWidget 类中包括框架的属性 QWidget 类中不包括框架的属性 总结:可使用以下两种方法设置部件的位置和大小 ①、通常使用 move()设置部件的位置,使用 resize()设置部件的大小。 ②、使用 setGeometry()函数同时设置部件的位置和大小。 ③、无法为部件指定包含边框在内的大…

C语言操作符和关键字

文章目录 操作符单目操作符sizeof&#xff08;类型&#xff09;强制类型转换 关系操作符、逻辑操作符、条件操作符逗号表达式 常见关键字typedefstaticstatic修饰局部变量static修饰全局变量static修饰函数 register寄存器关键词define定义常量和宏 操作符 单目操作符 C语言中…

echarts bar图表实现多个label显示

2024.0.23今天我学习了使用bar组件&#xff0c;可以渲染多个label显示的效果&#xff0c;如&#xff1a; 当我们有一个这样的图表时&#xff0c;根据需求需要在 这上面的顶部再显示一个空置床位数占用床位数的合计总值&#xff0c;如果直接添加一个label肯定是不行&#xff0c;…