vue2百度地图选点组件

31 篇文章 0 订阅

vue2百度地图选点组件

在这里插入图片描述
在这里插入图片描述

代码块 loadMap.js

/**
 * 动态加载百度地图api函数
 * @param {String} ak  百度地图AK,必传
 */
export default function loadBMap(ak) {
	return new Promise((resolve, reject) => {
		if (typeof window.BMap !== "undefined") {
			resolve(window.BMap);
			return true;
		}
		window.onBMapCallback = function() {
			resolve(window.BMap);
			return true;
		};
		const script = document.createElement("script");
		script.type = "text/javascript";
		script.src =
			`https://api.map.baidu.com/api?v=3.0&ak=${ak}&callback=onBMapCallback&s=1`;
		script.onerror = reject;
		document.head.appendChild(script);
		return true;
	});
}

组件markerMap.vue

<template>
	<div class="markerMap-wrap">
		<!-- 地图-start -->
		<div id="map" :style="{ width: mapWidth, height: mapHeight }"></div>
		<!-- 地图-end -->
		<!-- 输入框 -->
		<div class="markerMap-input">
			<span class="markerMap-label">地址:</span>
			<input type="text" id="suggestId" class="input-style" :style="{ width: inputWidth + 'px', height: inputHeight + 'px' }" :placeholder="placeholder" />
		</div>
	</div>
</template>

<script>
import loadBMap from '@/utils/loadMap.js';
export default {
	props: {
		mapWidth: {
			type: String,
			default: () => {
				return '100%';
			}
		},
		mapHeight: {
			type: String,
			default: () => {
				return '400px';
			}
		},
		placeholder: {
			type: String,
			default: () => {
				return '请输入搜索地址';
			}
		},
		inputWidth: {
			type: String,
			default: () => {
				return '200';
			}
		},
		inputHeight: {
			type: String,
			default: () => {
				return '30';
			}
		}
	},
	data() {
		return {
			inputValue: ''
		};
	},
	mounted() {
		this.baiDuMapInit();
	},
	methods: {
		/**
		 * 初始化百度地图
		 * **/
		baiDuMapInit() {
			const mapInit = loadBMap('lopPFKvmkRLAiG9Z7TffY8v2hRaVrVA5');
			mapInit.then(BMap => {
				//创建地图实例,位于BMap命名空间下的Map类表示地图,通过new操作符可以创建一个地图实例。其参数可以是元素id也可以是元素对象。
				const map = new BMap.Map('map');
				map.centerAndZoom('上海', 12); // 初始化地图,设置城市和地图级别
				map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放

				const ac = new BMap.Autocomplete({ input: 'suggestId', location: map }); //建立一个自动完成的对象
				ac.addEventListener('onconfirm', e => {
					//鼠标点击下拉列表后的事件
					const tempValue = e.item.value;
					const searchValue = tempValue.province + tempValue.city + tempValue.district + tempValue.street + tempValue.business;
					this.inputValue = searchValue;
					this.setPlace(BMap, map, searchValue);
				});
			});
		},
		/**
		 * 根据输入框的值在地图上添加标记点
		 * @param
		 *   BMap:地图对象
		 *   searchValue:输入框下拉数据选中的值
		 * **/
		setPlace(BMap, map, searchValue) {
			map.clearOverlays(); //清除地图上所有覆盖物
			const local = new BMap.LocalSearch(map, {
				//智能搜索
				onSearchComplete: res => {
					const pp = local.getResults().getPoi(0).point; //获取第一个智能搜索的结果
					map.centerAndZoom(pp, 21);
					map.addOverlay(new BMap.Marker(pp)); //添加标注
					this.movePoint(BMap, map, res.Ir[0].point);
				}
			});
			local.search(searchValue);
		},
		/**
		 * 移动标记点
		 * @param
		 *   BMap:地图对象
		 *   latlng:经纬度
		 * **/
		movePoint(BMap, map, latlng) {
			map.clearOverlays(); //清除地图上所有覆盖物
			//使用BMap命名空间下的Point类来创建一个坐标点
			const point = new BMap.Point(latlng.lng, latlng.lat);
			const marker = new BMap.Marker(point, {
				enableDragging: true
			});
			map.addOverlay(marker);
			this.latlngToAddress(BMap, latlng);

			// 覆盖物拖拽开始事件
			marker.addEventListener('dragstart', e => {
				// 清除一些覆盖物
				console.log('[开始]', e);
			});
			// 覆盖物拖拽事件
			marker.addEventListener('dragend', () => {
				const nowPoint = marker.getPosition(); // 拖拽完成之后坐标的位置(经纬度)
				this.latlngToAddress(BMap, nowPoint);
			});
		},
		/**
		 * 地址解析
		 * @param
		 *   BMap:地图对象
		 *   latlng:经纬度
		 * **/
		latlngToAddress(BMap, latlng) {
			const geoc = new BMap.Geocoder();
			geoc.getLocation(latlng, rs => {
				console.log(rs);
				if (rs.surroundingPois.length > 0) {
					rs.surroundingPois[0].tempAddress = this.inputValue;
					this.$emit('map', rs.surroundingPois[0]);
				} else {
					rs.tempAddress = this.inputValue;
					this.$emit('map', rs);
				}
			});
		}
	}
};
</script>

<style lang="scss" scoped>
.markerMap-wrap {
	width: 100%;
	min-height: 200px;
	.markerMap-input {
		width: 100%;
		margin-top: 10px;
		display: flex;
		align-items: center;
		.markerMap-label {
			font-size: 16px;
			color: #333;
			padding-right: 10px;
		}
		.input-style {
			border: 1px solid #dcdcdc;
			border-radius: 8px;
			padding-left: 12px;
			padding-right: 12px;
		}
	}
}
</style>

使用

<template>
	<div class="match">
		<p>请输入地址:</p>
		<markerMap @map="markerMapHandle"></markerMap>
		<p>地址:{{ addressObject.tempAddress }}</p>
		<p>地址:{{ addressObject.address }} {{ addressObject.title }}</p>
		<p>lng:{{ addressObject.point.lng }}</p>
		<p>lat:{{ addressObject.point.lat }}</p>
	</div>
</template>

<script>
import markerMap from '@/components/markerMap.vue';
export default {
	components: {
		markerMap
	},
	data() {
		return {
			addressObject: {
				title: '--',
				address: '--',
				point: {
					lng: '--',
					lat: '--'
				}
			}
		};
	},
	mounted() {},
	methods: {
		markerMapHandle(params) {
			console.log('[miao]', params);
			this.addressObject = params;
		}
	}
};
</script>

<style lang="scss" scoped>
.match {
	border: 1px solid red;
	width: 100%;
}
p {
	font-size: 16px;
	margin-top: 12px;
}
</style>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值