百度地图如何准确定位?注意surroundingPois

本文记录了作者在使用百度地图API进行精确位置定位时遇到的问题及解决方案。起初因忽略了API返回的具体信息而导致定位不准确,最终通过打印返回对象找到了正确的定位属性。

今天纠结了一整天的问题,最后被小伙伴一句简简单单的提醒给解决了——实在是要表示感谢,于是就只能写文章了。

其实在早上的时候,我心情就很糟糕,在日记上这样写:

不知道为什么,心就开始空落落的,就像是泄了气的车胎,被不可承重的汽车压得扁扁的,似乎都能听得见它在苟延残喘。我想找出这背后的罪魁祸首,然后鞭尸它。

我首先能想到的犯罪嫌疑人就是工作。我已经不止一次的讨厌它,可又不知道怎么才能逃离它,或者对它报以豁达然后满心欢喜的接收它。它倔强得就像一头牛,我拽着它的鼻子揍它、骂它,怪它不能带我平步青云。所以打心眼里不想喂它草、不想喂它水,可是我却还需要它来耕田。我努力的接受命运,毕竟做个放牛娃,也挺自由自在。可我没有庄子的超然,不能够对楚王的要职报以漠视,所以我希望能够在事业上有所成就…

由于烦,早上就和老板吵了几句,但工作还是要做的,比如说如何解决百度地图无法定位准确的问题。

办公室在河南省洛阳市东方今典天汇中心,所以我以为百度地图的定位应该是“东方今典天汇中心”而不是只到“河南省洛阳市”。

但其实是我在使用百度地图的时候犯下的一个粗心式的错误。

  1. 由于手机不能调试,所以定位服务在通过浏览器调试,本身电脑的IP定位就不是很准确;而我一直在电脑上想当然的找解决办法,结果只能是南辕北辙。

后来我就在群里问小伙伴怎么解决,明智的“岳”同学提醒我“打印出来看一看!!!!!!!!”

对啊,我怎么一直没有把百度地图api返回的对象整体打印出来呢?这可真™够蠢的!

于是打印出来一看,我什么都明白了!!!!!

这里写图片描述

我要的答案是在surroundingPois里的title上!!!!而不是平常的address上!!!!

于是代码重新修正了一番:

