From 82b6327b1743d5e52ea0ff6a718b09fa15ab7d3d Mon Sep 17 00:00:00 2001 From: cwchen <1048842385@qq.com> Date: Wed, 14 Jan 2026 13:38:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E4=BF=A1=E6=81=AF=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/static/map.html | 115 ++++++++++++-------------------------------- 1 file changed, 31 insertions(+), 84 deletions(-) diff --git a/src/static/map.html b/src/static/map.html index 21ecd40..0bcd093 100644 --- a/src/static/map.html +++ b/src/static/map.html @@ -532,22 +532,19 @@ * 初始化定位跟踪 */ initLocationTracking() { - // 检查浏览器是否支持定位 - if (!navigator.geolocation) { - console.warn('浏览器不支持地理定位'); - return; - } - - // 等待地图和Convertor库加载完成 - if (!this.map) { + // 等待地图加载完成 + if (!this.map || !this.state.mapLoaded) { + console.log('等待地图加载完成...'); setTimeout(() => this.initLocationTracking(), 200); return; } + console.log('地图已加载完成,开始初始化定位功能'); + // 创建定位标记图标(带方向的箭头) this.createLocationIcon(); - // 开始监听位置变化 + // 开始监听位置变化(异步获取位置,不会立即有位置信息) this.startWatchingPosition(); // 开始监听设备方向变化 @@ -595,19 +592,12 @@ * 开始监听位置变化 */ startWatchingPosition() { - // 优先使用百度地图SDK定位(直接返回BD09坐标,最准确) + // 只使用百度地图SDK定位 if (typeof BMapGL !== 'undefined' && BMapGL.Geolocation) { - console.log('使用百度地图SDK辅助定位API(优先)'); + console.log('使用百度地图SDK辅助定位API'); this.startBaiduGeolocation(); - } else if (typeof uni !== 'undefined' && uni.getLocation) { - console.log('使用uni-app GPS定位API(WGS84)'); - this.startUniAppGPSGeolocation(); - } else if (typeof plus !== 'undefined' && plus.geolocation) { - console.log('使用5+定位API'); - this.startPlusGeolocation(); } else { - console.log('使用浏览器定位API'); - this.startBrowserGeolocation(); + console.error('百度地图定位API不可用,请检查BMapGL.Geolocation是否已加载'); } }, @@ -655,13 +645,6 @@ return; } - // 如果精度仍然很差(大于100米),切换到GPS定位 - if (accuracy > 100 && typeof uni !== 'undefined' && uni.getLocation) { - console.warn('百度定位精度较差(' + accuracy + '米),切换到GPS定位'); - this.startUniAppGPSGeolocation(); - return; - } - this.state.currentLocation = { lng: point.lng, lat: point.lat, @@ -674,9 +657,12 @@ this.updateLocationMarker(); } else { console.error('百度定位返回无效坐标:', point); - // 降级到uni-app定位 - if (typeof uni !== 'undefined' && uni.getLocation) { - this.startUniAppGPSGeolocation(); + // 如果失败且还有重试次数,继续重试 + if (retryCount < maxRetries) { + retryCount++; + console.log(`坐标无效,重试 (${retryCount}/${maxRetries})`); + setTimeout(tryGetPosition, 2000); + return; } } } else { @@ -688,13 +674,7 @@ return; } - console.warn('百度地图定位失败,状态:', status, '尝试备用方案'); - // 降级到uni-app定位 - if (typeof uni !== 'undefined' && uni.getLocation) { - this.startUniAppGPSGeolocation(); - } else { - this.startBrowserGeolocation(); - } + console.error('百度地图定位失败,状态:', status, '已达到最大重试次数'); } }, { enableHighAccuracy: true, @@ -716,14 +696,6 @@ if (point.lng && point.lat && !isNaN(point.lng) && !isNaN(point.lat) && Math.abs(point.lng) <= 180 && Math.abs(point.lat) <= 90) { - // 如果精度太差(大于100米),切换到GPS定位 - if (accuracy > 100 && typeof uni !== 'undefined' && uni.getLocation) { - console.warn('百度定位精度持续较差(' + accuracy + '米),切换到GPS定位'); - clearInterval(this.state.watchLocationTimer); - this.startUniAppGPSGeolocation(); - return; - } - // 只更新精度更好的位置(精度提升超过10米,或者精度小于50米) if (!this.state.currentLocation || (accuracy < this.state.currentLocation.accuracy - 10) || @@ -1247,14 +1219,15 @@ * 更新定位标记 */ updateLocationMarker() { - // 确保地图已加载完成且有位置信息 + // 确保地图已加载完成 if (!this.map || !this.state.mapLoaded) { - console.warn('无法更新定位标记:地图未加载完成'); + // 静默返回,不输出警告(地图可能还在加载中) return; } + // 如果没有位置信息,静默返回(定位是异步的,需要时间获取) if (!this.state.currentLocation) { - console.warn('无法更新定位标记:位置信息缺失'); + // 不输出警告,因为定位是异步过程,这是正常情况 return; } @@ -1297,41 +1270,9 @@ return; } - // 如果没有当前位置,尝试获取一次 - if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition( - (position) => { - const { latitude, longitude } = position.coords; - - // 将WGS84坐标转换为百度BD09坐标 - this.wgs84ToBd09(longitude, latitude, (bd09) => { - const point = new BMapGL.Point(bd09.lng, bd09.lat); - this.map.centerAndZoom(point, 18); - - // 更新当前位置(使用转换后的坐标) - this.state.currentLocation = { - lat: bd09.lat, - lng: bd09.lng, - accuracy: position.coords.accuracy || 0 - }; - - // 更新标记 - this.updateLocationMarker(); - }); - }, - (error) => { - console.warn('获取当前位置失败:', error); - alert('无法获取当前位置,请检查定位权限设置'); - }, - { - enableHighAccuracy: true, - timeout: 10000, - maximumAge: 0 - } - ); - } else { - alert('浏览器不支持定位功能'); - } + // 如果没有当前位置,提示用户等待定位 + console.warn('当前位置尚未获取,请等待定位完成'); + alert('正在获取当前位置,请稍候...'); }, /** @@ -1460,7 +1401,10 @@ if (Math.abs(newHeading - this.state.currentHeading) > 1) { this.state.currentHeading = newHeading; console.log('方向更新(来自Compass):', newHeading); - this.updateLocationMarker(); + // 只有在有位置信息时才更新标记 + if (this.state.currentLocation) { + this.updateLocationMarker(); + } } }, (error) => console.error('获取方向失败:', error), @@ -1493,7 +1437,10 @@ if (Math.abs(newHeading - oldHeading) > 1 || oldHeading === 0) { this.state.currentHeading = newHeading; console.log('方向更新:', newHeading, '度'); - this.updateLocationMarker(); + // 只有在有位置信息时才更新标记 + if (this.state.currentLocation) { + this.updateLocationMarker(); + } } } },