From 25cfe4f5057917a9e6ec2accef7e72e40b2f9047 Mon Sep 17 00:00:00 2001
From: aix <vip_xiaobin810@163.com>
Date: Mon, 08 Jul 2024 19:45:22 +0800
Subject: [PATCH] 航线生成云台旋转

---
 src/main/java/com/dji/sample/patches/utils/GeoToolsUtil.java |  108 ++++++++++++++++++++++++++++++++---------------------
 1 files changed, 65 insertions(+), 43 deletions(-)

diff --git a/src/main/java/com/dji/sample/patches/utils/GeoToolsUtil.java b/src/main/java/com/dji/sample/patches/utils/GeoToolsUtil.java
index 5ea11e8..8477684 100644
--- a/src/main/java/com/dji/sample/patches/utils/GeoToolsUtil.java
+++ b/src/main/java/com/dji/sample/patches/utils/GeoToolsUtil.java
@@ -139,51 +139,25 @@
         return simplifiedPolygon.getNumPoints();
     }
 
-    public static void main(String[] args) {
-        //测试
-        List<LotInfo> list = new ArrayList<>();
-        list.add(LotInfo.builder().dkfw("POLYGON((115.866465564947 28.6344502965542, 115.86425430209 28.6357383285408, 115.864551734716 28.633120921433, 115.866977149064 28.6338435339976, 115.866465564947 28.6344502965542))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.864006690605 28.6202713913694, 115.86002109342 28.6162025130492, 115.866374254306 28.6142037658042, 115.865912044006 28.6172001020759, 115.864006690605 28.6202713913694))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.839366933455 28.6161999317332, 115.841288489469 28.6160843601496, 115.840931570318 28.6181544912247, 115.838147600941 28.618654178036, 115.839366933455 28.6161999317332))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.857499052697 28.6784702230642, 115.859109158101 28.6762273976226, 115.863677723232 28.6766081113836, 115.862154868188 28.6790827508297, 115.857499052697 28.6784702230642))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.834974056705 28.6659171428962, 115.833760531592 28.6634960413229, 115.832422084777 28.6624550271329, 115.829745191145 28.6631986086972, 115.831232354274 28.6608191476914, 115.833314382654 28.6603729987527, 115.835545127347 28.6618601618814, 115.837032290475 28.6639421902615, 115.834974056705 28.6659171428962))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.885622116006 28.5766308429787, 115.883936664461 28.5771582901683, 115.883365593819 28.5752547213636, 115.883555950699 28.5740174016407, 115.88365112914 28.5724945465969, 115.885364341064 28.5721138328361, 115.886696839227 28.5725897250371, 115.887458266749 28.5736366878797, 115.886792017668 28.5753498998039, 115.885622116006 28.5766308429787))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.857644341395 28.5750890964568, 115.857572957565 28.5729475815515, 115.858429563527 28.5728761977213, 115.859072017998 28.5738041875136, 115.859072017998 28.5748035611361, 115.857644341395 28.5750890964568))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.912181587649 28.6231542087745, 115.912181587649 28.6215123806805, 115.915893546818 28.6212268453598, 115.916036314478 28.6231542087745, 115.912181587649 28.6231542087745))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.842039042965 28.6314426646115, 115.840992080122 28.631252307731, 115.842324578286 28.6305860586493, 115.843181184248 28.6305860586493, 115.84403779021 28.6304908802091, 115.84394261177 28.6317281999322, 115.842039042965 28.6314426646115))").build());
-        list.add(LotInfo.builder().dkfw("POLYGON((115.807011889796 28.623935465138, 115.805869748513 28.6224126100944, 115.810247956764 28.6220318963334, 115.809581707682 28.623935465138, 115.807011889796 28.623935465138))").build());
+    // 将度转换为弧度
+    public static double toRadians(double degrees) {
+        return degrees * Math.PI / 180.0;
+    }
 
+    // 计算两点间的航向角
+    public static double bearing(double lat1, double lon1, double lat2, double lon2) {
+        double lat1Rad = toRadians(lat1);
+        double lat2Rad = toRadians(lat2);
+        double deltaLonRad = toRadians(lon2 - lon1);
 
-//        list.forEach(patche -> {
-//            String wkt = patche.getDkfw();
-//            // 解析WKT字符串为多边形
-//            WKTReader wktReader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
-//            Geometry polygon = null;
-//            try {
-//                polygon = wktReader.read(wkt);
-//            } catch (ParseException e) {
-//                throw new RuntimeException(e);
-//            }
-//
-//            // 开始封装中心点坐标
-//            Coordinate coordinateCentro = getCentro(polygon);
-//
-//            // 开始封装图斑4个航线
-////            List<Coordinate> coordinatePointList = getExtremePoints(polygon);
-//            List<Coordinate> coordinatePointList = getSimplifyPolygons(polygon);
-//
-//
-//        });
+        double y = Math.sin(deltaLonRad) * Math.cos(lat2Rad);
+        double x = Math.cos(lat1Rad) * Math.sin(lat2Rad) -
+                Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad);
 
+        double bearing = Math.atan2(y, x);
 
-        List<PointPO> pointPOS = getRoutePointOrder(list, 28.624514734, 115.856725497);
-
-        for (PointPO c :
-                pointPOS) {
-            System.out.println(c);
-        }
-
-
+        // 将结果转换为度
+        return Math.toDegrees(bearing);
     }
 
     /**
@@ -195,6 +169,7 @@
         List<Coordinate> centros = new ArrayList<>();
         List<List<Coordinate>> extremePoints = new ArrayList<>();
         AtomicInteger numSize = new AtomicInteger();
+
 
         for (LotInfo patche : list) {
             String wkt = patche.getDkfw();
@@ -210,7 +185,7 @@
             // 开始封装中心点坐标
             Coordinate coordinateCentro = getCentro(polygon);
 
-            double distance = DistanceCalculator.calculateDistance(airportLat, airportLon, coordinateCentro.y,coordinateCentro.x);
+            double distance = DistanceCalculator.calculateDistance(airportLat, airportLon, coordinateCentro.y, coordinateCentro.x);
             // 机场范围,操作机场范围将不生成
             if (distance * 1000 > 7000) {
                 continue;
@@ -299,7 +274,7 @@
             for (Coordinate coordinate : extremePoints.get(index)) {
                 i = i + 1;
                 retc[i] = coordinate;
-                retcList.add(PointPO.builder().index(index).coordinate(coordinate).build());
+                retcList.add(PointPO.builder().index(index).coordinate(coordinate).centro(centros.get(index)).build());
             }
         }
 
@@ -308,4 +283,51 @@
 
     }
 
+    public static void main(String[] args) {
+        //测试
+        List<LotInfo> list = new ArrayList<>();
+        list.add(LotInfo.builder().dkfw("POLYGON((115.866465564947 28.6344502965542, 115.86425430209 28.6357383285408, 115.864551734716 28.633120921433, 115.866977149064 28.6338435339976, 115.866465564947 28.6344502965542))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.864006690605 28.6202713913694, 115.86002109342 28.6162025130492, 115.866374254306 28.6142037658042, 115.865912044006 28.6172001020759, 115.864006690605 28.6202713913694))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.839366933455 28.6161999317332, 115.841288489469 28.6160843601496, 115.840931570318 28.6181544912247, 115.838147600941 28.618654178036, 115.839366933455 28.6161999317332))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.857499052697 28.6784702230642, 115.859109158101 28.6762273976226, 115.863677723232 28.6766081113836, 115.862154868188 28.6790827508297, 115.857499052697 28.6784702230642))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.834974056705 28.6659171428962, 115.833760531592 28.6634960413229, 115.832422084777 28.6624550271329, 115.829745191145 28.6631986086972, 115.831232354274 28.6608191476914, 115.833314382654 28.6603729987527, 115.835545127347 28.6618601618814, 115.837032290475 28.6639421902615, 115.834974056705 28.6659171428962))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.885622116006 28.5766308429787, 115.883936664461 28.5771582901683, 115.883365593819 28.5752547213636, 115.883555950699 28.5740174016407, 115.88365112914 28.5724945465969, 115.885364341064 28.5721138328361, 115.886696839227 28.5725897250371, 115.887458266749 28.5736366878797, 115.886792017668 28.5753498998039, 115.885622116006 28.5766308429787))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.857644341395 28.5750890964568, 115.857572957565 28.5729475815515, 115.858429563527 28.5728761977213, 115.859072017998 28.5738041875136, 115.859072017998 28.5748035611361, 115.857644341395 28.5750890964568))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.912181587649 28.6231542087745, 115.912181587649 28.6215123806805, 115.915893546818 28.6212268453598, 115.916036314478 28.6231542087745, 115.912181587649 28.6231542087745))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.842039042965 28.6314426646115, 115.840992080122 28.631252307731, 115.842324578286 28.6305860586493, 115.843181184248 28.6305860586493, 115.84403779021 28.6304908802091, 115.84394261177 28.6317281999322, 115.842039042965 28.6314426646115))").build());
+        list.add(LotInfo.builder().dkfw("POLYGON((115.807011889796 28.623935465138, 115.805869748513 28.6224126100944, 115.810247956764 28.6220318963334, 115.809581707682 28.623935465138, 115.807011889796 28.623935465138))").build());
+
+
+//        list.forEach(patche -> {
+//            String wkt = patche.getDkfw();
+//            // 解析WKT字符串为多边形
+//            WKTReader wktReader = new WKTReader(JTSFactoryFinder.getGeometryFactory());
+//            Geometry polygon = null;
+//            try {
+//                polygon = wktReader.read(wkt);
+//            } catch (ParseException e) {
+//                throw new RuntimeException(e);
+//            }
+//
+//            // 开始封装中心点坐标
+//            Coordinate coordinateCentro = getCentro(polygon);
+//
+//            // 开始封装图斑4个航线
+////            List<Coordinate> coordinatePointList = getExtremePoints(polygon);
+//            List<Coordinate> coordinatePointList = getSimplifyPolygons(polygon);
+//
+//
+//        });
+
+
+        List<PointPO> pointPOS = getRoutePointOrder(list, 28.624514734, 115.856725497);
+
+        for (PointPO c :
+                pointPOS) {
+            System.out.println(c);
+        }
+
+
+    }
+
 }

--
Gitblit v1.9.3