From ed6936545d20cc490145d2936cee4387be2afd53 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期一, 22 十二月 2025 19:04:34 +0800
Subject: [PATCH] 优化了导航预览模式

---
 src/gecaoji/Device.java      |   99 +++++++++++++------
 src/gecaoji/Gecaoji.java     |   21 ++++
 dikuai.properties            |   39 +++----
 src/dikuai/daohangyulan.java |   67 +++++++++----
 src/zhuye/MapRenderer.java   |   14 ++
 set.properties               |   10 +-
 src/zhuye/Shouye.java        |   10 ++
 7 files changed, 178 insertions(+), 82 deletions(-)

diff --git a/dikuai.properties b/dikuai.properties
index 256b9de..402f96a 100644
--- a/dikuai.properties
+++ b/dikuai.properties
@@ -1,24 +1,17 @@
 #Dikuai Properties
-#Mon Dec 22 13:08:01 CST 2025
-LAND2.angleThreshold=-1
-LAND2.baseStationCoordinates=3949.89151752,N,11616.79267501,E
-LAND2.boundaryCoordinates=5.38,-6.41;-11.15,-8.94;-12.75,-4.68;-12.23,-3.28;-11.12,-3.17;-9.29,-3.53;-7.46,-3.89;-5.62,-4.25;-3.79,-4.61;-1.96,-4.97;-0.12,-5.33;1.71,-5.69;3.54,-6.05;5.38,-6.41
-LAND2.boundaryOriginalCoordinates=39.831468,116.279941,49.29;39.831465,116.279925,49.33;39.831463,116.279908,49.34;39.831462,116.279891,49.35;39.831461,116.279874,49.33;39.831458,116.279859,49.34;39.831456,116.279843,49.32;39.831454,116.279827,49.32;39.831452,116.279813,49.42;39.831450,116.279798,49.41;39.831448,116.279783,49.36;39.831447,116.279769,49.26;39.831445,116.279757,49.24;39.831445,116.279747,49.38;39.831448,116.279741,49.27;39.831455,116.279736,49.26;39.831463,116.279733,49.26;39.831473,116.279731,49.26;39.831483,116.279729,49.25;39.831491,116.279730,49.26;39.831496,116.279735,49.22;39.831497,116.279748,49.27
-LAND2.boundaryPointInterval=-1
-LAND2.createTime=2025-12-20 12\:24\:28
-LAND2.intelligentSceneAnalysis=-1
-LAND2.landArea=55.11
-LAND2.landName=1452
-LAND2.landNumber=LAND2
-LAND2.mowingBladeWidth=0.40
-LAND2.mowingOverlapDistance=0.06
-LAND2.mowingPattern=骞宠绾�
-LAND2.mowingSafetyDistance=0.50
-LAND2.mowingTrack=-1
-LAND2.mowingWidth=34
-LAND2.plannedPath=-12.031,-3.808;-10.774,-3.615;-9.790,-3.809;-12.167,-4.172;-12.302,-4.537;-8.807,-4.002;-7.823,-4.196;-12.280,-4.878;-12.158,-5.203;-6.838,-4.389;-5.852,-4.582;-12.036,-5.528;-11.914,-5.854;-4.868,-4.775;-3.884,-4.969;-11.792,-6.179;-11.670,-6.504;-2.901,-5.162;-1.917,-5.355;-11.547,-6.829;-11.425,-7.155;-0.931,-5.548;0.055,-5.741;-11.303,-7.480;-11.181,-7.805;1.038,-5.935;2.022,-6.128;-11.059,-8.130;-10.937,-8.456;3.005,-6.322
-LAND2.returnPathCoordinates=38.12,1.53;33.80,0.59;31.15,-0.38;30.26,-1.26;30.03,-2.37;30.34,-5.22;34.16,-26.79;34.23,-28.32;33.75,-29.45;32.72,-30.03;31.41,-30.28;30.15,-30.22;29.26,-29.73;28.93,-28.62;28.01,-22.74
-LAND2.returnPathRawCoordinates=38.12,1.53;36.68,1.24;35.24,0.94;33.80,0.59;32.43,0.16;31.15,-0.38;30.26,-1.26;30.03,-2.37;30.12,-3.81;30.34,-5.22;30.59,-6.60;30.87,-7.98;31.10,-9.36;31.33,-10.77;31.57,-12.20;31.82,-13.68;32.07,-15.16;32.28,-16.60;32.52,-17.92;32.78,-19.37;33.07,-20.80;33.35,-22.37;33.62,-23.91;33.89,-25.35;34.16,-26.79;34.23,-28.32;33.75,-29.45;32.72,-30.03;31.41,-30.28;30.15,-30.22;29.26,-29.73;28.93,-28.62;28.72,-27.16;28.54,-25.66;28.26,-24.17;28.01,-22.74
-LAND2.returnPointCoordinates=-1
-LAND2.updateTime=2025-12-21 11\:15\:33
-LAND2.userId=-1
+#Mon Dec 22 18:52:36 CST 2025
+LAND1.baseStationCoordinates=3949.89151752,N,11616.79267501,E
+LAND1.boundaryCoordinates=2.87,-0.19;6.73,-1.23;22.76,1.06;27.88,3.65;35.84,9.96;38.40,10.35;40.83,9.40;44.09,4.86;43.49,2.92;32.39,0.16;30.22,-1.26;30.00,-2.37;33.85,-25.32;32.30,-24.06;30.75,-22.81;29.20,-21.55;27.65,-20.29;26.11,-19.04;24.56,-17.78;23.01,-16.52;21.46,-15.27;19.91,-14.01;18.36,-12.75;16.81,-11.50;15.26,-10.24;13.72,-8.98;12.17,-7.73;10.62,-6.47;9.07,-5.21;7.52,-3.96;5.97,-2.70;4.42,-1.45;2.87,-0.19
+LAND1.boundaryOriginalCoordinates=39.831524,116.279912,49.30;39.831524,116.279911,49.29;39.831523,116.279911,49.23;39.831521,116.279915,49.31;39.831517,116.279925,49.34;39.831514,116.279940,49.30;39.831514,116.279957,49.28;39.831516,116.279974,49.28;39.831518,116.279991,49.29;39.831521,116.280008,49.24;39.831524,116.280025,49.30;39.831526,116.280042,49.24;39.831529,116.280059,49.29;39.831529,116.280076,49.26;39.831530,116.280093,49.32;39.831531,116.280110,49.28;39.831533,116.280127,49.28;39.831535,116.280144,49.26;39.831539,116.280161,49.27;39.831544,116.280175,49.25;39.831551,116.280190,49.24;39.831558,116.280204,49.26;39.831566,116.280219,49.26;39.831574,116.280234,49.22;39.831583,116.280248,49.24;39.831591,116.280260,49.24;39.831600,116.280272,49.23;39.831608,116.280285,49.18;39.831615,116.280298,49.12;39.831618,116.280312,49.11;39.831618,116.280328,49.12;39.831615,116.280342,49.15;39.831610,116.280356,49.21;39.831602,116.280369,49.23;39.831592,116.280379,49.25;39.831581,116.280388,49.25;39.831569,116.280394,49.19;39.831559,116.280395,49.23;39.831552,116.280387,49.28;39.831547,116.280373,49.32;39.831544,116.280357,49.33;39.831541,116.280340,49.29;39.831539,116.280324,49.27;39.831536,116.280307,49.24;39.831534,116.280290,49.25;39.831531,116.280273,49.26;39.831527,116.280257,49.28;39.831522,116.280242,49.21;39.831514,116.280232,49.28;39.831504,116.280229,49.24;39.831491,116.280230,49.33;39.831478,116.280233,49.34;39.831466,116.280236,49.31;39.831454,116.280239,49.31;39.831441,116.280242,49.26;39.831429,116.280244,49.23;39.831416,116.280247,49.25;39.831402,116.280250,49.22;39.831389,116.280253,49.25;39.831376,116.280256,49.26;39.831364,116.280258,49.24;39.831351,116.280261,49.25;39.831338,116.280265,49.26;39.831324,116.280268,49.20;39.831311,116.280271,49.16;39.831298,116.280274,49.17
+LAND1.boundaryOriginalXY=2.88,-0.19;2.85,-0.19;2.84,-0.28;3.13,-0.43;4.02,-0.92;5.27,-1.24;6.74,-1.23;8.20,-1.02;9.67,-0.79;11.10,-0.46;12.55,-0.12;14.05,0.13;15.51,0.36;16.95,0.41;18.40,0.49;19.82,0.62;21.31,0.81;22.79,1.06;24.17,1.50;25.41,2.13;26.64,2.85;27.91,3.66;29.17,4.56;30.42,5.45;31.60,6.39;32.65,7.37;33.72,8.31;34.76,9.22;35.88,9.97;37.11,10.36;38.44,10.36;39.71,10.04;40.88,9.41;41.96,8.50;42.85,7.41;43.60,6.15;44.14,4.87;44.17,3.71;43.54,2.92;42.33,2.47;40.93,2.10;39.53,1.77;38.12,1.53;36.68,1.24;35.24,0.94;33.80,0.59;32.43,0.16;31.15,-0.38;30.26,-1.26;30.03,-2.37;30.12,-3.81;30.34,-5.22;30.59,-6.60;30.87,-7.98;31.10,-9.36;31.33,-10.77;31.57,-12.20;31.82,-13.68;32.07,-15.16;32.28,-16.60;32.52,-17.92;32.78,-19.37;33.07,-20.80;33.35,-22.37;33.62,-23.91;33.89,-25.35
+LAND1.createTime=2025-12-22 18\:52\:36
+LAND1.landArea=459.07
+LAND1.landName=12344
+LAND1.landNumber=LAND1
+LAND1.mowingBladeWidth=0.40
+LAND1.mowingOverlapDistance=0.06
+LAND1.mowingPattern=骞宠绾�
+LAND1.mowingSafetyDistance=0.50
+LAND1.mowingWidth=34
+LAND1.plannedPath=4.652,-1.162;4.633,-1.048;4.994,-1.145;5.051,-1.483;5.449,-1.805;5.355,-1.243;5.716,-1.340;5.848,-2.126;6.247,-2.448;6.077,-1.437;6.438,-1.535;6.646,-2.773;7.045,-3.097;6.793,-1.595;7.130,-1.547;7.444,-3.422;7.843,-3.746;7.467,-1.499;7.803,-1.450;8.242,-4.067;8.641,-4.389;8.140,-1.402;8.477,-1.354;9.040,-4.710;9.438,-5.033;8.813,-1.306;9.150,-1.258;9.838,-5.357;10.237,-5.682;9.487,-1.210;9.823,-1.162;10.636,-6.006;11.035,-6.331;10.160,-1.114;10.497,-1.066;11.434,-6.655;11.834,-6.980;10.833,-1.018;11.170,-0.969;12.233,-7.304;12.632,-7.627;11.507,-0.921;11.843,-0.873;13.030,-7.948;13.429,-8.270;12.180,-0.825;12.517,-0.777;13.828,-8.592;14.227,-8.917;12.853,-0.729;13.190,-0.681;14.627,-9.244;15.026,-9.571;13.527,-0.633;13.864,-0.585;15.426,-9.898;15.825,-10.223;14.200,-0.537;14.537,-0.488;16.224,-10.547;16.623,-10.872;14.874,-0.440;15.210,-0.392;17.023,-11.196;17.421,-11.518;15.547,-0.344;15.884,-0.296;17.820,-11.839;18.219,-12.161;16.220,-0.248;16.557,-0.200;18.617,-12.482;19.017,-12.807;16.894,-0.152;17.230,-0.104;19.416,-13.131;19.815,-13.456;17.567,-0.056;17.904,-0.008;20.214,-13.780;20.613,-14.105;18.240,0.041;18.577,0.089;21.013,-14.429;21.412,-14.754;18.914,0.137;19.250,0.185;21.811,-15.078;22.209,-15.399;19.587,0.233;19.924,0.281;22.608,-15.721;23.007,-16.042;20.260,0.329;20.597,0.377;23.406,-16.365;23.805,-16.689;20.934,0.425;21.271,0.473;24.204,-17.014;24.603,-17.338;21.607,0.522;21.944,0.570;25.003,-17.663;25.402,-17.987;22.281,0.618;22.617,0.666;25.801,-18.312;26.200,-18.636;22.949,0.741;23.267,0.902;26.599,-18.961;26.998,-19.284;23.585,1.063;23.903,1.223;27.397,-19.608;27.796,-19.932;24.221,1.384;24.538,1.545;28.196,-20.257;28.595,-20.581;24.856,1.706;25.174,1.866;28.994,-20.906;29.393,-21.230;25.492,2.027;25.809,2.188;29.792,-21.555;30.192,-21.879;26.127,2.349;26.445,2.509;30.591,-22.204;30.990,-22.528;26.763,2.670;27.081,2.831;31.389,-22.850;31.787,-23.171;27.398,2.992;27.716,3.152;32.186,-23.493;32.585,-23.815;28.034,3.313;28.340,3.543;32.984,-24.139;29.652,-2.222;28.644,3.784;28.949,4.025;29.839,-1.280;30.117,-0.885;29.253,4.266;29.557,4.507;30.428,-0.682;30.738,-0.479;29.862,4.749;30.166,4.990;31.049,-0.275;31.360,-0.072;30.470,5.231;30.774,5.472;31.670,0.131;31.981,0.335;31.079,5.714;31.383,5.955;32.295,0.517;32.626,0.600;31.687,6.196;31.992,6.437;32.957,0.682;33.288,0.765;32.296,6.678;32.600,6.920;33.619,0.847;33.950,0.929;32.904,7.161;33.209,7.402;34.281,1.011;34.612,1.094;33.513,7.643;33.817,7.884;34.943,1.176;35.274,1.258;34.122,8.126;34.426,8.367;35.605,1.341;35.936,1.423;34.730,8.608;35.034,8.849;36.266,1.505;36.597,1.587;35.339,9.091;35.643,9.332;36.928,1.670;37.259,1.752;35.947,9.573;36.279,9.653;37.590,1.834;37.921,1.917;36.615,9.704;36.951,9.755;38.252,1.999;38.583,2.081;37.287,9.806;37.623,9.857;38.914,2.163;39.245,2.246;37.960,9.909;38.296,9.960;39.576,2.328;39.907,2.410;38.659,9.852;39.028,9.707;40.238,2.493;40.569,2.575;39.396,9.563;39.765,9.419;40.900,2.657;41.231,2.739;40.134,9.275;40.503,9.130;41.562,2.822;41.893,2.904;40.933,8.622;41.383,7.995;42.224,2.986;42.554,3.069;41.833,7.369;42.283,6.742;42.885,3.151;43.210,3.268;42.733,6.116;43.183,5.489;43.434,3.991;43.657,4.714;43.633,4.863
+LAND1.updateTime=2025-12-22 18\:52\:36
diff --git a/set.properties b/set.properties
index b9cecfb..4448c44 100644
--- a/set.properties
+++ b/set.properties
@@ -1,19 +1,19 @@
 #Mower Configuration Properties - Updated
