From 5b685e9066ccfbc432c29739b5524f1d42a20891 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期一, 22 十二月 2025 19:37:30 +0800
Subject: [PATCH] 进一步优化边界管理页面功能

---
 dikuai.properties                |   14 +
 src/zhuye/MapRenderer.java       |  185 ++++++++++++++++++++++
 set.properties                   |    8 
 src/dikuai/Dikuanbianjipage.java |   56 ++----
 src/zhuye/Shouye.java            |   25 +++
 src/bianjie/bianjieguihua2.java  |  170 +++++++++++++++++++++
 6 files changed, 414 insertions(+), 44 deletions(-)

diff --git a/dikuai.properties b/dikuai.properties
index 402f96a..d127bfa 100644
--- a/dikuai.properties
+++ b/dikuai.properties
@@ -1,10 +1,13 @@
 #Dikuai Properties
-#Mon Dec 22 18:52:36 CST 2025
+#Mon Dec 22 19:37:01 CST 2025
+LAND1.angleThreshold=-1
 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.boundaryCoordinates=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;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.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.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.boundaryPointInterval=-1
 LAND1.createTime=2025-12-22 18\:52\:36
+LAND1.intelligentSceneAnalysis=-1
 LAND1.landArea=459.07
 LAND1.landName=12344
 LAND1.landNumber=LAND1
@@ -12,6 +15,11 @@
 LAND1.mowingOverlapDistance=0.06
 LAND1.mowingPattern=骞宠绾�
 LAND1.mowingSafetyDistance=0.50
+LAND1.mowingTrack=-1
 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
+LAND1.returnPathCoordinates=-1
+LAND1.returnPathRawCoordinates=-1
+LAND1.returnPointCoordinates=-1
+LAND1.updateTime=2025-12-22 19\:37\:01
+LAND1.userId=-1
diff --git a/set.properties b/set.properties
index 4448c44..5624848 100644
--- a/set.properties
+++ b/set.properties
@@ -1,5 +1,5 @@
 #Mower Configuration Properties - Updated
-#Mon Dec 22 19:03:58 CST 2025
+#Mon Dec 22 19:37:04 CST 2025
 appVersion=-1
 boundaryLengthVisible=false
 currentWorkLandNumber=LAND1
@@ -8,12 +8,12 @@
 handheldMarkerId=1872
 idleTrailDurationSeconds=60
 manualBoundaryDrawingMode=false
-mapScale=11.18
+mapScale=6.12
 measurementModeEnabled=false
 mowerId=860
 serialAutoConnect=true
 serialBaudRate=115200
 serialPortName=COM15
 simCardNumber=-1
