From 5b685e9066ccfbc432c29739b5524f1d42a20891 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期一, 22 十二月 2025 19:37:30 +0800
Subject: [PATCH] 进一步优化边界管理页面功能
---
src/bianjie/bianjieguihua2.java | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 170 insertions(+), 0 deletions(-)
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瀵硅薄鍒楄〃
--
Gitblit v1.10.0