-#Mon Dec 22 18:50:02 CST 2025
+#Mon Dec 22 19:03:58 CST 2025
 appVersion=-1
 boundaryLengthVisible=false
-currentWorkLandNumber=LAND2
+currentWorkLandNumber=LAND1
 cuttingWidth=200
 firmwareVersion=-1
 handheldMarkerId=1872
 idleTrailDurationSeconds=60
 manualBoundaryDrawingMode=false
-mapScale=16.74
+mapScale=11.18
 measurementModeEnabled=false
 mowerId=860
 serialAutoConnect=true
 serialBaudRate=115200
 serialPortName=COM15
 simCardNumber=-1
-viewCenterX=4.67
-viewCenterY=0.55
+viewCenterX=-21.01
+viewCenterY=3.68
diff --git a/src/dikuai/daohangyulan.java b/src/dikuai/daohangyulan.java
index edfc655..ec51972 100644
--- a/src/dikuai/daohangyulan.java
+++ b/src/dikuai/daohangyulan.java
@@ -363,43 +363,67 @@
             return;
         }
         
-        Point2D.Double targetPoint = pathPoints.get(currentPathIndex + 1);
-        
-        // 璁$畻鍒扮洰鏍囩偣鐨勮窛绂�
-        double dx = targetPoint.x - currentPos.x;
-        double dy = targetPoint.y - currentPos.y;
-        double distance = Math.hypot(dx, dy);
-        
         // 璁$畻姣忓抚绉诲姩鐨勮窛绂伙紙绫筹級
         double moveDistance = currentSpeed * (TIMER_INTERVAL_MS / 1000.0);
         