-viewCenterX=-21.01
-viewCenterY=3.68
+viewCenterX=-18.02
+viewCenterY=7.50
diff --git a/src/bianjie/bianjieguihua2.java b/src/bianjie/bianjieguihua2.java
index 0129d75..4d9e9c1 100644
--- a/src/bianjie/bianjieguihua2.java
+++ b/src/bianjie/bianjieguihua2.java
@@ -7,6 +7,176 @@
 
 public class bianjieguihua2 {
 	/**
+	 * 浼樺寲杈圭晫XY鍧愭爣瀛楃涓�
+	 * 
+	 * @param boundaryXYString 杈圭晫XY鍧愭爣瀛楃涓诧紝鏍煎紡锛�"X0,Y0;X1,Y1;X2,Y2;..."
+	 * @return 浼樺寲鍚庣殑杈圭晫鍧愭爣瀛楃涓诧紝鏍煎紡锛�"X0,Y0;X1,Y1;X2,Y2;..."
+	 */
+	public static String optimizeBoundaryXYString(String boundaryXYString) {
+		try {
+			// 妫�鏌ヨ緭鍏ユ暟鎹�
+			if (boundaryXYString == null || boundaryXYString.trim().isEmpty()) {
+				throw new IllegalArgumentException("杈圭晫鍧愭爣瀛楃涓蹭笉鑳戒负绌�");
+			}
+			
+			// 瑙f瀽XY鍧愭爣瀛楃涓�
+			List<BoundaryAlgorithm.Coordinate> localCoordinates = parseXYString(boundaryXYString);
+			
+			if (localCoordinates == null || localCoordinates.isEmpty()) {
+				throw new IllegalArgumentException("鏃犳硶瑙f瀽杈圭晫鍧愭爣瀛楃涓�");
+			}
+			
+			// 涓夎褰㈠皬鍖哄煙鐗规畩澶勭悊锛岄伩鍏嶈繃搴︽彃鍊煎鑷寸偣鏁版墿澧�
+			if (localCoordinates.size() == 3) {
+				double triangleArea = calculatePolygonArea(localCoordinates);
+				double trianglePerimeter = calculatePerimeter(localCoordinates);
+				
+				System.out.println("妫�娴嬪埌涓夎褰㈣竟鐣岋紝闈㈢Н=" + String.format("%.2f", triangleArea) +
+						"m虏, 鍛ㄩ暱=" + String.format("%.2f", trianglePerimeter) + "m");
+				
+				if (triangleArea < 100.0 || trianglePerimeter < 30.0) {
+					System.out.println("灏忎笁瑙掑舰锛岃烦杩囨彃鍊间紭鍖�");
+					BoundaryAlgorithm.Coordinate firstPoint = localCoordinates.get(0);
+					List<BoundaryAlgorithm.Coordinate> trianglePoints = new ArrayList<>(localCoordinates);
+					trianglePoints.add(new BoundaryAlgorithm.Coordinate(
+							firstPoint.x,
+							firstPoint.y,
+							firstPoint.lat,
+							firstPoint.lon));
+					return convertBoundaryPointsToString(trianglePoints);
+				}
+			}
+			
+			// 鍒涘缓绠楁硶瀹炰緥
+			BoundaryAlgorithm algorithm = new BoundaryAlgorithm();
+			
+			// 鑷姩鍦烘櫙鍒嗘瀽锛堝熀浜嶺Y鍧愭爣锛屾棤楂樼▼鏁版嵁锛�
+			BoundaryAlgorithm.SceneAnalysis sceneAnalysis = analyzeSceneFromXYCoordinates(localCoordinates);
+			System.out.println("鑷姩鍦烘櫙鍒嗘瀽缁撴灉:");
+			System.out.println(sceneAnalysis.toString());
+			
+			// 鏍规嵁鍦烘櫙鍒嗘瀽缁撴灉鑾峰彇鍙傛暟
+			BoundaryAlgorithm.BoundaryParameters params = 
+				algorithm.getParametersForPreset(sceneAnalysis.suggestedPreset);
+			
+			System.out.println("鑷姩閫夋嫨鐨勫弬鏁�: 闂撮殧=" + params.interval + "绫�, 瑙掑害闃堝��=" + 
+			                  params.angleThreshold + "搴�");
+			
+			// 浣跨敤浼樺寲绠楁硶澶勭悊杈圭晫
+			List<BoundaryAlgorithm.Coordinate> optimizedPoints = 
+				algorithm.optimizeBoundaryPointsAdvanced(localCoordinates, params);
+			
+			// 璐ㄩ噺璇勪及
+			BoundaryAlgorithm.BoundaryQuality boundaryQuality = 
+				algorithm.evaluateBoundaryQuality(optimizedPoints);
+			
+			System.out.println("杈圭晫璐ㄩ噺璇勪及缁撴灉:");
+			System.out.println(boundaryQuality.toString());
+			
+			// 杞崲涓鸿緭鍑哄瓧绗︿覆鏍煎紡
+			return convertBoundaryPointsToString(optimizedPoints);
+			
+		} catch (Exception e) {
+			throw new RuntimeException("浼樺寲杈圭晫鍧愭爣瀛楃涓叉椂鍙戠敓閿欒: " + e.getMessage(), e);
+		}
+	}
+	
+	/**
+	 * 瑙f瀽XY鍧愭爣瀛楃涓蹭负Coordinate鍒楄〃
+	 * 
+	 * @param xyString XY鍧愭爣瀛楃涓诧紝鏍煎紡锛�"X0,Y0;X1,Y1;X2,Y2;..."
+	 * @return Coordinate鍒楄〃
+	 */
+	private static List<BoundaryAlgorithm.Coordinate> parseXYString(String xyString) {
+		List<BoundaryAlgorithm.Coordinate> coordinates = new ArrayList<>();
+		
+		if (xyString == null || xyString.trim().isEmpty()) {
+			return coordinates;
+		}
+		
+		String[] points = xyString.split(";");
+		for (String point : points) {
+			point = point.trim();
+			if (point.isEmpty()) {
+				continue;
+			}
+			
+			String[] parts = point.split(",");
+			if (parts.length >= 2) {
+				try {
+					double x = Double.parseDouble(parts[0].trim());
+					double y = Double.parseDouble(parts[1].trim());
+					// lat鍜宭on璁句负0锛屽洜涓烘垜浠彧闇�瑕乆Y鍧愭爣
+					coordinates.add(new BoundaryAlgorithm.Coordinate(x, y, 0.0, 0.0));
+				} catch (NumberFormatException e) {
+					System.err.println("瑙f瀽鍧愭爣澶辫触: " + point + ", 閿欒: " + e.getMessage());
+				}
+			}
+		}
+		
+		return coordinates;
+	}
+	
+	/**
+	 * 鍩轰簬XY鍧愭爣杩涜鍦烘櫙鍒嗘瀽锛堟棤楂樼▼鏁版嵁锛�
+	 */
+	private static BoundaryAlgorithm.SceneAnalysis analyzeSceneFromXYCoordinates(
+			List<BoundaryAlgorithm.Coordinate> localCoords) {
+		
+		BoundaryAlgorithm.SceneAnalysis analysis = new BoundaryAlgorithm.SceneAnalysis();
+		
+		if (localCoords.size() < 3) {
+			analysis.suggestedPreset = "澶嶆潅灏忓尯鍩�";
+			return analysis;
+		}
+		
+		// 璁$畻鍩烘湰缁熻淇℃伅
+		calculateBasicStatisticsFromCoordinates(localCoords, analysis);
+		
+		// 璁$畻杈圭晫澶嶆潅搴�
+		calculateBoundaryComplexityFromCoordinates(localCoords, analysis);
+		
+		// 鏃犻珮绋嬫暟鎹紝璁剧疆涓�0
+		analysis.elevationRange = 0;
+		
+		// 鑷姩閫夋嫨棰勮鍦烘櫙锛堜笉鑰冭檻楂樼▼鍥犵礌锛�
+		selectPresetAutomaticallyFromXYCoordinates(analysis);
+		
+		return analysis;
+	}
+	
+	/**
+	 * 浠嶺Y鍧愭爣鑷姩閫夋嫨棰勮鍦烘櫙锛堜笉鑰冭檻楂樼▼鍥犵礌锛�
+	 */
+	private static void selectPresetAutomaticallyFromXYCoordinates(BoundaryAlgorithm.SceneAnalysis analysis) {
+		// 鍐崇瓥閫昏緫鍩轰簬闈㈢Н鍜屽鏉傚害
+		double areaWeight = 0.6;
+		double complexityWeight = 0.4;
+		
+		// 璁$畻缁煎悎寰楀垎
+		double score = 0;
+		
+		// 闈㈢Н鍥犵礌锛氶潰绉秺澶э紝瓒婇�傚悎澶ч棿闅�
+		double areaScore = Math.min(1.0, analysis.area / 1000.0); // 1000骞虫柟绫充负鍩哄噯
+		score += areaScore * areaWeight;
+		
+		// 澶嶆潅搴﹀洜绱狅細澶嶆潅搴﹁秺楂橈紝瓒婇渶瑕佸皬闂撮殧
+		double complexityScore = analysis.complexity;
+		score += complexityScore * complexityWeight;
+		
+		// 鏍规嵁寰楀垎閫夋嫨棰勮
+		if (score < 0.3) {
+			analysis.suggestedPreset = "骞冲潶澶у尯鍩�";
+		} else if (score < 0.6) {
+			analysis.suggestedPreset = "甯歌鍖哄煙";
+		} else {
+			analysis.suggestedPreset = "澶嶆潅灏忓尯鍩�";
+		}
+		
+		System.out.println("鑷姩鍦烘櫙閫夋嫨寰楀垎: " + String.format("%.2f", score) + " -> " + analysis.suggestedPreset);
+	}
+
+	/**
 	 * 鑷姩澶勭悊Coordinate鍒楄〃骞剁敓鎴愪紭鍖栧悗鐨勮竟鐣屽潗鏍囷紙鏃犻渶浼犲叆闂撮殧鍜岃搴﹂槇鍊硷級
 	 * 
 	 * @param coordinates Coordinate瀵硅薄鍒楄〃
diff --git a/src/dikuai/Dikuanbianjipage.java b/src/dikuai/Dikuanbianjipage.java
index bceb6c2..f3d7ff8 100644
--- a/src/dikuai/Dikuanbianjipage.java
+++ b/src/dikuai/Dikuanbianjipage.java
@@ -105,43 +105,17 @@
                 JOptionPane.showMessageDialog(this, "鏈壘鍒板湴鍧椾俊鎭紝鏃犳硶浼樺寲", "閿欒", JOptionPane.ERROR_MESSAGE);
                 return;
             }
-            String baseStation = dikuai.getBaseStationCoordinates();
-            if (baseStation == null || baseStation.trim().isEmpty() || "-1".equals(baseStation)) {
-                JOptionPane.showMessageDialog(this, "鍩虹珯鍧愭爣鏈缃紝鏃犳硶浼樺寲", "閿欒", JOptionPane.ERROR_MESSAGE);
-                return;
-            }
             
-            // 鍑嗗 Coordinate 鍒楄〃
-            String originalCoords = dikuai.getBoundaryOriginalCoordinates();
-            if (originalCoords == null || originalCoords.trim().isEmpty() || "-1".equals(originalCoords)) {
-                JOptionPane.showMessageDialog(this, "鍘熷杈圭晫鍧愭爣涓虹┖锛屾棤娉曚紭鍖�", "閿欒", JOptionPane.ERROR_MESSAGE);
+            // 浠庡師濮嬭竟鐣孹Y鍧愭爣鏂囨湰鍩熻幏鍙栬緭鍏�
+            String inputXY = rawXYArea.getText();
+            if (inputXY == null || inputXY.trim().isEmpty() || "-1".equals(inputXY.trim())) {
+                JOptionPane.showMessageDialog(this, "鍘熷杈圭晫XY鍧愭爣涓虹┖锛屾棤娉曚紭鍖�", "閿欒", JOptionPane.ERROR_MESSAGE);
                 return;
             }
 
             try {
-                // 瑙f瀽鍘熷鍧愭爣鍒� Coordinate.coordinates
-                List<Coordinate> coords = new ArrayList<>();
-                String[] points = originalCoords.split(";");
-                for (String point : points) {
-                    String[] parts = point.split(",");
-                    if (parts.length >= 2) {
-                        double lonDecimal = Double.parseDouble(parts[0].trim());
-                        double latDecimal = Double.parseDouble(parts[1].trim());
-                        double alt = parts.length > 2 ? Double.parseDouble(parts[2].trim()) : 0.0;
-                        
-                        // 灏嗗崄杩涘埗搴﹁浆鎹负搴﹀垎鏍煎紡瀛楃涓�
-                        String latDM = decimalToDegreeMinute(latDecimal);
-                        String lonDM = decimalToDegreeMinute(lonDecimal);
-                        String latDir = latDecimal >= 0 ? "N" : "S";
-                        String lonDir = lonDecimal >= 0 ? "E" : "W";
-                        
-                        coords.add(new Coordinate(latDM, latDir, lonDM, lonDir, alt));
-                    }
-                }
-                Coordinate.coordinates = coords;
-
-                // 璋冪敤浼樺寲绠楁硶
-                String optimized = bianjieguihua2.processCoordinateListAuto(baseStation);
+                // 璋冪敤浼樺寲绠楁硶锛堢洿鎺ヤ娇鐢╔Y鍧愭爣瀛楃涓诧級
+                String optimized = bianjieguihua2.optimizeBoundaryXYString(inputXY.trim());
                 optTextArea.setText(optimized);
                 JOptionPane.showMessageDialog(this, "杈圭晫浼樺寲瀹屾垚", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
             } catch (Exception ex) {
@@ -160,11 +134,22 @@
             // 鑾峰彇褰撳墠浼樺寲鍚庣殑杈圭晫
             String currentOptimized = optTextArea.getText();
             
+            // 淇濆瓨鍦板潡缂栧彿锛岀敤浜庤繑鍥炲洖璋�
+            final String targetLandNumber = dikuai.getLandNumber();
+            
             // 璋冪敤棣栭〉鏄剧ず棰勮
             SwingUtilities.invokeLater(() -> {
                 Shouye.showBoundaryPreview(dikuai, currentOptimized, () -> {
-                    // 杩斿洖鍥炶皟锛氶噸鏂版墦寮�姝ら〉闈�
-                    new Dikuanbianjipage(getOwner(), getTitle(), currentOptimized, dikuai).setVisible(true);
+                    // 杩斿洖鍥炶皟锛氶噸鏂版墦寮�姝ら〉闈紝浠庡湴鍧楀璞¢噸鏂拌鍙栨渶鏂扮殑杈圭晫鍧愭爣
+                    // 浠� dikuaiMap 閲嶆柊鑾峰彇鍦板潡瀵硅薄锛堢‘淇濊幏鍙栧埌鏈�鏂扮殑鍊硷級
+                    Dikuai updatedDikuai = Dikuai.getDikuai(targetLandNumber);
+                    if (updatedDikuai != null) {
+                        String latestBoundary = updatedDikuai.getBoundaryCoordinates();
+                        new Dikuanbianjipage(getOwner(), getTitle(), latestBoundary, updatedDikuai).setVisible(true);
+                    } else {
+                        // 濡傛灉鑾峰彇澶辫触锛屼娇鐢ㄥ綋鍓嶅��
+                        new Dikuanbianjipage(getOwner(), getTitle(), currentOptimized, dikuai).setVisible(true);
+                    }
                 });
             });
         });
@@ -189,7 +174,8 @@
             Dikuai.saveToProperties();
             this.result = trimmed;
             JOptionPane.showMessageDialog(this, "鍦板潡杈圭晫鍧愭爣宸叉洿鏂�", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
-            dispose();
+            // 涓嶉��鍑洪〉闈紝鍙洿鏂版樉绀�
+            // dispose(); // 绉婚櫎閫�鍑洪�昏緫
         });
 
         closeBtn.addActionListener(e -> dispose());
diff --git a/src/zhuye/MapRenderer.java b/src/zhuye/MapRenderer.java
index 1eb0bd2..9db0014 100644
--- a/src/zhuye/MapRenderer.java
+++ b/src/zhuye/MapRenderer.java
@@ -247,6 +247,10 @@
                 if (handleMowerClick(e.getPoint())) {
                     return;
                 }
+                // 浼樺厛澶勭悊浼樺寲鍚庤竟鐣屽潗鏍囩偣鐐瑰嚮锛堣竟鐣岄瑙堟ā寮忎笅锛�
+                if (boundaryPreviewActive && handleOptimizedBoundaryPointClick(e.getPoint())) {
+                    return;
+                }
                 // 浼樺厛澶勭悊闅滅鐗╄竟鐣岀偣鐐瑰嚮锛堝鏋滃彲瑙侊級
                 if (obstaclePointsVisible && handleObstaclePointClick(e.getPoint())) {
                     return;
@@ -424,8 +428,8 @@
         // 缁樺埗榧犳爣瀹炴椂浣嶇疆锛堟墜鍔ㄧ粯鍒惰竟鐣屾ā寮忔椂锛�
         manualBoundaryDrawer.drawMousePosition(g2d, scale);
 
-        // 缁樺埗瀵艰埅璺緞锛堜腑灞傦級
-        if (hasPlannedPath) {
+        // 缁樺埗瀵艰埅璺緞锛堜腑灞傦級- 杈圭晫棰勮妯″紡涓嬩笉鏄剧ず瀵艰埅璺緞
+        if (hasPlannedPath && !boundaryPreviewActive) {
             drawCurrentPlannedPath(g2d);
         }
 
@@ -3156,7 +3160,184 @@
         // 缁樺埗浼樺寲鍚庤竟鐣岋紙缁胯壊锛屼笌姝e父杈圭晫棰滆壊涓�鑷达級
         if (previewOptimizedBoundary != null && previewOptimizedBoundary.size() >= 2) {
             bianjiedrwa.drawBoundary(g2d, previewOptimizedBoundary, scale, GRASS_FILL_COLOR, GRASS_BORDER_COLOR);
+            
+            // 缁樺埗浼樺寲鍚庤竟鐣屽潗鏍囩偣锛堢传鑹插疄蹇冨渾鍦堬紝鏄剧ず搴忓彿锛�
+            drawOptimizedBoundaryPointsWithNumbers(g2d, previewOptimizedBoundary, scale);
         }
     }
+    
+    /**
+     * 缁樺埗浼樺寲鍚庤竟鐣屽潗鏍囩偣锛堢传鑹插疄蹇冨渾鍦堬紝鏄剧ず搴忓彿锛�
+     * 搴忓彿鏄剧ず鍦ㄧ偣涓績锛屽瓧浣撳ぇ灏�11鍙凤紝涓嶉殢缂╂斁鍙樺寲
+     */
+    private void drawOptimizedBoundaryPointsWithNumbers(Graphics2D g2d, List<Point2D.Double> boundary, double scale) {
+        if (boundary == null || boundary.isEmpty()) {
+            return;
+        }
+        
+        // 淇濆瓨鍘熷鍙樻崲
+        AffineTransform originalTransform = g2d.getTransform();
+        
+        // 璁剧疆鐐圭殑澶у皬锛堝疄蹇冨渾鍦堬紝鐩村緞绾�0.3绫筹級
+        double scaleFactor = Math.max(0.5, scale);
+        double markerDiameter = 0.3; // 鍦嗗湀鐩村緞锛堢背锛�
+        double markerRadius = markerDiameter / 2.0;
+        
+        // 璁剧疆瀛椾綋锛�11鍙凤紝涓嶉殢缂╂斁鍙樺寲锛�
+        Font labelFont = new Font("寰蒋闆呴粦", Font.PLAIN, 11);
+        g2d.setFont(labelFont);
+        FontMetrics fontMetrics = g2d.getFontMetrics(labelFont);
+        
+        // 绱壊瀹炲績鍦嗗湀棰滆壊
+        Color purpleColor = new Color(128, 0, 128, 255); // 绱壊
+        
+        // 缁樺埗姣忎釜鐐瑰強鍏跺簭鍙�
+        for (int i = 0; i < boundary.size(); i++) {
+            Point2D.Double point = boundary.get(i);
+            double x = point.x;
+            double y = point.y;
+            
+            // 缁樺埗绱壊瀹炲績鍦嗗湀锛堝湪涓栫晫鍧愭爣绯讳腑锛岄殢缂╂斁鍙樺寲锛�
+            g2d.setColor(purpleColor);
+            Ellipse2D.Double marker = new Ellipse2D.Double(
+                x - markerRadius, 
+                y - markerRadius, 
+                markerDiameter, 
+                markerDiameter
+            );
+            g2d.fill(marker);
+            
+            // 灏嗕笘鐣屽潗鏍囪浆鎹负灞忓箷鍧愭爣浠ョ粯鍒跺簭鍙凤紙涓嶉殢缂╂斁鍙樺寲锛�
+            Point2D.Double worldPoint = new Point2D.Double(x, y);
+            Point2D.Double screenPoint = new Point2D.Double();
+            originalTransform.transform(worldPoint, screenPoint);
+            
+            // 淇濆瓨褰撳墠鍙樻崲
+            AffineTransform savedTransform = g2d.getTransform();
+            
+            // 閲嶇疆鍙樻崲涓哄睆骞曞潗鏍囩郴缁�
+            g2d.setTransform(new AffineTransform());
+            
+            // 缁樺埗搴忓彿锛堝湪灞忓箷鍧愭爣绯讳腑锛屼笉闅忕缉鏀惧彉鍖栵級
+            String numberText = String.valueOf(i + 1);
+            int textWidth = fontMetrics.stringWidth(numberText);
+            int textHeight = fontMetrics.getHeight();
+            
+            // 鍦ㄧ偣涓績缁樺埗搴忓彿
+            int textX = (int)(screenPoint.x - textWidth / 2.0);
+            int textY = (int)(screenPoint.y + textHeight / 4.0);
+            
+            // 缁樺埗搴忓彿鏂囧瓧锛堥粦鑹诧級
+            g2d.setColor(Color.BLACK);
+            g2d.drawString(numberText, textX, textY);
+            
+            // 鎭㈠鍙樻崲
+            g2d.setTransform(savedTransform);
+        }
+        
+        // 鎭㈠鍘熷鍙樻崲
+        g2d.setTransform(originalTransform);
+    }
+    
+    /**
+     * 澶勭悊浼樺寲鍚庤竟鐣屽潗鏍囩偣鐐瑰嚮
+     * @param screenPoint 灞忓箷鍧愭爣鐐�
+     * @return 鏄惁澶勭悊浜嗙偣鍑�
+     */
+    private boolean handleOptimizedBoundaryPointClick(Point screenPoint) {
+        if (previewOptimizedBoundary == null || previewOptimizedBoundary.isEmpty()) {
+            return false;
+        }
+        
+        // 璁$畻閫夋嫨闃堝�硷紙鍍忕礌锛�
+        double threshold = computeOptimizedBoundaryPointSelectionThreshold();
+        
+        // 鏌ユ壘琚偣鍑荤殑鐐�
+        int hitIndex = -1;
+        for (int i = 0; i < previewOptimizedBoundary.size(); i++) {
+            Point2D.Double worldPoint = previewOptimizedBoundary.get(i);
+            Point2D.Double screenPosition = worldToScreen(worldPoint);
+            double dx = screenPosition.x - screenPoint.x;
+            double dy = screenPosition.y - screenPoint.y;
+            if (Math.hypot(dx, dy) <= threshold) {
+                hitIndex = i;
+                break;
+            }
+        }
+        
+        if (hitIndex < 0) {
+            return false;
+        }
+        
+        // 寮瑰嚭纭瀵硅瘽妗�
+        String pointLabel = String.valueOf(hitIndex + 1);
+        int choice = JOptionPane.showConfirmDialog(
+            visualizationPanel,
+            "纭畾瑕佸垹闄ょ" + pointLabel + "鍙蜂紭鍖栧悗杈圭晫鍧愭爣鐐瑰悧锛�",
+            "鍒犻櫎杈圭晫鍧愭爣鐐�",
+            JOptionPane.OK_CANCEL_OPTION,
+            JOptionPane.WARNING_MESSAGE
+        );
+        
+        if (choice == JOptionPane.OK_OPTION) {
+            // 鍒犻櫎鍧愭爣鐐�
+            List<Point2D.Double> updated = new ArrayList<>(previewOptimizedBoundary);
+            updated.remove(hitIndex);
+            
+            // 鏇存柊棰勮杈圭晫
+            previewOptimizedBoundary = updated;
+            
+            // 杞崲涓哄瓧绗︿覆鏍煎紡骞朵繚瀛�
+            String updatedBoundaryString = convertBoundaryToString(updated);
+            
+            // 閫氱煡 Shouye 淇濆瓨鏇存柊鍚庣殑杈圭晫鍧愭爣
+            if (boundaryPreviewUpdateCallback != null) {
+                boundaryPreviewUpdateCallback.accept(updatedBoundaryString);
+            }
+            
+            // 鍒锋柊鏄剧ず
+            visualizationPanel.repaint();
+        }
+        
+        return true;
+    }
+    
+    /**
+     * 璁$畻浼樺寲鍚庤竟鐣屽潗鏍囩偣鐨勯�夋嫨闃堝�硷紙鍍忕礌锛�
+     */
+    private double computeOptimizedBoundaryPointSelectionThreshold() {
+        double scaleFactor = Math.max(0.5, scale);
+        double markerDiameterWorld = 0.3; // 鍦嗗湀鐩村緞锛堢背锛�
+        double markerDiameterPixels = markerDiameterWorld * scale;
+        return Math.max(8.0, markerDiameterPixels * 1.5);
+    }
+    
+    /**
+     * 灏嗚竟鐣岀偣鍒楄〃杞崲涓哄瓧绗︿覆鏍煎紡
+     */
+    private String convertBoundaryToString(List<Point2D.Double> boundary) {
+        if (boundary == null || boundary.isEmpty()) {
+            return "";
+        }
+        
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < boundary.size(); i++) {
+            Point2D.Double point = boundary.get(i);
+            sb.append(String.format(Locale.US, "%.2f,%.2f", point.x, point.y));
+            if (i < boundary.size() - 1) {
+                sb.append(";");
+            }
+        }
+        return sb.toString();
+    }
+    
+    /**
+     * 璁剧疆杈圭晫棰勮鏇存柊鍥炶皟
+     */
+    private java.util.function.Consumer<String> boundaryPreviewUpdateCallback;
+    
+    public void setBoundaryPreviewUpdateCallback(java.util.function.Consumer<String> callback) {
+        this.boundaryPreviewUpdateCallback = callback;
+    }
 
 }