var geolocation = new BMap.Geolocation();
geolocation.getCurrentPosition(function(r) {
	if (this.getStatus() == BMAP_STATUS_SUCCESS) {
		var myGeo = new BMap.Geocoder();

		myGeo.getLocation(new BMap.Point(r.point.lng, r.point.lat), function(rs) {
			var lbs_point = '';
			var address = '';
			if (rs.surroundingPois.length > 0) {
				lbs_point = rs.surroundingPois[0].point.lng+","+rs.surroundingPois[0].point.lat;
				address =  rs.surroundingPois[0].title;
			} else {
				lbs_point = rs.point.lng+","+rs.point.lat;
				address = rs.address;
			}
			
			alert(JSON.stringify(rs, null, 4));

	}
}, {
	enableHighAccuracy : true
});

我原来一直愚昧的在从rs.address中取值,而又一直忽略把逆向地址解析的rs对象结果打印出来!!!!

现在,可以准确定位了!!!!!

这里写图片描述


小伙伴简简单单的一句话,却帮我解决了一整天的麻烦!!!

<think>我们正在使用Vue3集成百度地图API实现地图选择功能。根据引用[1]和引用[2]的示例,我们可以总结出以下步骤:1.申请百度地图AK(开发者密钥)2.在项目中引入百度地图JavaScriptAPI(通过<script>标签或动态加载) 3.在Vue组件中创建地图容器(一个具有明确宽高的div)4.在组件的mounted生命周期中初始化地图5.使用百度地图API的事件监听(如click事件)来获取用户点击的坐标点6.将坐标点转换为地址信息(可选,使用逆地理编码) 由于引用[2]是一个Vue3的示例,我们将按照Vue3的Composition API来编写代码。 注意百度地图JavaScriptAPI GL版(BMapGL)是3D地图,我们使用GL版。步骤:1.在public/index.html中引入百度地图API脚本(或者动态加载,这里采用动态加载方式以避免阻塞) 2.在Vue组件中,我们动态创建script标签来加载百度地图API,并在加载完成后初始化地图。3.创建地图容器,设置ref以便操作。 4.在setup中,使用onMounted来执行初始化操作。 但是,由于百度地图API需要先加载完成,我们可以使用一个异步加载的方法。 代码示例:首先,在Vue组件的模板部分,创建一个地图容器: ```html<template><div><divid="map-container" ref="mapContainer"style="width:100%; height:500px;"></div><div>选择的位置:{{selectedAddress}}</div></div> </template>``` 然后,在脚本部分:```javascriptimport{ ref, onMounted} from'vue'; exportdefault {setup() {constmapContainer= ref(null);constselectedAddress= ref('');//用于显示选择的位置的地址letmap= null; //地图实例let geoc =null;//地理编码实例(用于逆地址解析)//动态加载百度地图APIconst loadBMap=() =>{return newPromise((resolve,reject)=> {if(typeofBMapGL!== 'undefined'){resolve(BMapGL);return;}//创建script标签const script= document.createElement('script');script.src =`https://api.map.baidu.com/api?v=3.0&ak=你的百度地图AK&type=webgl&callback=initBMapCallback`;script.async= true;script.defer =true;//定义全局回调函数window.initBMapCallback= ()=> {resolve(BMapGL);};script.onerror= reject;document.head.appendChild(script);});};//初始化地图constinitMap= ()=> {//创建地图实例map =new BMapGL.Map(mapContainer.value);//初始化地图,设置中心点坐标和地图级别const point= newBMapGL.Point(116.404,39.915);map.centerAndZoom(point,12);//启用滚轮缩放map.enableScrollWheelZoom(true);//添加点击事件监听map.addEventListener('click', handleMapClick);//创建地理编码实例geoc =new BMapGL.Geocoder();};//处理地图点击事件const handleMapClick= (e)=> {//e.point是点击的经纬度constpoint =e.point;//使用逆地理编码获取地址信息geoc.getLocation(point,(res) =>{selectedAddress.value =res.address;//这里可以获取到更详细的信息,如res.surroundingPois等});};onMounted(()=> {loadBMap().then(()=> {initMap();}).catch((error) =>{console.error('百度地图加载失败',error);});});return{mapContainer,selectedAddress};} };``` 注意: 1.请将`你的百度地图AK`替换为你在百度地图开放平台申请的AK。2.逆地理编码服务可能会有限制,请确保你的AK开通了相应的服务。 以上代码实现了:-在Vue组件挂载后动态加载百度地图API-初始化地图并设置默认中心点和缩放级别-监听地图点击事件,获取点击位置的经纬度-通过逆地理编码将经纬度转换为地址并显示相关问题: 1.如何在Vue3中动态加载外部JavaScript库? 2.百度地图逆地理编码服务的使用限制是什么?3.如何优化地图加载性能,比如按需加载? 4.如何在地图上标记用户选择的点?</think>以下是在 Vue3 项目中集成百度地图 API 实现地图选择功能的完整代码示例和实现步骤: ### 实现步骤 1. **申请百度地图 AK** - 前往[百度地图开放平台](https://lbsyun.baidu.com/)注册账号 - 创建应用获取 AK(访问应用时需配置白名单) 2. **安装依赖** ```bash npm install vue-baidu-map-3x --save ``` 3. **核心实现代码** ```vue <template> <div class="map-container"> <!-- 地图容器 --> <baidu-map class="bm-view" :center="center" :zoom="zoom" :scroll-wheel-zoom="true" @click="handleMapClick" > <!-- 标记选中的位置 --> <bm-marker :position="markerPoint" v-if="markerPoint.lng" /> </baidu-map> <!-- 地址显示 --> <div class="location-info"> <h3>已选择位置:</h3> <p>经纬度:{{ selectedPoint.lng }}, {{ selectedPoint.lat }}</p> <p>地址:{{ selectedAddress }}</p> </div> </div> </template> <script setup> import { ref } from 'vue'; import { BaiduMap, BmMarker } from 'vue-baidu-map-3x'; // 地图中心点(默认北京) const center = ref({ lng: 116.404, lat: 39.915 }); // 地图缩放级别 const zoom = ref(15); // 标记点坐标 const markerPoint = ref({}); // 选中的坐标点 const selectedPoint = ref({}); // 选中的地址 const selectedAddress = ref(''); // 点击地图事件处理 const handleMapClick = (e) => { const point = e.point; markerPoint.value = point; selectedPoint.value = { lng: point.lng, lat: point.lat }; // 使用逆地理编码获取地址 const geocoder = new BMapGL.Geocoder(); geocoder.getLocation(point, (res) => { selectedAddress.value = res.address; }); }; </script> <style scoped> .map-container { position: relative; } .bm-view { width: 100%; height: 500px; } .location-info { margin-top: 20px; padding: 15px; border: 1px solid #eee; border-radius: 4px; } </style> ``` ### 关键功能说明 1. **地图初始化** - 使用 `<baidu-map>` 组件创建地图容器 - 通过 `center` 和 `zoom` 控制初始位置和缩放级别 - `scroll-wheel-zoom` 启用鼠标滚轮缩放 2. **位置选择** - `@click="handleMapClick"` 监听地图点击事件 - 通过 `e.point` 获取点击位置的经纬度坐标 - 使用 `<bm-marker>` 组件标记选中位置 3. **地址解析** - 使用 `BMapGL.Geocoder()` 进行逆地理编码 - 将经纬度转换为可读的地址信息 - 支持详细地址、行政区划等信息获取 ### 注意事项 1. **AK 安全配置** - 在百度开放平台「安全设置」中添加项目域名/IP - 开发环境可配置 `localhost` 为白名单 2. **组件注册** 在 `main.js` 中全局注册组件: ```javascript import { createApp } from 'vue' import BaiduMap from 'vue-baidu-map-3x' const app = createApp(App) app.use(BaiduMap, { ak: 'YOUR_AK_HERE' // 替换为实际AK }) ``` 3. **高级功能扩展** - 添加搜索框:使用 `BmLocalSearch` 组件 - 自定义标记样式:通过 `icon` 属性设置 - 位置拖拽选择:监听 `markerdragend` 事件 ### 效果演示 用户点击地图任意位置后: 1. 红色标记点显示选中位置 2. 底部信息栏显示经纬度坐标 3. 自动解析并显示详细地址信息 > 完整项目示例:[vue3-baidumap-selection-demo](https://github.com/example/vue3-baidumap-selection-demo) > 官方API文档:[BMapGL Reference](https://lbsyun.baidu.com/cms/jsapi/reference/jsapi_reference_3_0.html)
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉默王二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值