-        if (distance <= moveDistance) {
-            // 鍒拌揪鐩爣鐐癸紝绉诲姩鍒颁笅涓�涓偣
-            mower.setPosition(targetPoint.x, targetPoint.y);
-            navigationTrack.add(new Point2D.Double(targetPoint.x, targetPoint.y));
-            mapRenderer.addNavigationPreviewTrackPoint(targetPoint);
+        // 鍒拌揪闃堝�硷細褰撹窛绂诲皬浜庤繖涓�兼椂锛岃涓哄凡鍒拌揪鐩爣鐐癸紙0.05绫筹級
+        double arrivalThreshold = 0.05;
+        
+        // 寰幆澶勭悊锛岀洿鍒扮Щ鍔ㄨ窛绂荤敤瀹屾垨鍒拌揪璺緞缁堢偣
+        double remainingDistance = moveDistance;
+        
+        while (remainingDistance > 0.001 && currentPathIndex < pathPoints.size() - 1) {
+            Point2D.Double targetPoint = pathPoints.get(currentPathIndex + 1);
             
-            currentPathIndex++;
+            // 璁$畻鍒扮洰鏍囩偣鐨勮窛绂�
+            double dx = targetPoint.x - currentPos.x;
+            double dy = targetPoint.y - currentPos.y;
+            double distance = Math.hypot(dx, dy);
             
-            // 濡傛灉杩樻湁涓嬩竴涓偣锛岃绠楁柟鍚�
-            if (currentPathIndex < pathPoints.size() - 1) {
-                Point2D.Double nextPoint = pathPoints.get(currentPathIndex + 1);
-                double heading = calculateHeading(targetPoint, nextPoint);
-                setMowerHeading(heading);
+            // 濡傛灉璺濈灏忎簬鍒拌揪闃堝�硷紝璁や负宸插埌杈剧洰鏍囩偣锛岀Щ鍔ㄥ埌涓嬩竴涓偣
+            if (distance <= arrivalThreshold) {
+                // 鍒拌揪鐩爣鐐癸紝绉诲姩鍒扮簿纭綅缃�
+                mower.setPosition(targetPoint.x, targetPoint.y);
+                navigationTrack.add(new Point2D.Double(targetPoint.x, targetPoint.y));
+                mapRenderer.addNavigationPreviewTrackPoint(targetPoint);
+                
+                currentPos = new Point2D.Double(targetPoint.x, targetPoint.y);
+                currentPathIndex++;
+                
+                // 濡傛灉杩樻湁涓嬩竴涓偣锛屾洿鏂版柟鍚�
+                if (currentPathIndex < pathPoints.size() - 1) {
+                    Point2D.Double nextPoint = pathPoints.get(currentPathIndex + 1);
+                    double heading = calculateHeading(targetPoint, nextPoint);
+                    setMowerHeading(heading);
+                }
+                
+                // 缁х画澶勭悊鍓╀綑鐨勭Щ鍔ㄨ窛绂�
+                continue;
             }
-        } else {
+            
             // 鍚戠洰鏍囩偣绉诲姩
-            // 鍏堟洿鏂版柟鍚戯紝纭繚杞﹀ご鏈濆悜鐩爣鐐�
+            // 璁$畻鏈瀹為檯绉诲姩鐨勮窛绂伙紙涓嶈秴杩囧墿浣欒窛绂诲拰鍒扮洰鏍囩偣鐨勮窛绂伙級
+            double actualMoveDistance = Math.min(remainingDistance, distance);
+            
+            // 鏇存柊鏂瑰悜锛岀‘淇濊溅澶存湞鍚戠洰鏍囩偣
             double heading = calculateHeading(currentPos, targetPoint);
             setMowerHeading(heading);
             
-            double ratio = moveDistance / distance;
+            // 璁$畻鏂颁綅缃�
+            double ratio = actualMoveDistance / distance;
             double newX = currentPos.x + dx * ratio;
             double newY = currentPos.y + dy * ratio;
             
             mower.setPosition(newX, newY);
             navigationTrack.add(new Point2D.Double(newX, newY));
             mapRenderer.addNavigationPreviewTrackPoint(new Point2D.Double(newX, newY));
+            
+            // 鏇存柊褰撳墠浣嶇疆鍜屽墿浣欒窛绂�
+            currentPos = new Point2D.Double(newX, newY);
+            remainingDistance -= actualMoveDistance;
+            
+            // 濡傛灉宸茬粡鍒拌揪鐩爣鐐归檮杩戯紙璺濈灏忎簬闃堝�硷級锛屽湪涓嬫寰幆涓細澶勭悊
+            // 缁х画寰幆澶勭悊鍓╀綑鐨勭Щ鍔ㄨ窛绂�
         }
         
         // 鏇存柊閫熷害鏄剧ず鍒板湴鍥炬覆鏌撳櫒
@@ -548,3 +572,4 @@
 }
 
 
+
diff --git a/src/gecaoji/Device.java b/src/gecaoji/Device.java
index 97a3333..9e26eff 100644
--- a/src/gecaoji/Device.java
+++ b/src/gecaoji/Device.java
@@ -417,25 +417,38 @@
             mowerNumber = incomingDeviceId;
         }
 
