vue 使用高德地图实现自定义选取起点和终点功能,支持搜索地址跳转定位(保姆级教程)

这篇具有很好参考价值的文章主要介绍了vue 使用高德地图实现自定义选取起点和终点功能,支持搜索地址跳转定位(保姆级教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、效果演示

1. 起点终点选择

vue地图选点,vue.js,npm,前端

 2. 地址搜索

vue地图选点,vue.js,npm,前端

vue地图选点,vue.js,npm,前端 

二、准备工作

1. 获取高德地图key

1.1  访问高德地图官网注册完成后登录,进入控制台

vue地图选点,vue.js,npm,前端

 1.2  左侧 应用管理-我的应用,点击创建新应用

vue地图选点,vue.js,npm,前端

1.3 点击添加

vue地图选点,vue.js,npm,前端 

1.4 选择Web端(JS API) 

vue地图选点,vue.js,npm,前端

1.5 创建完成,得到key和安全密钥

vue地图选点,vue.js,npm,前端 

2. 引入高德地图npm包

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

 三、正式开始写代码

提示:以下代码全部在*.vue文件中编写,无其他文件

1. 设置key和安全密钥,初始化地图

把xxxxxxxxxxxxxxxxxxx换成自己申请的

<script>
import AMapLoader from "@amap/amap-jsapi-loader";
// 设置安全密钥
window._AMapSecurityConfig = {
  securityJsCode: 'xxxxxxxxxxxxxxxxx',
}
export default {
    mounted() {
        this.initMap();
    },
    data(){
	  return {
		//提交表单
		form:{},	
        //地图实例
        map: null,
        //路径坐标点集合
        coordinateList: [],
        //起点坐标
        startCoordinate: {},
        //终点坐标
        endCoordinate: {},
        //起点坐标描述
        startCoordinateDescription: '经度:请选择起点' + ',     纬度:请选择起点' ,
        //终点坐标描述
        endCoordinateDescription: '经度:请选择终点' + ',     纬度:请选择终点',
        //选择起点
        isStart: true,
        //起点Marker
        startMarker: null,
        //终点Marker
        endMarker: null,
        //搜索点Marker
        searchMarker: null,
        // 搜索提示
        AutoComplete: null,
        // 搜索关键字
        keywords: "",
        // 搜索节流阀
        loading: false,
        // 搜索提示信息
        options: [],

      }
	},
    methods: {
        //初始化地图
        initMap() {
        AMapLoader.reset()
        AMapLoader.load({
          key: 'xxxxxxxxxxxxxxxxxxxxxxxxx',
          version: '2.0',   // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
          plugins: ['AMap.AutoComplete', 'AMap.PlaceSearch', 'AMap.Marker'],  // 需要使用的的插件列表
          AMapUI: {
            version: '1.1',
            plugins: []
          }
        }).then((AMap)=>{
          // 初始化地图
          this.map = new AMap.Map('guide-map',{
            viewMode : "2D",  //  是否为3D地图模式
            zoom : 13,   // 初始化地图级别
            center : [113.370824,23.131265], //中心点坐标  广州
            resizeEnable: true,
            willreadoften: true
          });
          //鼠标点击事件
          this.map.on('click', this.clickMapHandler)
          // 搜索提示插件
          this.AutoComplete = new AMap.AutoComplete({ city: "全国" });
        }).catch(e => {
          console.log(e);
        });
      }    
    }
}
</script>

 2. 选取起点和终点

// 点击地图事件
      clickMapHandler(e){
        //选择起点
        if (this.isStart){
          if (this.startMarker !== null){
            this.map.remove(this.startMarker)
          }
          this.startCoordinate.lon = e.lnglat.getLng()
          this.startCoordinate.lat = e.lnglat.getLat()
          this.startCoordinateDescription = '经度:' + this.startCoordinate.lon + ',     纬度:' + this.startCoordinate.lat

          //标点
          this.startMarker = new AMap.Marker({
            position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat()),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
            title: '起点',
            label: {
              content: '起点'
            }
          })
          // 将创建的点标记添加到已有的地图实例
          this.map.add(this.startMarker)
        }
        //选择终点
        else {
          if (this.endMarker !== null){
            this.map.remove(this.endMarker)
          }
          this.endCoordinate.lon = e.lnglat.getLng()
          this.endCoordinate.lat = e.lnglat.getLat()
          this.endCoordinateDescription = '经度:' + this.endCoordinate.lon + ',     纬度:' + this.endCoordinate.lat

          this.endMarker = new AMap.Marker({
            position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat()),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
            title: '终点',
            label: {
              content: '终点'
            }
          })
          this.map.add(this.endMarker)
        }
      }

