Vue.js 加入高德地图的实现代码

作者:清雨未尽时 时间:2024-05-28 15:51:31 

一、功能需求

1.根据输入内容进行模糊查询,选择地址后在地图上插上标记,并更新经纬度坐标显示

2.在地图点击后,根据回传的左边更新地址信息和坐标显示

二、准备

1.申请高德地图账号,创建应用

Vue.js 加入高德地图的实现代码

 2.在应用管理中 获得key 和安全密钥

三、在webstorm中安装 

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

四、防止在使用中AMap无法识别问

        在eslintrc.js中加入配置:

globals:{
   "AMap": "true"
 }

五、正式开发

1.创建页面

<template>
 <div>
   <label>消息管理</label>
   <div style="margin-top: 20px">
     <div style="height:520px;">
       <div id="all" style="height:100%">
         <div class="posInput">
           <el-input style="width:100%"
                     id="tipinput"
                     class="form-control input-style"
                     type="text"
                     placeholder="请输入搜索地址"
                     prefix-icon="el-icon-search"
                     v-model="formatAdress"
           >
           </el-input>
         </div>
         <div id="allmap"></div>
         <div class="posSubmit">
           <el-form  ref="form"  label-width="85px" >
             <div class="btn_box" >
               <el-form-item label="经度:" >
                 <el-input style="width:400px" disabled class="form-control input-style" type="text" v-model="longitude"> </el-input>
               </el-form-item>
               <el-form-item label="纬度:" >
                 <el-input style="width:400px"  disabled class="form-control input-style" type="text" v-model="latitude"> </el-input>
               </el-form-item>
             </div>
           </el-form>
         </div>
       </div>
     </div>
   </div>
 </div>
</template>

2.页面样式

<style scoped>
#all{
 position: relative;
}
#allmap{
 width: 100%;  height: calc(100%  - 50px);
 font-family: "微软雅黑";
}
.posInput{
 position: absolute;
 z-index: 1;
 width: 80%;
 margin-top: 20px;  margin-left: 10%;
}
.posSubmit{
 position: absolute; z-index: 1; bottom: 0;
 margin-left: 5%;
 width: 90%;
 display: flex;  justify-content: flex-start; align-items: center;
}
.btn_box{
 width: 100%;
 height: 100%;
 display: flex;  ; align-items: center;
}
::v-deep .el-form-item{
 margin-bottom: 0 !important;
}
</style>

3.存储的数据项

data () {
   return {
     map: null,
     marker: null,
     startSeacrh: [],
     stratInfo: {},
     dprops: {
       zoom: 15
     },
     formatAdress: '',
     longitude: '', // 经度
     latitude: '', // 纬度
   }
 }

4.创建地图方法

mounted () {
   this.initMap()
 },
 methods: {
   initMap () {
     const that = this
     init('allmap', that.dprops).then(AMap => {
       that.map = AMap
       that.map.on('click', that.clickHandler) // 地图点击事件 可获取经纬度等信息
       initScaleTools(that.map, true, false)
       searchAutocomplete(that.map, 'tipinput', function (event) {
         that.handleStartSelect(event)
       })
     }).catch(err => {
       this.$message.error(err)
     })
   },
   clickHandler (event) {
     console.log(event, '起点经纬度 [lng,lat]')
     if (event.lnglat === '') {
       this.$message({
         type: 'warning',
         message: '该地点无经纬度数据,请输入具体一点的地点!',
         duration: 5 * 1000
       })
       return
     }
     if (this.marker) {
       this.map.remove(this.marker)
       this.marker = null
     }
     this.startSeacrh = []
     this.startSeacrh = [event.lnglat.lng, event.lnglat.lat]
     this.marker = new AMap.Marker({
       position: this.startSeacrh
     })
     this.map.add(this.marker)
     this.map.setCenter(this.startSeacrh)
     this.longitude = event.lnglat.lng
     this.latitude = event.lnglat.lat
     let that = this
     getAddressByLngLat(this.startSeacrh, function (status, result) {
       if (status === 'complete') {
         that.formatAdress = result.regeocode.formattedAddress
         let adrComponent = result.regeocode.addressComponent
         that.stratInfo = {
           district: adrComponent.province,
           address: adrComponent.district,
           name: adrComponent.township + adrComponent.street + adrComponent.streetNumber,
           fullAdr: result.regeocode.formattedAddress
         }
       }
     })
   },
   handleStartSelect (event) {
     console.log(event, '起点经纬度 [lng,lat]')
     if (event.poi.location === '') {
       this.$message({
         type: 'warning',
         message: '该地点无经纬度数据,请输入具体一点的地点!',
         duration: 5 * 1000
       })
       return
     }
     if (this.marker) {
       this.map.remove(this.marker)
       this.marker = null
     }
     this.startSeacrh = []
     this.startSeacrh = [event.poi.location.lng, event.poi.location.lat]
     this.formatAdress = event.poi.district + event.poi.address + event.poi.name
     this.longitude = event.poi.location.lng
     this.latitude = event.poi.location.lat
     this.marker = new AMap.Marker({
       position: this.startSeacrh
     })
     this.map.add(this.marker)
     this.map.setCenter(this.startSeacrh)
     this.stratInfo = {
       district: event.poi.district,
       address: event.poi.address,
       name: event.poi.name,
       fullAdr: this.formatAdress
     }
   }
 }

5.封装好的js文件方法

  initMap.js

