Vue 使用高德地图,添加点标记 + 点击地图获取坐标 + 带搜索(即地理编码 + 逆地理编码) - 附完整示例

2023-11-02

高德地图

与真实世界联通 - 高德开放平台为开发者赋能,将地图精致地呈现在您的应用中

无论基于哪种平台,都可以通过高德开放平台API和SDK,轻松地完成地图的构建工作

 官方文档:地图 | 高德地图API

地图 | 高德地图API地图,地图sdk,地图JS API,地图定制,自定义地图,地图覆盖物,地图绘制,路线规划,坐标转换,距离/面积计算,距离测量,室内地图,地图显示,地图个性化,地图开发,室内定位icon-default.png?t=N7T8https://lbs.amap.com/product/map#/

效果

一、准备工作

1、注册/登录账号

2、点击控制台

3、创建应用

4、获取key和密钥,如上图所示

注:使用web服务API,如下图所示

二、安装依赖包

1、安装命令

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

 2、这是我的版本 

"@amap/amap-jsapi-loader": "^1.0.1",

三、使用步骤

1、在index.html文件中引入密钥

代码如下(示例):

<script type="text/javascript">
    window._AMapSecurityConfig = {
      securityJsCode: '', // 你的密钥
    }
  </script>

2、在vue文件中引入依赖包

代码如下(示例):

import AMapLoader from "@amap/amap-jsapi-loader"

3、申明变量并初始化调用

代码如下(示例):


import { shallowRef, defineEmits, ref, onBeforeUnmount } from 'vue';

const map = shallowRef(null);
let AMapObj, placeSearch, marker, geocoder;

function initMap(){
  AMapLoader.load({
    key:'',  //设置您的key
    version:"2.0",
    plugins:['AMap.ToolBar','AMap.Driving'],
    AMapUI:{
      version:"1.1",
      plugins:[],

    },
    Loca:{
      version:"2.0.0"
    },
  }).then((AMap)=>{
    // console.log(AMap);
    AMapObj = AMap;
    map.value = new AMap.Map("map-box",{
      viewMode:"3D",
      zoom:10,
      zooms:[2,22],
      center: [105.602725,37.076636],
    });
    map.value.on('click', onMapClick);
    AMap.plugin(
      ['AMap.ToolBar','AMap.Scale','AMap.Geolocation','AMap.PlaceSearch',
        'AMap.Geocoder','AMap.AutoComplete'],
      () => {
        // 缩放条
        const toolbar = new AMap.ToolBar();
        // 比例尺
        const scale = new AMap.Scale();
        // 定位
        const geolocation = new AMap.Geolocation({
          enableHighAccuracy: true, //是否使用高精度定位,默认:true
          timeout: 10000, //超过10秒后停止定位,默认:5s
          position: 'RT', //定位按钮的停靠位置
          buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
          zoomToAccuracy: true, //定位成功后是否自动调整地图视野到定位点
        });
        geocoder = new AMap.Geocoder({
          city: '全国',
        });
        map.value.addControl(geolocation);
        map.value.addControl(toolbar);
        map.value.addControl(scale);
        placeSearch = new AMap.PlaceSearch({
          // map: map.value,
          city: '全国',
          pageSize: 10, // 单页显示结果条数
          pageIndex: 1, // 页码
          citylimit: false, // 是否强制限制在设置的城市内搜索
          autoFitView: true,
        });
      });
  }).catch(e=>{
    console.log(e);
  })
}

initMap();

四、完整示例

Index.html

<!DOCTYPE html>
<html lang="zh_CN" id="htmlRoot">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <meta name="renderer" content="webkit" />
  <meta name="viewport"
    content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" />

  <title>
    <%= title %>
  </title>
  <script type="text/javascript">
    window._AMapSecurityConfig = {
      securityJsCode: '', // 你的密钥
    }
  </script>
  
</head>

<body>
  <div id="app">
  </div>
</body>

</html>

Map.vue