\ No newline at end of file
diff --git a/src/zhuye/Shouye.java b/src/zhuye/Shouye.java
index 8162334..14c9fd5 100644
--- a/src/zhuye/Shouye.java
+++ b/src/zhuye/Shouye.java
@@ -133,6 +133,7 @@
 	private JButton saveManualBoundaryButton;  // 淇濆瓨鎵嬪姩缁樺埗杈圭晫鐨勬寜閽�
 	private String previewRestoreLandNumber;
 	private String previewRestoreLandName;
+	private Dikuai currentBoundaryPreviewDikuai;  // 褰撳墠杈圭晫棰勮鐨勫湴鍧楀紩鐢�
 	private boolean drawingPaused;
 	private ImageIcon pauseIcon;
 	private ImageIcon pauseActiveIcon;
@@ -4309,12 +4310,32 @@
             return;
         }
         
+        // 淇濆瓨褰撳墠鍦板潡寮曠敤
+        shouye.currentBoundaryPreviewDikuai = dikuai;
+        
         // 鑾峰彇鍘熷杈圭晫XY鍧愭爣
         String originalBoundaryXY = dikuai.getBoundaryOriginalXY();
         
         // 璁剧疆杈圭晫棰勮
         shouye.mapRenderer.setBoundaryPreview(originalBoundaryXY, optimizedBoundary);
         
