Vue引入高德地圖實現流程分步講解
一、功能需求
1.根據輸入內容進行模糊查詢,選擇地址後在地圖上插上標記,並更新經緯度坐標顯示
2.在地圖點擊後,根據回傳的左邊更新地址信息和坐標顯示
二、準備
1.申請高德地圖賬號,創建應用
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引入高德地圖實現流程分步講解的文章就介紹到這瞭,更多相關Vue高德地圖內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!