<template>
  <div class="home">
    <div id="map-box"></div>
    <div class="info-box">
      <a-select
        v-model:value="keyword"
        show-search
        placeholder="输入关键字搜索"
        style="width: 300px"
        :default-active-first-option="false"
        :show-arrow="false"
        :filter-option="false"
        :not-found-content="null"
        @search="handleSearch"
      >
        <a-select-option v-for="item in data" :key="item.id" :value="item.id" @click="handleSelect(item)">
          <div class="d-flex flex-column">
            <span>{{item.name}}</span>
            <span style="font-size: '10px'; color: #999999">{{item.address}}</span>
          </div>
        </a-select-option>
      </a-select>
      <a-tooltip>
        <template #title v-if="coord">点击复制</template>
        <span style="margin: 5px 8px;">
          经纬度:<span class="copy" style="cursor: pointer;" :data-clipboard-text="coord">{{coord}}</span>
        </span>
      </a-tooltip>
    </div>
  </div>
</template>

<script lang="ts" setup>
import { shallowRef, ref, onBeforeUnmount } from 'vue';
import AMapLoader from "@amap/amap-jsapi-loader";
import { message } from 'ant-design-vue';
import ClipboardJS from 'clipboard';
   
const clipboard = new ClipboardJS('.copy');

clipboard.on('success', function(e) {
  console.log(e);
  console.info('Text:', e.text);
  message.info('复制成功');
  e.clearSelection();
});

clipboard.on('error', function(e) {
  if(!e.text) message.error('暂无可复制的内容')
});

onBeforeUnmount(() => {
  clipboard.destroy();
})

const map = shallowRef(null);
const keyword = ref(null);
const data = ref([]);
const coord = ref('');
let AMapObj, placeSearch, marker, geocoder;

function initMap(){
  AMapLoader.load({
    key: '',  //设置您的key
    version: "2.0",
    plugins: ['AMap.ToolBar','AMap.Driving'],
    AMapUI: {
      version: "1.1",
      plugins: [],

    },
    Loca:{
      version: "2.0.0"
    },
  }).then((AMap)=>{
    // console.log(AMap);
    AMapObj = AMap;
    map.value = new AMap.Map("map-box",{
      viewMode:"3D",
      zoom:10,
      zooms:[2,22],
      center: [105.602725,37.076636],
    });
    map.value.on('click', onMapClick);
    AMap.plugin(
      ['AMap.ToolBar','AMap.Scale','AMap.Geolocation','AMap.PlaceSearch',
        'AMap.Geocoder','AMap.AutoComplete'],
      () => {
        // 缩放条
        const toolbar = new AMap.ToolBar();
        // 比例尺
        const scale = new AMap.Scale();
        // 定位
        const geolocation = new AMap.Geolocation({
          enableHighAccuracy: true, // 是否使用高精度定位,默认:true
          timeout: 10000, // 超过10秒后停止定位,默认:5s
          position: 'RT', // 定位按钮的停靠位置
          buttonOffset: new AMap.Pixel(10, 20), // 定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
          zoomToAccuracy: true, // 定位成功后是否自动调整地图视野到定位点
        });
        geocoder = new AMap.Geocoder({
          city: '全国',
        });
        map.value.addControl(geolocation);
        map.value.addControl(toolbar);
        map.value.addControl(scale);
        placeSearch = new AMap.PlaceSearch({
          city: '全国',
          pageSize: 10, // 单页显示结果条数
          pageIndex: 1, // 页码
          citylimit: false, // 是否强制限制在设置的城市内搜索
          autoFitView: true,
        });
      });
  }).catch(e=>{
    console.log(e);
  })
}

