张世豪
18 小时以前 b272034a1fdbfe32b355fc6c264a4c45df107190
src/dikuai/ObstacleManagementPage.java
@@ -1,5 +1,4 @@
package dikuai;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicScrollBarUI;
@@ -11,15 +10,16 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import zhangaiwu.Obstacledge;
import zhuye.Shouye;
import zhuye.Coordinate;
import bianjie.bianjieguihua2;
import bianjie.Bianjieyouhuatoxy;
/**
 * 障碍物管理页面 - UI优化版
 */
import publicway.Gpstoxuzuobiao;
public class ObstacleManagementPage extends JDialog {
    private static final long serialVersionUID = 1L;
    
@@ -797,14 +797,13 @@
                return null;
            }
            
            // 设置到全局坐标列表
            Coordinate.coordinates.clear();
            Coordinate.coordinates.addAll(coordinateList);
            // 构建边界字符串,格式为 "(lat1,lon1,alt1;lat2,lon2,alt2;...)"
            String boundaryStr = buildBoundaryStringForOptimization(coordinateList);
            
            // 调用 bianjieguihua2 算法生成优化后的多边形坐标
            String optimizedCoordsStr = bianjieguihua2.processCoordinateListAuto(baseStation);
            // 调用 Bianjieyouhuatoxy.optimizeBoundary 方法生成优化后的多边形坐标
            String optimizedCoordsStr = Bianjieyouhuatoxy.optimizeBoundary(baseStation, boundaryStr);
            
            if (optimizedCoordsStr == null || optimizedCoordsStr.trim().isEmpty()) {
            if (optimizedCoordsStr == null || optimizedCoordsStr.trim().isEmpty() || optimizedCoordsStr.startsWith("ERROR")) {
                return null;
            }
            
@@ -840,6 +839,34 @@
    }
    
    /**
     * 构建用于优化的边界字符串,格式为 "(lat1,lon1,alt1;lat2,lon2,alt2;...)"
     * 其中lat和lon是度分格式(DMM格式),例如 "3949.89151752"
     */
    private String buildBoundaryStringForOptimization(List<Coordinate> coordinates) {
        if (coordinates == null || coordinates.isEmpty()) {
            return "()";
        }
        StringBuilder sb = new StringBuilder("(");
        java.text.DecimalFormat elevationFormat = new java.text.DecimalFormat("0.00");
        for (int i = 0; i < coordinates.size(); i++) {
            Coordinate coord = coordinates.get(i);
            // Coordinate类中的getLatitude()和getLongitude()已经返回度分格式(DMM格式)
            String latDMM = coord.getLatitude();
            String lonDMM = coord.getLongitude();
            double elevation = coord.getElevation();
            if (i > 0) {
                sb.append(";");
            }
            sb.append(latDMM).append(",")
              .append(lonDMM).append(",")
              .append(elevationFormat.format(elevation));
        }
        sb.append(")");
        return sb.toString();
    }
    /**
     * 格式化度分格式坐标
     * @param degreeMinute 度分值,如 2324.200273 表示 23度24.200273分
     * @return 格式化的字符串
@@ -904,29 +931,11 @@
    }
    private double parseDMToDecimal(String dmm, String direction) {
        if (dmm == null || dmm.trim().isEmpty()) return Double.NaN;
        try {
            String trimmed = dmm.trim();
            int dotIndex = trimmed.indexOf('.');
            if (dotIndex < 2) return Double.NaN;
            int degrees = Integer.parseInt(trimmed.substring(0, dotIndex - 2));
            double minutes = Double.parseDouble(trimmed.substring(dotIndex - 2));
            double decimal = degrees + minutes / 60.0;
            if ("S".equalsIgnoreCase(direction) || "W".equalsIgnoreCase(direction)) decimal = -decimal;
            return decimal;
        } catch (NumberFormatException ex) {
            return Double.NaN;
        }
        return Gpstoxuzuobiao.parseDMToDecimal(dmm, direction);
    }
    
    private double[] convertLatLonToLocal(double lat, double lon, double baseLat, double baseLon) {
        double deltaLat = lat - baseLat;
        double deltaLon = lon - baseLon;
        double meanLatRad = Math.toRadians((baseLat + lat) / 2.0);
        double METERS_PER_DEGREE_LAT = 111320.0;
        double eastMeters = deltaLon * METERS_PER_DEGREE_LAT * Math.cos(meanLatRad);
        double northMeters = deltaLat * METERS_PER_DEGREE_LAT;
        return new double[]{eastMeters, northMeters};
        return Gpstoxuzuobiao.convertLatLonToLocal(lat, lon, baseLat, baseLon);
    }
    
    private void deleteObstacle(Obstacledge.Obstacle obstacle) {
@@ -1000,3 +1009,8 @@