+        // 璁剧疆杈圭晫棰勮鏇存柊鍥炶皟锛岀敤浜庝繚瀛樺垹闄ゅ潗鏍囩偣鍚庣殑杈圭晫
+        shouye.mapRenderer.setBoundaryPreviewUpdateCallback(updatedBoundary -> {
+            if (shouye.currentBoundaryPreviewDikuai != null && updatedBoundary != null) {
+                // 淇濆瓨鏇存柊鍚庣殑杈圭晫鍧愭爣
+                Dikuai.updateField(shouye.currentBoundaryPreviewDikuai.getLandNumber(), "boundaryCoordinates", updatedBoundary);
+                java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                Dikuai.updateField(shouye.currentBoundaryPreviewDikuai.getLandNumber(), "updateTime", sdf.format(new java.util.Date()));
+                Dikuai.saveToProperties();
+                
+                // 鍚屾鏇存柊褰撳墠鍦板潡瀵硅薄鐨勫唴瀛樺�硷紙纭繚杩斿洖鏃惰兘鑾峰彇鍒版渶鏂板�硷級
+                shouye.currentBoundaryPreviewDikuai.setBoundaryCoordinates(updatedBoundary);
+                
+                // 鏇存柊棰勮杈圭晫锛堥噸鏂拌缃互鍒锋柊鏄剧ず锛�
+                shouye.mapRenderer.setBoundaryPreview(originalBoundaryXY, updatedBoundary);
+            }
+        });
+        
         // 鍋滄缁樺埗鍓茶崏鏈哄疄鏃舵嫋灏�
         if (shouye.mapRenderer != null) {
             shouye.mapRenderer.setIdleTrailSuppressed(true);
@@ -4367,6 +4388,9 @@
     private void exitBoundaryPreview() {
         pathPreviewActive = false;
         
+        // 娓呴櫎褰撳墠鍦板潡寮曠敤
+        currentBoundaryPreviewDikuai = null;
+        
         // 鎭㈠缁樺埗鍓茶崏鏈哄疄鏃舵嫋灏�
         if (mapRenderer != null) {
             mapRenderer.setIdleTrailSuppressed(false);
@@ -4375,6 +4399,7 @@
         // 娓呴櫎杈圭晫棰勮
         if (mapRenderer != null) {
             mapRenderer.clearBoundaryPreview();
+            mapRenderer.setBoundaryPreviewUpdateCallback(null);
         }
         
         // 闅愯棌杩斿洖鎸夐挳

--
Gitblit v1.10.0