// 搜索地图
function handleSearch(str) {
  placeSearch.search(str, (status, result) => {
    console.log(result);
    if (result && typeof result === 'object' && result.poiList) {
      const list = result.poiList.pois;
      list.forEach(item => {
        item.value = item.name;
        item.label = item.name;
      });
      data.value = list
    }
  });
}
// 点击地图
function onMapClick(e) {
  coord.value = e.lnglat.lng + ',' + e.lnglat.lat
  geocoder.getAddress([e.lnglat.lng, e.lnglat.lat], function(status, result) {
    if (status === 'complete' && result.info === 'OK') {
      // result为对应的地理位置详细信息
      keyword.value = result.regeocode.formattedAddress
    }
  })
  drawMarker(e.lnglat)
}
// 点击搜索项
function handleSelect(item) {
  console.log(item);
  drawMarker(item.location)
  if (item.location != null) {
    coord.value = item.location.lng + ',' + item.location.lat
  }
}
// 绘制地点marker
function drawMarker(location) {
  if (location == null) return
  let longitude = location.lng, latitude = location.lat
  if (marker) {
    marker.setMap(null);
  }
  marker = new AMapObj.Marker({
    position: new AMapObj.LngLat(longitude, latitude),
    anchor: 'bottom-center',
  });
  marker.on('click', () => {
    coord.value = location;
  })
  map.value.add(marker);
  map.value.setZoomAndCenter(16, [longitude, latitude]);
}

initMap();

</script>

<style lang="less" scoped>
.home{
  height: 500px;
  width: 100%;
  padding: 0px;
  margin: 0px;
  position: relative;

  .info-box {
    position: absolute;
    top: 8px;
    right: 8px;
    width: 300px;
    background-color: #1f1f1f;
    display: flex;
    flex-direction: column;
  }
}
#map-box{
  height: 100%;
  width: 100%;
  padding: 0px;
  margin: 0px;
}
</style>

<style scoped>
:deep() .amap-logo {
  display: none !important;
}
:deep() .amap-copyright {
  display: none !important;
}
</style>

注:clipboard一键复制的详细使用方法参考地址

https://mp.csdn.net/mp_blog/creation/editor/131308740

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue 使用高德地图,添加点标记 + 点击地图获取坐标 + 带搜索(即地理编码 + 逆地理编码) - 附完整示例 的相关文章

