修复打点偏移

This commit is contained in:
mmc
2026-03-11 12:54:42 +08:00
parent 97891d45ba
commit a75a06d6d0

View File

@@ -201,6 +201,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
}
});
}
// 新增:手动清除本地存储数据
Future<void> _clearLocalData() async {
try {
@@ -1443,13 +1444,8 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
// 步骤2:将 List 转换为 Queue(队列)
debugPrint('⚙️ 开始类型转换...');
final List<work_area_model.DeviceAddPathPointModel> typedList = startWorkList
.whereType<Map<String, dynamic>>()
.map((item) {
return work_area_model.DeviceAddPathPointModel(
latitude: (item['lat'] as num).toDouble(),
longitude: (item['lon'] as num).toDouble(),
);
final List<work_area_model.DeviceAddPathPointModel> typedList = startWorkList.whereType<Map<String, dynamic>>().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<work_area_model.DeviceAddPathPointModel> 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) {