From c2c38da7834d3571d79a36821eba5243335815d3 Mon Sep 17 00:00:00 2001
From: aijinhui <aijinhui>
Date: 星期四, 19 十月 2023 14:06:06 +0800
Subject: [PATCH] RTU

---
 ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java |   93 ++++++++++++++++++++--------------------------
 1 files changed, 41 insertions(+), 52 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java b/ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java
index 24f018f..9f633bd 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/tube/TubeTools.java
@@ -1,7 +1,11 @@
 package com.ruoyi.utils.tube;
 
 import com.ruoyi.alarmpoints.tube.domain.ArdTubesDetails;
+import com.ruoyi.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.gavaghan.geodesy.Ellipsoid;
+import org.gavaghan.geodesy.GeodeticCalculator;
+import org.gavaghan.geodesy.GlobalCoordinates;
 import org.springframework.stereotype.Service;
 import java.util.Collections;
 import java.util.Comparator;
@@ -20,22 +24,22 @@
 public class TubeTools {
     public static void main(String[] args) {
         // 鍋囪缁欏畾鐨勪笁涓潗鏍囩偣 A銆丅銆丆
-        double x1 = 124.939903268;
-        double y1 = 46.684520056;
-        double x2 = 124.94049634327537;
-        double y2 = 46.68442539350505;
-        double x3 = 124.940552075;
-        double y3 = 46.684416498;
+        GeoPoint pointA = new GeoPoint(124.939903268, 46.684520056, 143.3 - 0.73);
+        GeoPoint pointB = new GeoPoint(124.94034787826001, 46.68444909044429, 144.12232823014708);
+        GeoPoint pointC = new GeoPoint(124.940552075, 46.684416498, 144.5 - 0.81);
 
-        double distance = getDistance(x1, y1, x3, y3);
-        log.debug("鎬昏窛绂�:" + distance);
-        double distance1 = getDistance(x1, y1, x2, y2);
-        log.debug("璺濈璧风偣璺濈:" + distance1);
-        double distance2 = getDistance(x2, y2, x3, y3);
-        log.debug("璺濈缁堢偣璺濈:" + distance2);
+        double distance = getDistance(pointA, pointC);
+        double diffAC = pointA.getAltitude() - pointC.getAltitude();
+        log.info("AC鎬昏窛绂�:" + distance + " AC楂樺害宸細" + diffAC);
+        double distance1 = getDistance(pointA, pointB);
+        double diffAB = pointA.getAltitude() - pointB.getAltitude();
+        log.info("AB璺濈:" + distance1 + " AB楂樺害宸細" + diffAB);
+        double distance2 = getDistance(pointB, pointC);
+        double diffBC = pointB.getAltitude() - pointC.getAltitude();
+        log.info("BC璺濈:" + distance2 + " BC楂樺害宸細" + diffBC);
         // 璁$畻鏂滅巼
-        double slope1 = (y2 - y1) / (x2 - x1);
-        double slope2 = (y3 - y2) / (x3 - x2);
+        double slope1 = (pointB.getLatitude() - pointA.getLatitude()) / (pointB.getLongitude() - pointA.getLongitude());
+        double slope2 = (pointC.getLatitude() - pointB.getLatitude()) / (pointC.getLongitude() - pointB.getLongitude());
 
         // 璁剧疆鏂滅巼宸�肩殑闃堝��
         double threshold = 0.000001;
@@ -49,29 +53,30 @@
     }
 
     /**
-     * @鎻忚堪 璁$畻鍧愭爣
-     * @鍙傛暟 [ardTubesDetails, alarmPointDistance]
-     * @杩斿洖鍊� void
-     * @鍒涘缓浜� 鍒樿嫃涔�
-     * @鍒涘缓鏃堕棿 2023/6/8 14:38
-     * @淇敼浜哄拰鍏跺畠淇℃伅
+     *  璁$畻鍧愭爣
+     *
+     *  鍒樿嫃涔�
+     *  2023/6/8 14:38
      */
     public static GeoPoint CalculateCoordinates(List<ArdTubesDetails> ardTubesDetails, Integer alarmPointDistance) {
-
             try {
+                if(StringUtils.isNull(alarmPointDistance))
+                {
+                    log.debug("鎶ヨ鐐硅窛绂讳负绌猴紝鏃犳硶璁$畻鍧愭爣");
+                    return null;
+                }
                 Comparator<ArdTubesDetails> comparator = Comparator.comparingInt(person -> Integer.parseInt(person.getInflectionPointNumber())); // 浣跨敤Collections.sort鏂规硶杩涜鎺掑簭
                 Collections.sort(ardTubesDetails, comparator);
-                double x = ardTubesDetails.get(0).getLongitude();
-                double y = ardTubesDetails.get(0).getLatitude();
+                GeoPoint point0 = new GeoPoint(ardTubesDetails.get(0).getLongitude(), ardTubesDetails.get(0).getLatitude(), ardTubesDetails.get(0).getAltitude() - ardTubesDetails.get(0).getDepth());
                 TreeMap<Integer, Double> distanceMap = new TreeMap<>();
                 TreeMap<Integer, Object> tubeMap = new TreeMap<>();
                 double distance = 0.0;
                 for (ArdTubesDetails atd : ardTubesDetails) {
-                    distance += getDistance(x, y, atd.getLongitude(), atd.getLatitude());
+                    GeoPoint point = new GeoPoint(atd.getLongitude(), atd.getLatitude(), atd.getAltitude() - atd.getDepth());
+                    distance += getDistance(point, point0);
                     distanceMap.put(Integer.parseInt(atd.getInflectionPointNumber()), distance);
                     tubeMap.put(Integer.parseInt(atd.getInflectionPointNumber()), atd);
-                    x = atd.getLongitude();
-                    y = atd.getLatitude();
+                    point0 = point;
                 }
                 Integer num = 0;
                 double tempDistance = 0.0;
@@ -184,35 +189,19 @@
         return angle;
     }
 
-    private static final double EARTH_RADIUS = 6378.137; // 6378.137涓哄湴鐞冨崐寰�(鍗曚綅:鍗冪背)
-
     /**
      * 鏍规嵁缁忕含搴︼紝璁$畻涓ょ偣闂寸殑璺濈
      *
-     * @param longitude1 绗竴涓偣鐨勭粡搴�
-     * @param latitude1  绗竴涓偣鐨勭含搴�
-     * @param longitude2 绗簩涓偣鐨勭粡搴�
-     * @param latitude2  绗簩涓偣鐨勭含搴�
-     * @return 杩斿洖璺濈 鍗曚綅鍗冪背
+     * @param GeoPoint pa 绗竴涓偣
+     * @param GeoPoint  pb 绗簩涓偣
+     * @return 杩斿洖璺濈 鍗曚綅绫�
      */
-    private static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
-        // 绾害
-        double lat1 = Math.toRadians(latitude1);
-        double lat2 = Math.toRadians(latitude2);
-        // 缁忓害
-        double lng1 = Math.toRadians(longitude1);
-        double lng2 = Math.toRadians(longitude2);
-        // 绾害涔嬪樊
-        double a = lat1 - lat2;
-        // 缁忓害涔嬪樊
-        double b = lng1 - lng2;
-        // 璁$畻涓ょ偣璺濈鐨勫叕寮�
-        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
-                Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
-        // 寮ч暱涔樺湴鐞冨崐寰�, 杩斿洖鍗曚綅: 鍗冪背
-        s = s * EARTH_RADIUS;
-        //System.out.println("璺濈"+s);
-        return s * 1000;
+    public static GeodeticCalculator geodeticCalculator = new GeodeticCalculator();
+    public static double getDistance(GeoPoint pa, GeoPoint pb) {
+        GlobalCoordinates source = new GlobalCoordinates(pa.getLatitude(), pa.getLongitude());
+        GlobalCoordinates target = new GlobalCoordinates(pb.getLatitude(), pb.getLongitude());
+        double distance = geodeticCalculator.calculateGeodeticCurve(Ellipsoid.WGS84, source, target).getEllipsoidalDistance();
+        double res = Math.sqrt(Math.pow(pa.getAltitude() - pb.getAltitude(), 2) + Math.pow(distance, 2));
+        return res;
     }
-
 }

--
Gitblit v1.9.3