import AMapLoader from '@amap/amap-jsapi-loader'
window._AMapSecurityConfig = {
 securityJsCode: '安全密钥'
}
const initMap = async (config) => {
 return new Promise((resolve, reject) => {
   AMapLoader.load({
     'key': config.key,
     'version': '1.4.15',
     'plugins': [
       'AMap.PolygonEditor' // 插件
     ],
     'AMapUI': {
       'version': '1.1',
       'plugins': []
     },
     'Loca': {
       'version': '1.3.2'
     }
   }).then((AMap) => {
     resolve(AMap)
   }).catch(err => {
     reject(err)
   })
 })
}
export default initMap

map.js

import initMap from './initMap.js'
export const init = (container, props) => {
 const config = {
   key: 'key'
 }
 return new Promise((resolve, reject) => {
   initMap(config).then(AMap => {
     resolve(new AMap.Map(container, { ...props }))
   }).catch(err => {
     reject(err)
   })
 })
}
/**
* @param {*} map 地图实例
* @param {Boolean} noScale 不需要比例尺  true表示不需要
* @param {Boolean} noToolBar 不需要工具栏 true表示不需要
*/
export const initScaleTools = (map, noScale, noToolBar) => {
 if (!noScale) {
   map.plugin(['AMap.Scale'], function () {
     var scale = new AMap.Scale()
     map.addControl(scale)
   })
 }
 if (!noToolBar) {
   map.plugin(['AMap.ToolBar'], function () {
     var tool = new AMap.ToolBar()
     map.addControl(tool)
   })
 }
}
//模糊查询
export const searchAutocomplete = (map, keyword, commpletHandle) => {
 map.clearMap()
 AMap.plugin(['AMap.PlaceSearch', 'AMap.Autocomplete'], function () {
   let autoOptions1 = { input: keyword, city: '全国' }
   let startAutoComplete = new AMap.Autocomplete(autoOptions1)
   AMap.PlaceSearch({
     map: map
   })
   AMap.event.addListener(startAutoComplete, 'select', commpletHandle)
 })
}

/**
*
* @param {String} LngLat 经纬度
* @param {Function} callback 回调函数
* @param {Object} otherProps 其他参数
*/
export const getAddressByLngLat = (LngLat, callback, otherProps) => {
 AMap.plugin('AMap.Geocoder', function () {
   let geocoder = new AMap.Geocoder({
     ...otherProps
   })

geocoder.getAddress(LngLat, function (status, result) {
     callback(status, result)
   })
 })
}

const mapJS = {
 init,
 initScaleTools,
 searchAutocomplete,
 getAddressByLngLat
}
export default mapJS

在文件中导入 map.js方法

import {
 init,
 initScaleTools,
 searchAutocomplete,
 getAddressByLngLat
} from '../../utils/map'

六、步骤总结

1.在mounted()中调用 initMap ()初始化地图

2.初始化成功后、添加事件监听:地图点击、模糊查询。添加放大缩小工具栏

init('allmap', that.dprops).then(AMap => {
       that.map = AMap
       that.map.on('click', that.clickHandler) // 地图点击事件 可获取经纬度等信息
       initScaleTools(that.map, true, false)
       searchAutocomplete(that.map, 'tipinput', function (event) {
         that.handleStartSelect(event)
       })
     })

七:效果

Vue.js 加入高德地图的实现代码

Vue.js 加入高德地图的实现代码

来源:https://blog.csdn.net/kangguang/article/details/128096331

标签:Vue.js,高德地图
0
投稿

猜你喜欢

  • Python模块汇总(常用第三方库)

    2023-05-21 16:25:37
  • Python-Selenium自动化爬虫

    2021-04-04 10:55:39
  • Python实现将不规范的英文名字首字母大写

    2021-05-21 08:40:46
  • NumPy统计函数的实现方法

    2021-10-15 22:02:27
  • 记录模型训练时loss值的变化情况

    2022-03-22 23:39:48
  • 在django admin中配置搜索域是一个外键时的处理方法

    2021-02-20 18:48:26
  • 详解 MySQL的FreeList机制

    2024-01-28 13:56:44
  • Python编程tkinter库Canvas实现涂鸦颜色表及围棋盘示例

    2023-08-02 13:21:02
  • python类属性学习深入讲解

    2021-03-25 06:05:34
  • Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程

    2021-08-19 13:13:13
  • Python判断是否json是否包含一个key的方法

    2023-02-25 02:58:40
  • Python新手学习raise用法

    2021-01-08 22:37:52
  • Python实现获取照片拍摄日期并重命名的方法

    2023-04-14 03:26:37
  • Python利用Gradio与EasyOCR构建在线识别文本的Web应用

    2023-05-31 09:35:57
  • 基于Python实现智能停车场车牌识别计费系统

    2021-05-23 07:44:22
  • python爬虫 基于requests模块发起ajax的get请求实现解析

    2022-01-02 05:04:04
  • 浅谈django开发者模式中的autoreload是如何实现的

    2022-04-03 17:22:04
  • Go语言变量与基础数据类型详情

    2023-08-30 03:13:16
  • 最新WebStorm2020.2注册码永久激活(激活到2089年) <font color=red>原创</font>

    2023-03-20 19:28:51
  • 如何将ChatGPT整合到Word中

    2023-12-20 03:13:54
  • asp之家 网络编程 m.aspxhome.com