修复打点偏移
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user