| | |
| | | double baseLat = parseDMToDecimal(baseParts[0], baseParts[1]); |
| | | double baseLon = parseDMToDecimal(baseParts[2], baseParts[3]); |
| | | |
| | | // 将Coordinate列表转换为局部坐标系坐标 |
| | | List<BoundaryAlgorithm.Coordinate> localCoordinates = |
| | | convertToLocalCoordinates(coordinates, baseLat, baseLon); |
| | | // 将Coordinate列表转换为局部坐标系坐标 |
| | | List<BoundaryAlgorithm.Coordinate> localCoordinates = |
| | | convertToLocalCoordinates(coordinates, baseLat, baseLon); |
| | | |
| | | // 三角形小区域特殊处理,避免过度插值导致点数扩增 |
| | | 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(); |
| | |
| | | |
| | | return Math.abs(area) / 2.0; |
| | | } |
| | | |
| | | private static double calculatePerimeter(List<BoundaryAlgorithm.Coordinate> points) { |
| | | if (points == null || points.size() != 3) { |
| | | return 0.0; |
| | | } |
| | | double d1 = calculateDistance(points.get(0), points.get(1)); |
| | | double d2 = calculateDistance(points.get(1), points.get(2)); |
| | | double d3 = calculateDistance(points.get(2), points.get(0)); |
| | | return d1 + d2 + d3; |
| | | } |
| | | |
| | | // ============ 其他方法保持不变 ============ |
| | | |