+        // 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮�
+        boolean isNavigating = checkIfNavigating();
+
         String latitudeValue = sanitizeField(fields, 2);
         String latitudeHemisphere = sanitizeField(fields, 3);
         String longitudeValue = sanitizeField(fields, 4);
         String longitudeHemisphere = sanitizeField(fields, 5);
 
-        String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere);
-        if (hasMeaningfulValue(combinedLatitude)) {
-            realtimeLatitude = combinedLatitude;
-        }
-        String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere);
-        if (hasMeaningfulValue(combinedLongitude)) {
-            realtimeLongitude = combinedLongitude;
+        // 鍙湁鍦ㄩ潪瀵艰埅棰勮妯″紡涓嬫墠鏇存柊浣嶇疆鐩稿叧鏁版嵁
+        if (!isNavigating) {
+            String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere);
+            if (hasMeaningfulValue(combinedLatitude)) {
+                realtimeLatitude = combinedLatitude;
+            }
+            String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere);
+            if (hasMeaningfulValue(combinedLongitude)) {
+                realtimeLongitude = combinedLongitude;
+            }
+
+            String altitudeValue = sanitizeField(fields, 9);
+            if (hasMeaningfulValue(altitudeValue)) {
+                realtimeAltitude = altitudeValue;
+            }
+
+            // 鏇存柊浣嶇疆鍧愭爣
+            updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere);
+            
+            // 鏇存柊鑸悜瑙掞紙浣嶇疆鐩稿叧锛�
+            heading = defaultIfEmpty(sanitizeField(fields, 19));
         }
 
