vue中PC端使用高德地图 -- 实现搜索定位、地址标记、弹窗显示定位详情

news2024/11/17 23:43:54

PC端高德地图使用步骤:

1、注册并登录高德开放平台获取
2、安装高德依赖(amap-jsapi-loader)
3、初始化地图
4、首次打开地图获取当前定位并标记
5、根据已有地址自动定位到指定地址并标记
6、新增、清除标记及自定义信息窗体
7、鼠标点击地图并选点标记
8、根据关键字搜索并自动定位
9、效果图
10、完整代码

高德官方api:高德官方开放平台

一、注册并登录高德开放平台获取(key和秘钥)
在这里插入图片描述
引用:

<script>
  import AMapLoader from '@amap/amap-jsapi-loader';
  window._AMapSecurityConfig = {
    securityJsCode: '**************************',//你的秘钥
  }
 </script>

二、安装高德依赖

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

三、初始化地图
封装公共的地图组件:

 <map-container :positionInfo ='positionInfo' @select ='getLocationInfo'></map-container>
 mounted() {
      this.initMap()
 },
 methods:{
    initMap(){
      AMapLoader.load({
        key:"**********************", // 申请好的Web端开发者Key,首次调用 load 时必填
        version:"2.0",      // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
        plugins: [          //需要使用的插件
          'AMap.ToolBar',
          'AMap.Scale',
          'AMap.Geolocation',
          'AMap.PlaceSearch',
          'AMap.AutoComplete',
          'AMap.Geocoder',
          'AMap.CitySearch'
        ],
        resizeEnable: true,
      }).then((AMap)=>{
        const that = this;
        that.map = new AMap.Map("container",{  //设置地图容器id
          viewMode:"3D",    //是否为3D地图模式
          zoom:12,          //初始化地图级别
        });
     }).catch(e=>{
      console.log(e);
     })
 },

四、首次打开地图获取当前定位并标记


initMap(){
   AMapLoader.load({
      key:"*******************", // 申请好的Web端开发者Key,首次调用 load 时必填
      version:"2.0",      // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
      plugins: [
        'AMap.ToolBar',
        'AMap.Scale',
        'AMap.Geolocation',
        'AMap.PlaceSearch',
        'AMap.AutoComplete',
        'AMap.Geocoder',
        'AMap.CitySearch'
      ],
      resizeEnable: true,
    }).then((AMap)=>{
      const that = this;
      that.map = new AMap.Map("container",{  //设置地图容器id
        viewMode:"3D",    //是否为3D地图模式
        zoom:12,          //初始化地图级别
      });
      that.getCurrentLocation();//获取当前定位
      that.geocoder = new AMap.Geocoder()
      that.map.addControl(new AMap.Scale())  // 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺
      that.map.addControl(new AMap.ToolBar())  //在图面添加鹰眼控件,在地图右下角显示地图的缩略图
    }).catch(e=>{
      console.log(e);
    })
  },
  //获取当前定位
  getCurrentLocation(){
    const that = this;
    that.geolocation = new AMap.Geolocation({
      timeout: 3000,          //超过3秒后停止定位,默认:5s
      enableHighAccuracy: true,
      zoomToAccuracy: true,   //定位成功后是否自动调整地图视野到定位点
    });
    that.geolocation.getCurrentPosition(function(status,result){
    //备注:getCurrentPosition方法会调用超时或失败:
    //Get geolocation time out:浏览器定位超时,包括原生的超时,可以适当增加超时属性的设定值以减少这一现象。
    //另外还有个别浏览器(如google Chrome浏览器等)本身的定位接口是黑洞,通过其请求定位完全没有回应,也会超时返回失败。
    //Get geolocation failed:定位失败,Chrome、火狐以及部分套壳浏览器接入的定位服务在国外,有较大限制,失败率高。
      console.log(status,result);
      if(status=='complete'){
        that.onComplete(result)
      }else{
        that.onError(result) //失败后可使用getCityInfo获取非精准定位(具体到省市)
      }
    });
  },
  //解析定位结果
  onComplete(data) {
    console.log('定位结果:' + data.position) //经纬度信息
    let lnglat = data.position;
    let marker = new AMap.Marker({  //创建标记
      position: new AMap.LngLat(lnglat[0], lnglat[1])
    })
    this.map.clearMap()// 清除所有覆盖物(点标志)
    this.map.add(marker)// 添加点标志
    let that = this
    //经纬度转换为中文地址详情
    that.geocoder.getAddress(lnglat, function (status, result) {
      if (status === 'complete' && result.regeocode) {
        that.address = result.regeocode.formattedAddress;
        that.showInfoWindow(marker);//自定义信息窗体
      } else {
        that.$message.error('根据经纬度查询地址失败')
      }
    })
  },
  //解析定位错误信息
  onError(data) {
    this.getLngLatLocation()
  },
  //在获取具体定位失败时调用的代码:(非精准定位!!!)
  getLngLatLocation() {
    const that = this;
    that.geolocation.getCityInfo(function (status, result) {
      if (status === 'complete') {
        let data = result.position
        that.address = result.province + result.city;
        that.showLocation(data)
      } else {
        that.$message.error('获取地址失败')
      }
    })
  },

五、根据已有地址自动定位到指定地址并标记

initMap(){
   AMapLoader.load({
      key:"*******************", // 申请好的Web端开发者Key,首次调用 load 时必填
      version:"2.0",      // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
      plugins: [
        'AMap.ToolBar',
        'AMap.Scale',
        'AMap.Geolocation',
        'AMap.PlaceSearch',
        'AMap.AutoComplete',
        'AMap.Geocoder',
        'AMap.CitySearch'
      ],
      resizeEnable: true,
    }).then((AMap)=>{
      const that = this;
      that.map = new AMap.Map("container",{  //设置地图容器id
        viewMode:"3D",    //是否为3D地图模式
        zoom:15,           //初始化地图级别
        center:[that.positionInfo.lng,that.positionInfo.lat];   // 首次加载地图自动加载到指定位置中心
      });
      that.showLocation(data) //新增标记并展示信息窗体
      that.map.addControl(new AMap.Scale())  // 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺
      that.map.addControl(new AMap.ToolBar())  //在图面添加鹰眼控件,在地图右下角显示地图的缩略图
    }).catch(e=>{
      console.log(e);
    })
  },

六、新增、清除标记及自定义信息窗体

//新增标记
showLocation(data){
   let marker = new AMap.Marker({
     position: new AMap.LngLat( data[0],data[1]) //参数为经纬度
   })
   this.map.clearMap()// 清除所有覆盖物(点标志)
   this.map.add(marker)// 添加点标志
   this.showInfoWindow(marker);//自定义信息窗体
 },
//自定义信息窗体
showInfoWindow(marker){
  let infoWindow = new AMap.InfoWindow({
    isCustom: true, //是否自定义信息窗体
    content:  `<div style="background-color: white;padding: 0 5px; border-radius: 5px;border: 1px solid #cccccc;"> 地址:${this.address}</div>`,
    closeWhenClickMap: true,
    zIndex: 999,
    offset: new AMap.Pixel(16, -35)
  });
  infoWindow.open(this.map, marker.getPosition());
},

七、鼠标点击地图并选点标记

 initMap(){
   AMapLoader.load({
      key:"*******************", // 申请好的Web端开发者Key,首次调用 load 时必填
      version:"2.0",      // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
      plugins: [
        'AMap.ToolBar',
        'AMap.Scale',
        'AMap.Geolocation',
        'AMap.PlaceSearch',
        'AMap.AutoComplete',
        'AMap.Geocoder',
        'AMap.CitySearch'
      ],
      resizeEnable: true,
    }).then((AMap)=>{
      const that = this;
      that.map = new AMap.Map("container",{  //设置地图容器id
        viewMode:"3D",    //是否为3D地图模式
        zoom:12,           //初始化地图级别
      });
      that.geocoder = new AMap.Geocoder()
      that.map.addControl(new AMap.Scale())  // 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺
      that.map.addControl(new AMap.ToolBar())  //在图面添加鹰眼控件,在地图右下角显示地图的缩略图
       that.handleClick(AMap)//地图选点
    }).catch(e=>{
      console.log(e);
    })
  },
   //点击地图获取地理位置
  handleClick(){
    this.map.on('click', (e) => {
      let lng = e.lnglat.lng
      let lat = e.lnglat.lat
      let marker = new AMap.Marker({
        position: new AMap.LngLat(lng, lat)
      })
      this.map.clearMap()// 清除所有覆盖物(点标志)
      this.map.add(marker)// 添加点标志
      let lnglat = [lng, lat]
      let that = this
      that.geocoder.getAddress(lnglat, function (status, result) {
        if (status === 'complete' && result.regeocode) {
          that.address = result.regeocode.formattedAddress;
          that.showInfoWindow(marker);//自定义信息窗体
         let thisPosition = {
           address: that.address,
           lng: lng,
           lat: lat
          };
          that.$emit("select",thisPosition) //返回给父组件
        } else {
          that.$message.error('根据经纬度查询地址失败')
        }
      })
    })
  },

八、根据关键字搜索并自动定位

//搜索框及搜索结果选择窗
<template>
  <div>
  	//搜索框
    <div class="map-box">
      <div class="label">关键字搜索</div>
      <el-input
        v-model="mapAddress"
        placeholder="请输入内容"
        id="tipinput"
        @keyup.enter.native="searchKeyWord"
      >
      </el-input>
      <el-button type="primary" @click="searchKeyWord"  icon="el-icon-search" ></el-button>
    </div>
    //搜索结果选择窗
    <div class="map_search_result"  v-if="showSearchResult">
      <ul>
        <li  @click="markerResult(item)" v-for="(item,index) in poiList" :key="index">{{item.name}}</li>
      </ul>
    </div>
    //地图
    <div id="container" :style="{width: width, height: height}"></div>
  </div>
</template>
initMap(){
   AMapLoader.load({
      key:"*******************", // 申请好的Web端开发者Key,首次调用 load 时必填
      version:"2.0",      // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
      plugins: [
        'AMap.ToolBar',
        'AMap.Scale',
        'AMap.Geolocation',
        'AMap.PlaceSearch',
        'AMap.AutoComplete',
        'AMap.Geocoder',
        'AMap.CitySearch'
      ],
      resizeEnable: true,
    }).then((AMap)=>{
      const that = this;
      that.map = new AMap.Map("container",{  //设置地图容器id
        viewMode:"3D",    //是否为3D地图模式
        zoom:12,           //初始化地图级别
      });
      that.handleClick(AMap)//地图选点
      that.map.addControl(new AMap.Scale())  // 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺
      that.map.addControl(new AMap.ToolBar())  //在图面添加鹰眼控件,在地图右下角显示地图的缩略图
      that.geocoder = new AMap.Geocoder()
      that.mapSearchInit()
    }).catch(e=>{
      console.log(e);
    })
  },
 /** 初始化搜索 */
  mapSearchInit(){
     let autoOptions = {
       input: "tipInput",
     }
     let autoCompleteComponent= new AMap.Autocomplete(autoOptions);
     this.autoCompleteComponent = autoCompleteComponent;
     // 注册placeSearch组件
     this.placeSearchComponent = new AMap.PlaceSearch()
   },
   //根据输入内容查询
   searchKeyWord(){
     let that= this
     that.placeSearchComponent.search(that.mapAddress, function (status, result) {
       if(status==='complete' && result.info === "OK"){
         that.showsearchResult = true
         that.poiList = result.poiList.pois
       }else{
         that.showsearchResult = false
         that.poiList = []
         that.$message({
           message: "没有查到结果",
           type: "warning",
         });
       }
     })
   },
   //选择搜索的内容
   markerResult(data){
     this.showsearchResult = false;
     this.address = data.name;
     var marker = new AMap.Marker({
       position: [Number(data.location.lng),Number(data.location.lat)],
     });
     this.map.clearMap()// 清除所有覆盖物(点标志)
     this.map.add(marker)// 添加点标志
     this.showInfoWindow(marker);
     setTimeout(() => {
       this.map.setCenter(data.location);
       this.map.setZoom(15);
     }, 50)
     let thisPosition = {
       address: this.address,
       lng: data.location.lng,
       lat: data.location.lat
     };
     this.$emit("select",thisPosition)
   },

九、效果图
在这里插入图片描述
十、完整代码
点赞收藏留言会提供哈~~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iframe嵌套其它网站页面及相关知识点详解

在开发过程中会遇到需要 在一个页面中嵌套另外一个页面&#xff0c;就要使用到框架 标签&#xff0c;然后指定src就可以了。 基本语法&#xff1a; <iframe src"需要展示的网站页面的URL"></iframe>用法举例&#xff1a; <!DOCTYPE html> <h…

css ::before ::after 添加伪元素不生效

需求&#xff1a;想用伪元素来写蓝色小标 HTML结构&#xff1a; <div> <span class"course-configname">教程配置</span> </div> 1.一开始这样写&#xff1a;&#xff08;不生效&#xff09; .course-configname::before{content: ;width…

vue3.0-axios拦截器、proxy跨域代理

目录 1. vue-cli 1&#xff09;vue-cli 2&#xff09;安装vue-cli ①解决Windows PowerShell不识别vue命令的问题 3&#xff09;创建项目 4&#xff09;基于vue ui创建vue项目 5&#xff09;基于命令行创建vue项目 2. 组件库 1&#xff09;vue组件库 2&#xff09;v…

Three.js - 透视相机(PerspectiveCamera)(三)

简介 在three.js中&#xff0c;摄像机的作用就是不断的拍摄我们创建好的场景&#xff0c;然后通过渲染器渲染到屏幕中。想通过不同的角度观看场景&#xff0c;就需要修改摄像机的位置来拍摄场景。本文详细介绍的是透视相机&#xff08;PerspectiveCamera&#xff09; 它是用来…

React Hooks(钩子函数)

React Hooks什么是Hooks?UseState()useReducer()useContext()useEffect()useRef()自定义钩子函数React Hooks中可以对性能进行优化的函数useMemo()useCallback()useMemo()和useCallback()的区别什么是Hooks? 首先&#xff1a;React的组件创建方式&#xff0c;一种是类组件&a…

划水日常(16.5)关于出版图书有偿征集书名 ~

关于摸鱼日常已经断更两个月了&#xff0c;前段时间一直忙在项目上&#xff0c;再加上搭了个网站&#xff0c;你要说有事儿吧&#xff0c;其实事儿也不多。你要说没事儿吧&#xff0c;我就是不更。原因其实很简单&#xff0c;我懒&#xff01; 可直接跳过目录一&#xff0c;直至…

web自动化测试入门篇02——selenium安装教程

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

授予渔,从0开始搭建一个自己想要的网页

文章目录视频展示&#xff1a;张娜英网页一.开始阶段1.1考虑出基本的架构1.2填充思路1.3前提准备二.实现阶段2.1导航栏实现2.2点击切换视频2.3 左右特效2.4照片墙2.5视频轮播2.6底部2.7点击切换全局变量3.总结全部代码&#xff1a;☀️作者简介&#xff1a;大家好我是言不及行y…

【实战】React 必会第三方插件 —— Cron 表达式生成器(qnn-react-cron)

文章目录一、引子二、配置使用1.安装2.使用&#xff08;1&#xff09;直接调用&#xff08;2&#xff09;赋值到表单&#xff08;Form&#xff09;&#xff08;3&#xff09;自定义功能按钮&#xff08;4&#xff09;隐藏指定 Tab&#xff08;5&#xff09;其他三、常见问题及解…

【JavaScript 进阶教程】数组新增遍历方法的说明与使用

文章已收录专栏&#xff1a;JavaScript 进阶教程 作者&#xff1a;卡卡西最近怎么样 文章导读&#xff1a; 欢迎来到 JavaScript 进阶的学习&#xff0c;ES5 对 JS 的数组&#xff0c;字符串等内置对象的方法均有扩充。这篇文章我们要掌握的是新增的几个 Array 内置对象的常用迭…

【Web理论篇】Web应用程序安全与风险

目录&#x1f332;1.Web应用程序的发展历程&#x1f342;1.1 Web应用程序的常见功能&#x1f342;1.2 Web应用程序的优点&#x1f332;2.Web安全&#x1f342;2.1Web应用程序常见漏洞&#x1f342;2.2未对用户输入做过滤&#x1f342;2.3 造成这些漏洞的原因是什么呢&#xff1…

【实战分享】js生成word(docx),以及将word转成pdf解决方案分享

本文将记录如何用js生成word文件&#xff0c;并在node服务器端将word转换成pdf。记录的代码均是在真实业务场景中使用成功的代码&#xff0c;没有记录中间踩坑的过程。想直接抄答案的家人们可以跳转到1.2 程序编写部分&#xff0c;最终效果图可在1.2 程序编写部分中4. 效果展示…

【解决前端报错】Bad Request: Required request parameter ‘id‘ for method parameter type Long is not present

后端查询列表接口返回的对象里包含Long id,前端获取到这个id,执行通过Long id删除操作。这时删除操作报错400&#xff0c;大意是没找着Long类型的id. swagger相关接口截图&#xff1a; Long类型的在swagger显示是integer64 &#xff0c; integer是integer32. 这是前端请求后…

微信公众号 - 实现 H5 网页在微信内置浏览器中下载文件,可预览和下载 office 文件(doc / xls / ppt / pdf 等)适用于任何前端技术栈网站,兼容安卓和苹果系统!

前言 网上的教程都是让你写页面 “引导” 右上角三个点里,让用户自己去浏览器打开,其实这样用户体验并不好。 本文实现了 最新微信公众号 H5 网页(微信内置浏览器中),预览下载 office 文件,安卓和苹果全都支持! 您可以直接复制代码,移植到自己项目中去,任何前端项目(…

全网超详细的【Axure】Axure RP 9的下载、安装、中文字体、授权

文章目录1. 文章引言2. 下载Axure93. 安装Axure94. Axure9中文5. Axure9授权1. 文章引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择了Axure。 接下来&#xff0c;我便从Axure RP 9的下载、安装、中文字…

VUE实现微信扫码登录

获取access_token时序图&#xff1a; public中index.html引入 <script src"https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script> 微信登录操作 new WxLogin({// 以下操作把请求到的二维码嵌入到id为"weixin"的标签中i…

走进Vue【三】vue-router详解

目录&#x1f31f;前言&#x1f31f;路由&#x1f31f;什么是前端路由&#xff1f;&#x1f31f;前端路由优点缺点&#x1f31f;vue-router&#x1f31f;安装&#x1f31f;路由初体验1.路由组件router-linkrouter-view2.步骤1. 定义路由组件2. 定义路由3. 创建 router 实例4. 挂…

VUE3 子传父 父传子 双向传递

组件参数传递 父传子 father.vue <template > <!-- 父传子实现 2.向vue页面中的子组件传递该属性 :传给子组件的名字&#xff08;自定义&#xff09;“对应定义在父组件的属性名” --><Header :openpagevaria"openpagevaria" ></Header&g…

使用vue-cli-plugin-electron-builder创建electron+vue项目

文章目录一、nvm环境二、安装vue-cli、yarn三、使用vue项目管理器创建项目四、使用vue项目管理器安装插件五、进入my-electron-vue目录&#xff0c;启动electron六、安装VueDevtools&#xff0c;解决Vue Devtools failed to install: Error: net::ERR_CONNECTION_TIMED_OUT——…

npm install xxxx --legacy-peer-deps命令是什么?

本文分享自华为云社区《npm install xxxx --legacy-peer-deps命令是什么&#xff1f;为什么可以解决下载时候产生的依赖冲突呢&#xff1f;》&#xff0c;作者&#xff1a; gentle_zhou 。 在日常使用命令npm install / npm install XX下载依赖的操作中&#xff0c;我经常会遇…