随机推荐

  • 结构体 & 枚举 在嵌入式开发中的巧妙使用

    结构体 枚举 提到结构体相信大家并不陌生 结构体顾名思义 是一种体 各种变量 的集合 方便了我们对于数据的管理和操作 在嵌入式开发中是必不可少要掌握的技能 那么我就通过举例子的方式给大家讲一下怎样使用结构体 第一种 普通式 我定义一个学生
  • Vue Test Utils

    单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 在提供了经过测试的单元的情况下 系统集成过程将会大大地简化 开发人员可以将精力集中在单元之间的交互作用和全局的功能实现上 而不是陷入充满很多Bug的单元之中不能
  • tab栏切换的实现

    Tab导航栏切换在网页场景中十分常见 本文将介绍如何用js来实现交互的导航栏 分析 1 当鼠标点击上面相应的选项卡 tab 下面盒子的内容跟随变化 2 点击某一个选项 当前这一个底色会变成红色 字体变白色 其余不变 3 下面的模块显示内容需
  • 微信小程序地理位置接口( wx.getLocation )申请方法

    在平时我们在开发小程序时 难免会需要用到用户的地理位置信息的功能 微信小程序开发者开放平台新规要求如果没有申请开通微信小程序地理位置接口 wx getLocation 是无法审核通过小程序的 我自己在开发过程中 就有遇到这样的问题 如下 你
  • Java从入门到实战总结-2.4、Java异常处理及安装IDEA

    Java从入门到实战总结 2 4 Java异常处理及安装IDEA 文章目录 Java从入门到实战总结 2 4 Java异常处理及安装IDEA 1 IDEA下载 安装及卸载 2 异常处理学习点 3 什么是异常 1 概述 2 处理异常 3 tr
  • lock_guard和unique_lock的具体实现

    lock guard和unique lock是C 中用于实现互斥操作的两种机制 lock guard使用RAII 资源获取即初始化 技术来控制锁的作用域 它只有一个lock 函数 可以获取锁 当对象销毁时 关联的锁也会被自动释放 uniqu
  • DCDC轻载与重载的区别

    许多人认为轻载就是负载小 重载就是负载大 其实不然 轻重载的判断最直接的是看输出电流的变化 如果相较于之前的额定电流 通过变化负载 使其电流变小 则说明该电路进入了轻载 反之 则是重载
  • Tomcat 如何查看端口

    1 查看tomcat进程 root longer ps aux grep tomcat 复制代码 或者 root longer ps ef grep tomcat 复制代码 2 根据进程查看端口号 root longer sudo nets
  • auto.js的学习(微信朋友圈点赞实现)

    流程实现 运行环境 auto js4 00 Beta 需要这个版本的话评论或者私聊我 1 启动无障碍服务 auto waitFor auto waitFor 检查无障碍服务是否已经启用 如果没有启用则跳转到无障碍服务启用界面 并等待无障碍服
  • SpringBoot踩坑记

    启动 WARNING Your ApplicationContext is unlikely to start due to a ComponentScan of the default package 解决 根据提示 SpringBoot
  • 《数学建模》之层次分析法

    1 层次分析法与数学建模 在数学建模中 通常解决的问题是 影响某一问题的几个因素的权重大小 产生某一问题的主要的因素分析 权重的大小分析 当然在现实生活中的应用也是十分广泛而且一样的不知不觉 最简单的就是你想去几个地方旅游 但是要综合考虑时
  • 菜鸟的数学建模之路(零):我的数学建模之路

    更新说明 更新时间 2019 9 8 最近有人问我要数学数学建模资源 由于之前我还没有整理好就没上传 现在已经上传在我的个人主页 已上传资源 那里 声明 里面的资源整理来自网络和 MATLAB数学建模方法与实践 第3版 部分来自第2版 关于
  • C#客户端Json转DataTable

    之前我们有讨论过c 是如何处理json的 在我的客户端中 需要接收服务端的数据 并且用列表展示出来 列表控件我采用的是winfrom自带的DataGridView 从服务端得到的响应是一串json字符串 为了提高效率和简洁代码 我不想采用解
  • go自动下载所有的依赖包 go module使用

    原文地址 转载请注明出处 https blog csdn net qq 34021712 article details 109146367 王赛超 今天在学习dubbo go的时候 下载了dubbo go的example 依赖的包太多了
  • 后端项目构建——Koa

    1 为什么选择Koa Koa是由Express幕后原班人马打造的 相对于Express来说 Koa的体积更小 表现力更强 而且很干净 没有任何中间件等多余的插件 整体代码也就1000多行 而且提供了一整套优雅的方法 可以愉快而快速地编写服务
  • TP5的分页模块,输出的url不带get参数

    最近朋友问我个问题 说做项目的时候发现tp5 1的分页模块 输出的url不带get参数 如果请求的链接是 http www test com crontab index index id 99 我想要加分页 分页后的链接我希望是 http
  • 黑马程序员Javaweb学习笔记03

    该博客主要记录在学习黑马程序员Javaweb过程的一些笔记 方便复习以及加强记忆 系列文章 JavaWeb学习笔记01 BS架构 Maven Tomcat Servlet JavaWeb学习笔记02 request和response Jav
  • Java Base64加密解密

    使用Apache commons codec 类Base64 maven依赖
  • 最细CentOS在线安装Redis,易上手

    redis 1 下载压缩包 wget https download redis io releases redis 5 0 14 tar gz 2 解压 tar zxvf redis 5 0 14 tar gz C usr local gt
  • Vue 使用高德地图,添加点标记 + 点击地图获取坐标 + 带搜索(即地理编码 + 逆地理编码) - 附完整示例

    高德地图 与真实世界联通 高德开放平台为开发者赋能 将地图精致地呈现在您的应用中 无论基于哪种平台 都可以通过高德开放平台API和SDK 轻松地完成地图的构建工作 官方文档 地图 高德地图API 地图 高德地图API地图 地图sdk 地图J