3.搜索地址功能

// 搜索地址
      remoteMethod(query) {
        if (query !== "") {
          this.loading = true;
          setTimeout(() => {
            this.loading = false;
            this.AutoComplete.search(query, (status, result) => {
              this.options = result.tips;
            });
          }, 200);
        } else {
          this.options = [];
        }
      },
      // 选中提示
      currentSelect(val) {
        // 清空时不执行后面代码
        if (!val) {
          return ;
        }
        // 自动适应显示想显示的范围区域
        this.map.setFitView();
        //清除marker
        if (this.searchMarker){
          this.map.remove(this.searchMarker)
        }
        //设置marker
        this.searchMarker = new AMap.Marker({
          map: this.map,
          position: [val.location.lng, val.location.lat],
        });

        this.keywords = val.name
        //定位
        this.map.setCenter([val.location.lng, val.location.lat])
      }

4. 页面代码

<template>
<div class="app-container">
<!--      表单-->
      <div style="width: 70%;margin-left: 15%;">
        <el-input v-model="form.name" placeholder="请输入路线名称" style="margin-bottom: 3px;">
          <template slot="prepend"><label style="width: 120px;">路线名称</label></template>
        </el-input>
        <el-input :value="startCoordinateDescription" disabled style="; margin-bottom: 3px;">
          <el-button slot="prepend" style="width: 120px; background: #13ce66; color: white" @click="isStart = true">选择起点</el-button>
        </el-input>
        <el-input :value="endCoordinateDescription" disabled>
          <el-button slot="prepend" style="width: 120px; background: #cc3333; color: white" @click="isStart = false">选择终点</el-button>
        </el-input>
      </div>
<!--      搜索组件-->
      <div>
        搜索:
        <el-select
          v-model="keywords"
          filterable
          remote
          placeholder="请输入关键词"
          :remote-method="remoteMethod"
          :loading="loading"
          :clearable="true"
          size="mini"
          @change="currentSelect"
          style="width: 500px"
        >
          <el-option
            v-for="item in options"
            :key="item.id"
            :label="item.name"
            :value="item"
            class="one-text"
          >
            <span style="float: left">{{ item.name }}</span>
            <span style="float: right; color: #8492a6; font-size: 13px">{{
                item.district
              }}</span>
          </el-option>
        </el-select>
      </div>
<!--      地图组件-->
      <div id="guide-map" style="height: 500px;"></div>

</div>
</template>

5. 全部代码

<template>
<div class="app-container">
<!--      表单-->
      <div style="width: 70%;margin-left: 15%;">
        <el-input v-model="form.name" placeholder="请输入路线名称" style="margin-bottom: 3px;">
          <template slot="prepend"><label style="width: 120px;">路线名称</label></template>
        </el-input>
        <el-input :value="startCoordinateDescription" disabled style="; margin-bottom: 3px;">
          <el-button slot="prepend" style="width: 120px; background: #13ce66; color: white" @click="isStart = true">选择起点</el-button>
        </el-input>
        <el-input :value="endCoordinateDescription" disabled>
          <el-button slot="prepend" style="width: 120px; background: #cc3333; color: white" @click="isStart = false">选择终点</el-button>
        </el-input>
      </div>
<!--      搜索组件-->
      <div>
        搜索:
        <el-select
          v-model="keywords"
          filterable
          remote
          placeholder="请输入关键词"
          :remote-method="remoteMethod"
          :loading="loading"
          :clearable="true"
          size="mini"
          @change="currentSelect"
          style="width: 500px"
        >
          <el-option
            v-for="item in options"
            :key="item.id"
            :label="item.name"
            :value="item"
            class="one-text"
          >
            <span style="float: left">{{ item.name }}</span>
            <span style="float: right; color: #8492a6; font-size: 13px">{{
                item.district
              }}</span>
          </el-option>
        </el-select>
      </div>
<!--      地图组件-->
      <div id="guide-map" style="height: 500px;"></div>

