diff --git a/lib/features/home/presentation/widgets/map/testmap_pages.dart b/lib/features/home/presentation/widgets/map/testmap_pages.dart index df055b92..94591b64 100644 --- a/lib/features/home/presentation/widgets/map/testmap_pages.dart +++ b/lib/features/home/presentation/widgets/map/testmap_pages.dart @@ -640,11 +640,8 @@ class _MapPageEnterpriseState extends State { Future _handleRefresh() async { // 防止重复刷新 if (_isRefreshing) return; - // 🔥 保存当前定位(刷新前先记录) - final savedCurrentLatLng = _currentLatLng; - final savedCurrentWgsLatLng = _currentWgsLatLng; - final savedMapCenter = _mapCenter; - + // 🔥 修复1:保存当前有效的地图中心和缩放级别(而非定位坐标) + final savedZoom = _mapController.camera?.zoom ?? 17.0; setState(() { _isRefreshing = true; // 标记开始刷新 }); @@ -677,16 +674,17 @@ class _MapPageEnterpriseState extends State { _selectedPlotPath = null; // 重置作业模式 - _currentRobotMode = RobotMode.point; + _currentRobotMode = RobotMode.robot; _currentAreaMode = AreaMode.work; _currentWorkMode = WorkMode.bow; // 重置参数 _workDistance = 0.0; _angle = 0.0; - _currentLatLng = savedCurrentLatLng; - _currentWgsLatLng = savedCurrentWgsLatLng; - _mapCenter = savedMapCenter ?? _currentLatLng ?? const LatLng(39.9042, 116.4074); + // 🔥 修复2:优先恢复地图中心,而非定位坐标 + _currentLatLng = null; + _currentWgsLatLng = null; + _mapCenter = _getDefaultValidCenter(); // 仅用兜底坐标初始化地图中心 }); // 3. 重新初始化定位 @@ -694,6 +692,16 @@ class _MapPageEnterpriseState extends State { // 4. 重置轨迹管理器 _traceManager.reset(); + if (_isValidLatLng(_mapCenter.latitude, _mapCenter.longitude)) { + _mapController.move(_mapCenter, savedZoom); + } else { + // 使用兜底的有效坐标(确保在高德瓦片覆盖范围内) + final defaultCenter = _getDefaultValidCenter(); + _mapController.move(defaultCenter, 17.0); + _currentLatLng = null; + _currentWgsLatLng = null; + _mapCenter = defaultCenter; + } // 5. 重新加载作业记录(保持数据最新) // final userId = context.read().state.user?.userId ?? ""; @@ -701,12 +709,7 @@ class _MapPageEnterpriseState extends State { // await context.read().loadWorkRecords(userId); // } - if (savedCurrentLatLng != null) { - _mapController.move(savedCurrentLatLng, _mapController.camera?.zoom ?? 17); - } else { - _mapController.move(const LatLng(39.9042, 116.4074), 17); - } - + _mapController.move(_getDefaultValidCenter(), savedZoom); // 刷新成功提示 if (mounted) { ToastUtils.showSuccess(context, '页面已刷新完成'); @@ -1169,19 +1172,32 @@ class _MapPageEnterpriseState extends State { ); } + LatLng _getDefaultValidCenter() { + return const LatLng(30.279651, 120.154871); + } + Widget _buildMap(double lat, double lng, bool obfFlag, int headingStatus, String controlMode) { if (lat != 0 && lat != 0 && (lat != _currentLatLng?.latitude || lng != _currentLatLng?.longitude)) { _onDeviceData(lng, lat, obfFlag, headingStatus, controlMode); } final gcjPoint = wgs84ToGcj02(lat, lng); - final initCenter = bd09ToGcj02( - '120.81992468426961', // 经度 - '32.04532826114155', - ); + //final initCenter = bd09ToGcj02( + // '120.81992468426961', // 经度 + // '32.04532826114155', + //); + + // 🔥 修复1:初始化坐标改为直接使用有效GCJ02坐标,避免BD09转换风险 + final initCenter = _getDefaultValidCenter(); _currentWgsLatLng = LatLng(lat, lng); - _currentLatLng = gcjPoint; // ✅ 状态变量在setState内更新 + //_currentLatLng = gcjPoint; // ✅ 状态变量在setState内更新 + if (_isValidLatLng(gcjPoint.latitude, gcjPoint.longitude)) { + _currentLatLng = gcjPoint; + } else { + _currentLatLng = null; + } + return FlutterMap( mapController: _mapController, options: MapOptions( @@ -1195,17 +1211,22 @@ class _MapPageEnterpriseState extends State { ), children: [ /// 高德瓦片(GCJ-02) - Transform.scale( - scale: 1.5, // 地图背景放大1.5倍(可调整:1.2/1.3/1.5) - alignment: Alignment.center, // 以地图中心为缩放原点,避免偏移 - child: TileLayer( - urlTemplate: - 'https://webrd02.is.autonavi.com/appmaptile' - '?style=8&x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1' // 高清瓦片保证放大后不模糊 - '&key=bbb1f0f20eed6bf679eddf2625630aba', - tileProvider: NetworkTileProvider(headers: {'Referer': 'https://www.amap.com'}), - maxZoom: 18, + TileLayer( + urlTemplate: + "https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=2&style=7&key=bbb1f0f20eed6bf679eddf2625630aba", + // urlTemplate: + // 'https://webrd02.is.autonavi.com/appmaptile' + // '?style=8&x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1' + // '&key=bbb1f0f20eed6bf679eddf2625630aba', + // 🔥 修复:适配高DPI(替代pixelRatio) + // tileSize: 512, // 高清瓦片尺寸(默认256,改为512适配scale=2) + tileProvider: NetworkTileProvider( + // 自定义瓦片请求头(可选,提升兼容性) + headers: { + 'Referer': 'https://www.amap.com', // 高德要求的Referer + }, ), + maxZoom: 18, ), // 绘制path折线(Line模式)