在vue3.0中使用百度地图制作用户输入地址进行定位,或者用户移动定位的标记点获取标记点的地址以及经纬度

该博客围绕在Vue项目中集成百度地图展开。需求是让用户可输入地址获取标记点地址与经纬度,也能移动标记点获取相关信息。介绍了在项目中注入百度地图链接地址及ak密钥的代码,还给出效果代码,并提供百度地图javascript API扩展参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在vue3.0中使用百度地图制作用户输入地址进行定位,或者用户移动定位的标记点获取标记点的地址以及经纬度

需求

用户能够输入地址获取标记点地址以及经纬度,也能够移动地图上已经生成的标记点,获取地址信息以及经纬度

效果示例图

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

在这里插入图片描述

代码块

在项目中注入百度地图的链接地址以及ak密钥 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;
	});
}

效果代码

<template>
	<div id="map"></div>
	<div id="r-result">
		<span>请输入地址:</span>
		<input type="text" id="suggestId" size="20" value="" />
	</div>

	<p>地址:{{ address }}</p>
	<p>lng:{{ lng }}</p>
	<p>lat:{{ lat }}</p>
</template>

<script setup>
import loadBMap from '@/utils/loadMap.js';
import { ref } from 'vue';
const mapInit = loadBMap('lopPFKvmkRLAiG9Z7TffY8v2hRaVrVA5');

const lng = ref('--');
const lat = ref('--');
const address = ref('--');

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', function(e) {
		//鼠标点击下拉列表后的事件
		const tempValue = e.item.value;
		const searchValue = tempValue.province + tempValue.city + tempValue.district + tempValue.street + tempValue.business;
		setPlace(BMap, map, searchValue);
	});
});
/**
 * 根据输入框的值在地图上添加标记点
 * @param
 *   BMap:地图对象
 *   searchValue:输入框下拉数据选中的值
 * **/
function 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)); //添加标注
			movePoint(BMap, map, res.Ir[0].point);
		}
	});
	local.search(searchValue);
}
/**
 * 移动标记点
 * @param
 *   BMap:地图对象
 *   latlng:经纬度
 * **/
function 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);
	latlngToAddress(BMap, latlng);

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

<style lang="scss" scoped>
#map {
	border: 1px solid red;
	width: 100%;
	height: 600px;
}
#suggestId {
	border: 1px solid red;
	width: 300px;
	height: 30px;
}
</style>

扩展参考百度地图

百度地图 javascript API

### Vue3实现百度地图轨迹绘制的功能 在 Vue3 项目中集成百度地图实现轨迹绘制功能是一项常见的需求。以下是详细的说明和代码示例。 #### 集成百度地图 JavaScript API 为了使用百度地图的相关功能,首先需要注册百度地图开发者账号,并获取对应的 AK(访问密钥)。随后,在 `public/index.html` 文件中引入必要的脚本资源: ```html <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=您的AK"></script> <script type="text/javascript" src="https://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js"></script> <script type="text/javascript" src="https://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js"></script> ``` 注意:请将 `您的AK` 替换为实际申请的密钥[^3]。 --- #### 创建地图容器 在 Vue 组件模板中创建一个用于承载地图的 DOM 容器: ```vue <template> <div id="map-container" style="width: 100%; height: 500px;"></div> </template> ``` --- #### 初始化地图实例 通过调用百度地图 API 的 `BMapGL.Map` 方法初始化地图对象,并设置中心点和缩放级别: ```javascript import { onMounted } from &#39;vue&#39;; export default { setup() { let map; const initMap = () => { map = new BMapGL.Map(&#39;map-container&#39;); // 创建 Map 实例 const point = new BMapGL.Point(116.404, 39.915); // 设置中心点坐标 map.centerAndZoom(point, 15); // 初始化地图视图居中和缩放比例 map.enableScrollWheelZoom(); // 开启鼠标滚轮缩放 }; onMounted(() => { initMap(); }); return {}; }, }; ``` 以上代码实现了基本的地图加载功能[^1]。 --- #### 轨迹绘制逻辑 假设已经有一组 GPS 坐标数据表示轨迹路径,则可以通过以下方式将其渲染到地图上: ```javascript const drawPath = (pathData) => { if (!Array.isArray(pathData)) throw new Error(&#39;轨迹数据必须是一个数组&#39;); const pathPoints = pathData.map((item) => new BMapGL.Point(item.lng, item.lat)); const polyline = new BMapGL.Polyline(pathPoints, { strokeColor: &#39;#FF0000&#39;, // 折线颜色 strokeWeight: 6, // 折线宽度 strokeOpacity: 0.8 // 折线透明度 }); map.addOverlay(polyline); // 将折线添加至地图 }; // 示例轨迹数据 const trajectoryData = [ { lng: 116.404, lat: 39.915 }, { lng: 116.414, lat: 39.925 }, { lng: 116.424, lat: 39.935 } ]; onMounted(() => { initMap(); setTimeout(() => drawPath(trajectoryData), 1000); // 模拟异步加载轨迹数据 }); ``` 上述代码片段展示了如何根据一组经纬度数据生成轨迹线条,并应用样式配置。 --- #### 动态轨迹回放 如果希望进一步增强用户体验,可以实现动态轨迹回放效果。具体方法如下: ```javascript const replayTrajectory = (points, intervalMs = 1000) => { const marker = new BMapGL.Marker(points[0]); // 初始标记点 map.addOverlay(marker); let currentIndex = 0; const timerId = setInterval(() => { if (currentIndex >= points.length) { clearInterval(timerId); return; } const currentPoint = points[currentIndex]; marker.setPosition(currentPoint); // 更新标记位置 map.panTo(currentPoint); // 地图跟随移动 currentIndex++; }, intervalMs); }; onMounted(() => { initMap(); setTimeout(() => { const pathPoints = trajectoryData.map((item) => new BMapGL.Point(item.lng, item.lat)); replayTrajectory(pathPoints, 500); // 每隔 500ms 移动一步 }, 1000); }); ``` 该函数会按照指定的时间间隔逐步更新标记的位置,从而模拟出轨迹回放的效果[^3]。 --- #### 性能优化建议 当处理大量轨迹点时,可能会影响页面性能。此时可以考虑以下策略: - 使用 MarkerClusterer 插件聚合密集区域内的标记。 - 对于超长轨迹,仅保留部分关键节点进行绘制。 ---
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值