-        String altitudeValue = sanitizeField(fields, 9);
-        if (hasMeaningfulValue(altitudeValue)) {
-            realtimeAltitude = altitudeValue;
-        }
-
+        // 鍏朵粬鏁版嵁锛堢數閲忋�佸崼鏄熸暟绛夛級濮嬬粓鏇存柊
         positioningStatus = defaultIfEmpty(sanitizeField(fields, 6));
         // 鍚屾鍒扮粯鍒舵ā鍧楃殑鏁版嵁婧愶紝淇濊瘉寰�杩旂粯鍒跺畾鏃跺櫒鑳借瘑鍒畾浣嶈川閲�
         try {
@@ -448,10 +461,7 @@
         battery = defaultIfEmpty(sanitizeField(fields, 16));
         pitch = defaultIfEmpty(sanitizeField(fields, 17));
         realtimeSpeed = defaultIfEmpty(sanitizeField(fields, 18));
-        heading = defaultIfEmpty(sanitizeField(fields, 19));
         GupdateTime = String.valueOf(System.currentTimeMillis());
-
-        updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere);
     }
     
     /**涓插彛鏇存柊GNGGA鏁版嵁*/
@@ -471,26 +481,38 @@
             return;
         }
 
-        
+        // 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮�
+        boolean isNavigating = checkIfNavigating();
+
         String latitudeValue = sanitizeField(fields, 2);
         String latitudeHemisphere = sanitizeField(fields, 3);
         String longitudeValue = sanitizeField(fields, 4);
         String longitudeHemisphere = sanitizeField(fields, 5);
 