</div>
</template>
<script>
import AMapLoader from "@amap/amap-jsapi-loader";
// 设置安全密钥
window._AMapSecurityConfig = {
  securityJsCode: 'xxxxxxxxxxxxxxxxx',
}
export default {
    mounted() {
        this.initMap();
    },
    data(){
	  return {
		//提交表单
		form:{},		
        //地图实例
        map: null,
        //路径坐标点集合
        coordinateList: [],
        //起点坐标
        startCoordinate: {},
        //终点坐标
        endCoordinate: {},
        //起点坐标描述
        startCoordinateDescription: '经度:请选择起点' + ',     纬度:请选择起点' ,
        //终点坐标描述
        endCoordinateDescription: '经度:请选择终点' + ',     纬度:请选择终点',
        //选择起点
        isStart: true,
        //起点Marker
        startMarker: null,
        //终点Marker
        endMarker: null,
        //搜索点Marker
        searchMarker: null,
        // 搜索提示
        AutoComplete: null,
        // 搜索关键字
        keywords: "",
        // 搜索节流阀
        loading: false,
        // 搜索提示信息
        options: [],

      }
	},
    methods: {
        //初始化地图
        initMap() {
        AMapLoader.reset()
        AMapLoader.load({
          key: 'xxxxxxxxxxxxxxxxxxxxxxxxx',
          version: '2.0',   // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
          plugins: ['AMap.AutoComplete', 'AMap.PlaceSearch', 'AMap.Marker'],  // 需要使用的的插件列表
          AMapUI: {
            version: '1.1',
            plugins: []
          }
        }).then((AMap)=>{
          // 初始化地图
          this.map = new AMap.Map('guide-map',{
            viewMode : "2D",  //  是否为3D地图模式
            zoom : 13,   // 初始化地图级别
            center : [113.370824,23.131265], //中心点坐标  广州
            resizeEnable: true,
            willreadoften: true
          });
          //鼠标点击事件
          this.map.on('click', this.clickMapHandler)
          // 搜索提示插件
          this.AutoComplete = new AMap.AutoComplete({ city: "全国" });
        }).catch(e => {
          console.log(e);
        });
      },
      // 点击地图事件
      clickMapHandler(e){
        //选择起点
        if (this.isStart){
          if (this.startMarker !== null){
            this.map.remove(this.startMarker)
          }
          this.startCoordinate.lon = e.lnglat.getLng()
          this.startCoordinate.lat = e.lnglat.getLat()
          this.startCoordinateDescription = '经度:' + this.startCoordinate.lon + ',     纬度:' + this.startCoordinate.lat

          //标点
          this.startMarker = new AMap.Marker({
            position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat()),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
            title: '起点',
            label: {
              content: '起点'
            }
          })
          // 将创建的点标记添加到已有的地图实例
          this.map.add(this.startMarker)
        }
        //选择终点
        else {
          if (this.endMarker !== null){
            this.map.remove(this.endMarker)
          }
          this.endCoordinate.lon = e.lnglat.getLng()
          this.endCoordinate.lat = e.lnglat.getLat()
          this.endCoordinateDescription = '经度:' + this.endCoordinate.lon + ',     纬度:' + this.endCoordinate.lat

          this.endMarker = new AMap.Marker({
            position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat()),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
            title: '终点',
            label: {
              content: '终点'
            }
          })
          this.map.add(this.endMarker)
        }
      },
      // 搜索地址
      remoteMethod(query) {
        if (query !== "") {
          this.loading = true;
          setTimeout(() => {
            this.loading = false;
            this.AutoComplete.search(query, (status, result) => {
              this.options = result.tips;
            });
          }, 200);
        } else {
          this.options = [];
        }
      },
      // 选中提示
      currentSelect(val) {
        // 清空时不执行后面代码
        if (!val) {
          return ;
        }
        // 自动适应显示想显示的范围区域
        this.map.setFitView();
        //清除marker
        if (this.searchMarker){
          this.map.remove(this.searchMarker)
        }
        //设置marker
        this.searchMarker = new AMap.Marker({
          map: this.map,
          position: [val.location.lng, val.location.lat],
        });

        this.keywords = val.name
        //定位
        this.map.setCenter([val.location.lng, val.location.lat])
      }
    }
}
</script>

参考:vue对高德地图的简单使用:点击标记并获取经纬度和详细地址文章来源地址https://www.toymoban.com/news/detail-756674.html

