From a75a06d6d042d9c86513c13ef324afb1829a405a Mon Sep 17 00:00:00 2001 From: mmc <1556375442@qq.com> Date: Wed, 11 Mar 2026 12:54:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E7=82=B9=E5=81=8F?= =?UTF-8?q?=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../widgets/map/testmap_pages.dart | 58 +++++++++++++------ 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/lib/features/home/presentation/widgets/map/testmap_pages.dart b/lib/features/home/presentation/widgets/map/testmap_pages.dart index 49cd2a36..5510f4da 100644 --- a/lib/features/home/presentation/widgets/map/testmap_pages.dart +++ b/lib/features/home/presentation/widgets/map/testmap_pages.dart @@ -201,6 +201,7 @@ class _MapPageEnterpriseState extends State { } }); } + // 新增:手动清除本地存储数据 Future _clearLocalData() async { try { @@ -1443,13 +1444,8 @@ class _MapPageEnterpriseState extends State { // 步骤2:将 List 转换为 Queue(队列) debugPrint('⚙️ 开始类型转换...'); - final List typedList = startWorkList - .whereType>() - .map((item) { - return work_area_model.DeviceAddPathPointModel( - latitude: (item['lat'] as num).toDouble(), - longitude: (item['lon'] as num).toDouble(), - ); + final List typedList = startWorkList.whereType>().map((item) { + return work_area_model.DeviceAddPathPointModel(latitude: (item['lat'] as num).toDouble(), longitude: (item['lon'] as num).toDouble()); }).toList(); debugPrint('✅ 类型转换成功,长度:${typedList.length}'); final Queue pathQueue = Queue.from(typedList); @@ -2406,22 +2402,46 @@ double _safeToDouble(dynamic value) { return 0.0; } -LatLng gcj02ToWgs84(double lat, double lon) { +LatLng gcj02ToWgs84(double lat, double lon, {int iterations = 10}) { + //if (_outOfChina(lat, lon)) { + // return LatLng(lat, lon); + //} + + //double dLat = _transformLat(lon - 105.0, lat - 35.0); + //double dLon = _transformLon(lon - 105.0, lat - 35.0); + //double radLat = lat / 180.0 * _pi; + //double magic = sin(radLat); + //magic = 1 - _ee * magic * magic; + //double sqrtMagic = sqrt(magic); + //dLat = (dLat * 180.0) / ((_a * (1 - _ee)) / (magic * sqrtMagic) * _pi); + //dLon = (dLon * 180.0) / (_a / sqrtMagic * cos(radLat) * _pi); + //double mgLat = lat - dLat; + //double mgLon = lon - dLon; + //return LatLng(mgLat, mgLon); if (_outOfChina(lat, lon)) { return LatLng(lat, lon); } - double dLat = _transformLat(lon - 105.0, lat - 35.0); - double dLon = _transformLon(lon - 105.0, lat - 35.0); - double radLat = lat / 180.0 * _pi; - double magic = sin(radLat); - magic = 1 - _ee * magic * magic; - double sqrtMagic = sqrt(magic); - dLat = (dLat * 180.0) / ((_a * (1 - _ee)) / (magic * sqrtMagic) * _pi); - dLon = (dLon * 180.0) / (_a / sqrtMagic * cos(radLat) * _pi); - double mgLat = lat - dLat; - double mgLon = lon - dLon; - return LatLng(mgLat, mgLon); + double initLat = lat; + double initLon = lon; + double delta = 1e-6; // 迭代精度(约0.1米) + + for (int i = 0; i < iterations; i++) { + // 1. 用当前猜测值计算GCJ02坐标 + LatLng gcjGuess = wgs84ToGcj02(initLat, initLon); + // 2. 计算与原始GCJ02的差值 + double dLat = gcjGuess.latitude - lat; + double dLon = gcjGuess.longitude - lon; + // 3. 修正猜测值 + initLat -= dLat; + initLon -= dLon; + // 4. 精度达标则提前退出 + if (sqrt(dLat * dLat + dLon * dLon) < delta) { + break; + } + } + + return LatLng(initLat, initLon); } bool _outOfChina(double lat, double lon) {