-        String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere);
-        if (hasMeaningfulValue(combinedLatitude)) {
-            realtimeLatitude = combinedLatitude;
-        }
-        String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere);
-        if (hasMeaningfulValue(combinedLongitude)) {
-            realtimeLongitude = combinedLongitude;
+        // 鍙湁鍦ㄩ潪瀵艰埅棰勮妯″紡涓嬫墠鏇存柊浣嶇疆鐩稿叧鏁版嵁
+        if (!isNavigating) {
+            String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere);
+            if (hasMeaningfulValue(combinedLatitude)) {
+                realtimeLatitude = combinedLatitude;
+            }
+            String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere);
+            if (hasMeaningfulValue(combinedLongitude)) {
+                realtimeLongitude = combinedLongitude;
+            }
+
+            String altitudeValue = sanitizeField(fields, 9);
+            if (hasMeaningfulValue(altitudeValue)) {
+                realtimeAltitude = altitudeValue;
+            }
+
+            // 鏇存柊浣嶇疆鍧愭爣
+            updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere);
+            
+            // 涓插彛鏀跺埌GNGGA鏁版嵁鍚庯紝瑙﹀彂鎷栧熬鏇存柊
+            notifyMowerTrailUpdate();
         }
 
-        String altitudeValue = sanitizeField(fields, 9);
-        if (hasMeaningfulValue(altitudeValue)) {
-            realtimeAltitude = altitudeValue;
-        }
-
+        // 鍏朵粬鏁版嵁锛堢數閲忋�佸崼鏄熸暟绛夛級濮嬬粓鏇存柊
         positioningStatus = defaultIfEmpty(sanitizeField(fields, 6));
         // 鍚屾鍒扮粯鍒舵ā鍧楃殑鏁版嵁婧愶紝淇濊瘉寰�杩旂粯鍒跺畾鏃跺櫒鑳借瘑鍒畾浣嶈川閲�
         try {
@@ -502,17 +524,28 @@
         differentialAge = defaultIfEmpty(sanitizeField(fields, 13));       
         realtimeSpeed ="0";        
         GupdateTime = String.valueOf(System.currentTimeMillis());
-
-        updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere);
-        
-        // 涓插彛鏀跺埌GNGGA鏁版嵁鍚庯紝瑙﹀彂鎷栧熬鏇存柊
-        notifyMowerTrailUpdate();
     }
     
     /**
      * 閫氱煡鍦板浘娓叉煋鍣ㄦ洿鏂板壊鑽夋満鎷栧熬
      * 褰撲覆鍙f敹鍒癎NGGA鏁版嵁骞舵洿鏂颁綅缃悗璋冪敤
      */