到了这里,关于vue 使用高德地图实现自定义选取起点和终点功能,支持搜索地址跳转定位(保姆级教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Uniapp】高德地图的接入、定位、自定义标点与信息窗体使用

    因为公司的业务需求,需要实现一个接入高德地图的数据大屏,并根据坐标实现地图标点渲染,自定义信息窗体,点击定位等功能。查阅高德地图官方文档时发现使用的是原生 JavaScript ,且网上 uniapp 接入使用的教程较少,我自己摸索之后解决了不少问题,欢迎大佬补充纠正

    2024年02月11日
    浏览(46)
  • vue项目中使用高德地图

    最近做的项目中有个地图选择的功能,如下图所示: 所以在此记录下使用方法,望各位大神指导 我的应用 | 高德控制台 第一步: 去高德官网去创建一个属于自己的地图应用 (得到key和秘钥) 我的应用 | 高德控制台  这是添加的方式: 准备-入门-教程-地图 JS API | 高德地图

    2024年02月07日
    浏览(48)
  • vue中引入并使用高德地图

    1.进入高德开放平台 2.点击: 开发支持---------地图JS AP---------JSAPI的加载 3.选择 按NPM方式使用loader 4.定义一个有宽高的div,书写以下代码: 先放效果图,左下角是可供选择的鼠标样式 1.点击示例中心---------地图属性-------下划找到 设置鼠标样式 2.点进去后有示例代码 3.这是之前

    2024年02月03日
    浏览(56)
  • vue实现离线地图+leaflet+高德瓦片

    1、我是通过leaflet和高德的瓦片实现的离线地图 2、可以通过npm、CDN和直接下载zip包实现引入leaflet,附上leaflet中文网 3、高德的瓦片是找了很多帖子无意看到的一份合适的瓦片下载项目(忘了原帖在哪),不过这个项目是Java项目,是通过后端大哥帮忙下载的,附上项目原地址

    2024年02月12日
    浏览(49)
  • 在vue3项目中使用新版高德地图

    高德开发平台 : 高德开放平台 | 高德地图API (amap.com) 1. 首先你要注册好账号登录 2. 获取key和密钥    自2021年12月02日升级,升级之后所申请的 key 必须配备安全密钥  jscode  一起使用         按 NPM 方式安装使用 Loader :         在页面中通过NPM 方式安装的使用 :    

    2023年04月19日
    浏览(69)
  • Vue3使用高德地图、搜索、地图选点、以及省市区三级联动

    1、准备工作 需要在 高德开发平台 申请自己的 key 和 密钥 这里的 Key 名称大家可以随意填写 申请完之后我们得到 key 和 密钥 vue中使用需要安装**@amap/amap-jsapi-loader --save** 官方文档 2、代码实现 首先我们需要三个文件,一个 index.vue 一个用来存放省市区的 index.js 文件 一个 ma

    2024年02月05日
    浏览(75)
  • web JS高德地图标点、点聚合、自定义图标、自定义窗体信息、换肤等功能实现和高复用性组件封装教程

    突然发现官方更新点聚合调用方式多包一层mapObj.plugin([“AMap.MarkerClusterer”],fn)来加载聚合功能,之前直接通过new方式不生效,具体可以看下第6点和示例代码已做更新,感谢读者反馈。 本文将讲述如何利用高德地图JS API实现地图标点、聚合点、自定义图标、点击窗体信息展

    2024年02月04日
    浏览(51)
  • 前端系列——vue2+高德地图web端开发(使用和引入)

    本人非专业前端开发,其实是搞后端的,但是正好接了一个项目需要我负责全栈,所以写了这个系列的文章,如果以后项目可以开源我会放出来的 本次我们要实现的是vue2+高德地图的网页开发 本文需要大家系统学过vue以及初步了解高德地图的情况下理解起来会十分省力 高德

    2024年01月16日
    浏览(48)
  • VUE3+TS+element UI +高德地图实现轨迹回放带进度条

    记录一下,由于项目需要做车辆的历史轨迹回放,查了很多资料,在高德地图里有这几种解决方案。 所用技术:vue3 + TS +element UI plus +高德地图  这是相关的Demo借鉴 高德地图的轨迹回放demo 轨迹巡航器控制 高德地图Amap UI 下面是效果图: 1,这是高德地图提供的轨迹回放demo

    2024年02月11日
    浏览(64)
  • vue对高德地图的简单使用:点击标记并获取经纬度和详细地址

    目录 第一步:先按部就班,进入高德开放平台,跟着步骤注册账号,创建应用 第二步:用npm下载包,初始化地图 第三步:实现点击地图添加标记 第四步:点击获取详细地址 第五步:搜索获取相关地区提示 第六步:全部代码(把密钥和key替换可直接运行)   高德地图有AP

    2024年02月06日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包