+    /**
+     * 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮�
+     * @return 濡傛灉姝e湪瀵艰埅棰勮杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+     */
+    private boolean checkIfNavigating() {
+        try {
+            dikuai.daohangyulan nav = dikuai.daohangyulan.getInstance();
+            if (nav != null) {
+                return nav.isNavigating();
+            }
+        } catch (Exception e) {
+            // 濡傛灉鑾峰彇瀵艰埅瀹炰緥澶辫触锛岃繑鍥瀎alse锛堜笉褰卞搷涓昏鍔熻兘锛�
+        }
+        return false;
+    }
+    
     private void notifyMowerTrailUpdate() {
         try {
             // 閫氳繃Shouye.getInstance()鑾峰彇瀹炰緥锛岄伩鍏嶅惊鐜緷璧�
diff --git a/src/gecaoji/Gecaoji.java b/src/gecaoji/Gecaoji.java
index e89222a..d47353c 100644
--- a/src/gecaoji/Gecaoji.java
+++ b/src/gecaoji/Gecaoji.java
@@ -49,6 +49,11 @@
     }
 
     public void refreshFromDevice() {
+        // 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮忥紝濡傛灉鏄垯涓嶆洿鏂颁綅缃�
+        if (isNavigating()) {
+            return;
+        }
+        
         Device device = Device.getGecaoji();
         if (device == null) {
             positionValid = false;
@@ -69,6 +74,22 @@
         positionValid = true;
         headingDegrees = heading;
     }
+    
+    /**
+     * 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮�
+     * @return 濡傛灉姝e湪瀵艰埅棰勮杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+     */
+    private boolean isNavigating() {
+        try {
+            dikuai.daohangyulan nav = dikuai.daohangyulan.getInstance();
+            if (nav != null) {
+                return nav.isNavigating();
+            }
+        } catch (Exception e) {
+            // 濡傛灉鑾峰彇瀵艰埅瀹炰緥澶辫触锛岃繑鍥瀎alse锛堜笉褰卞搷涓昏鍔熻兘锛�
+        }
+        return false;
+    }
 
     private void ensurePosition() {
         if (position == null) {
diff --git a/src/zhuye/MapRenderer.java b/src/zhuye/MapRenderer.java
index 0d6e8d2..1eb0bd2 100644
--- a/src/zhuye/MapRenderer.java
+++ b/src/zhuye/MapRenderer.java
@@ -3064,6 +3064,20 @@
     }
     
     /**
+     * 璁剧疆鎷栧熬鎶戝埗鐘舵��
+     * @param suppressed true琛ㄧず鎶戝埗鎷栧熬缁樺埗锛宖alse琛ㄧず鍏佽鎷栧熬缁樺埗
+     */
+    public void setIdleTrailSuppressed(boolean suppressed) {
+        idleTrailSuppressed = suppressed;
+        if (suppressed && !idleMowerTrail.isEmpty()) {
+            clearIdleMowerTrail();
+        }
+        if (visualizationPanel != null) {
+            visualizationPanel.repaint();
+        }
+    }
+    
+    /**
      * 娣诲姞寰�杩旇矾寰勭偣锛堝凡搴熷純锛岃矾寰勭偣鐢� WangfanDraw 鐩存帴绠$悊锛�
      */
     @Deprecated
diff --git a/src/zhuye/Shouye.java b/src/zhuye/Shouye.java
index 10832fe..8162334 100644
--- a/src/zhuye/Shouye.java
+++ b/src/zhuye/Shouye.java
@@ -4315,6 +4315,11 @@
         // 璁剧疆杈圭晫棰勮
         shouye.mapRenderer.setBoundaryPreview(originalBoundaryXY, optimizedBoundary);
         
+        // 鍋滄缁樺埗鍓茶崏鏈哄疄鏃舵嫋灏�
+        if (shouye.mapRenderer != null) {
+            shouye.mapRenderer.setIdleTrailSuppressed(true);
+        }
+        
         // 璁剧疆杩斿洖鍥炶皟
         shouye.pathPreviewReturnAction = returnCallback;
         shouye.pathPreviewActive = true;
@@ -4362,6 +4367,11 @@
     private void exitBoundaryPreview() {
         pathPreviewActive = false;
         
+        // 鎭㈠缁樺埗鍓茶崏鏈哄疄鏃舵嫋灏�
+        if (mapRenderer != null) {
+            mapRenderer.setIdleTrailSuppressed(false);
+        }
+        
         // 娓呴櫎杈圭晫棰勮
         if (mapRenderer != null) {
             mapRenderer.clearBoundaryPreview();

--
Gitblit v1.10.0