From 022af485fbd77bc3d6b01f9f779248b3c189dad2 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 04 七月 2024 17:35:33 +0800
Subject: [PATCH] 1. 新增走航报告自动道路识别模块

---
 src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt |   93 +++++++++++++++++++++++++++++++++++++---------
 1 files changed, 74 insertions(+), 19 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt b/src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt
similarity index 60%
rename from src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt
rename to src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt
index abd56ec..2b0ed10 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt
+++ b/src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt
@@ -1,9 +1,11 @@
-package com.flightfeather.uav.biz.dataprocess
+package com.flightfeather.uav.common.location
 
-import com.flightfeather.uav.common.location.CoordinateUtil
 import com.flightfeather.uav.domain.entity.BaseRealTimeData
 import java.math.BigDecimal
 import kotlin.math.abs
+import kotlin.math.atan
+import kotlin.math.cos
+import kotlin.math.sin
 
 /**
  * 璧拌埅杞ㄨ抗鍒嗗壊鍒嗙被
@@ -13,10 +15,10 @@
 object TrackSegment {
 
     // 鍧愭爣鐐归棿鏈�灏忚窛绂伙紝鍗曚綅绫�
-    private const val MIN_DISTANCE = 10
+    private const val MIN_DISTANCE = 6
 
     // 涓ゆ潯鐩寸嚎澶硅涓�90搴︽椂锛岃涓哄瀭鐩淬�傚疄闄呮儏鍐典腑锛岃搴﹀厑璁告湁涓�瀹氬亸宸紝鍏佽鍋忓樊瑙掑害
-    private const val VERTICAL_OFFSET_DEG = 22.5
+    private const val VERTICAL_OFFSET_DEG = 45
 
     /**
      * 鎸夌収閬撹矾瀵硅蛋鑸建杩硅繘琛屽垎鍓�
@@ -34,13 +36,13 @@
         val closeList = mutableListOf<BaseRealTimeData>()
         records.add(mutableListOf())
         data.forEachIndexed { i, d ->
-            if (records.size == 33) {
+            if (records.size == 23) {
                 println(records.size)
             }
             var isSame = false
             if (i > 0) {
                 // 鍓嶄竴涓湁鏁堢洃娴嬬偣
-                val lastData = data[i - 1]
+                var lastData = data[i - 1]
                 // 纭繚涓ょ偣鍧愭爣鍚堟硶
                 if ((lastData.longitude != null && lastData.longitude != BigDecimal.ZERO)
                     && (lastData.latitude != null && lastData.latitude != BigDecimal.ZERO)
@@ -57,6 +59,7 @@
                         // 濡傛灉宸茬粡鏈夎窛绂昏繃杩戠殑鐐归泦鍚堬紝鍒欒繕闇�瑕佸拰绗竴涓偣杩涜璺濈鍒ゆ柇锛�
                         // 瑙e喅褰撹溅杈嗚椹堕�熷害杩囦綆鏃讹紝杩炵画鐐圭殑璺濈閮借繃杩戝鑷撮兘鍒ゅ畾涓哄悓涓�鐐圭殑闂
                         val firstCloseData = closeList[0]
+//                        lastData = closeList.toList().avg()
                         distance = CoordinateUtil.calculateDistance(
                             firstCloseData.longitude!!.toDouble(), firstCloseData.latitude!!.toDouble(),
                             d.longitude!!.toDouble(), d.latitude!!.toDouble())
@@ -69,27 +72,43 @@
                         )
                         isSame = if (lastDegList.isNotEmpty()) {
                             var bool = true
-                            // 鍑虹幇瑙掑害鎺ヨ繎鍨傜洿鐘舵�佺殑娆℃暟
-                            var unSameCount = 0
-                            // 姣旇緝褰撳墠鏂逛綅瑙掑拰涓婁竴缁勬瘡涓柟浣嶈鐨勫樊鍊兼槸鍚﹂兘澶勪簬鑼冨洿鍐�
-                            for (lastDeg in lastDegList) {
-                                val diffDeg = abs(deg - lastDeg)
-                                if (diffDeg in (90.0 - VERTICAL_OFFSET_DEG)..(90.0 + VERTICAL_OFFSET_DEG)
-                                    || diffDeg in (270.0 - VERTICAL_OFFSET_DEG)..(270.0 + VERTICAL_OFFSET_DEG)
-                                ) {
-                                    unSameCount++
-                                }
+
+
+//                            // 鍑虹幇瑙掑害鎺ヨ繎鍨傜洿鐘舵�佺殑娆℃暟
+//                            var unSameCount = 0
+//                            // 姣旇緝褰撳墠鏂逛綅瑙掑拰涓婁竴缁勬瘡涓柟浣嶈鐨勫樊鍊兼槸鍚﹂兘澶勪簬鑼冨洿鍐�
+//                            for (lastDeg in lastDegList) {
+//                                val diffDeg = abs(deg - lastDeg)
+//                                if (diffDeg in (90.0 - VERTICAL_OFFSET_DEG)..(90.0 + VERTICAL_OFFSET_DEG)
+//                                    || diffDeg in (270.0 - VERTICAL_OFFSET_DEG)..(270.0 + VERTICAL_OFFSET_DEG)
+//                                ) {
+//                                    unSameCount++
+//                                }
+//                            }
+//                            // 褰撴帴杩戝瀭鐩寸殑瑙掑害瓒呰繃涓婁竴缁勫钩琛岃搴︾殑涓�鍗婃椂锛岃涓轰粠璇ョ偣杞ㄨ抗杞集锛堟秷闄や釜鍒潗鏍囩偣鐢变簬瀹氫綅璇樊瀵艰嚧鐨勯敊璇奖鍝嶏級
+//                            bool = unSameCount < (lastDegList.size / 3 + 1)
+
+                            val avgDeg = avgDegree(lastDegList)
+                            val diffDeg = abs(deg - avgDeg)
+                            if (diffDeg in (90.0 - VERTICAL_OFFSET_DEG)..(90.0 + VERTICAL_OFFSET_DEG)
+                                || diffDeg in (270.0 - VERTICAL_OFFSET_DEG)..(270.0 + VERTICAL_OFFSET_DEG)
+                            ) {
+                                bool = false
                             }
-                            // 褰撴帴杩戝瀭鐩寸殑瑙掑害瓒呰繃涓婁竴缁勫钩琛岃搴︾殑涓�鍗婃椂锛岃涓轰粠璇ョ偣杞ㄨ抗杞集锛堟秷闄や釜鍒潗鏍囩偣鐢变簬瀹氫綅璇樊瀵艰嚧鐨勯敊璇奖鍝嶏級
-                            bool = unSameCount < (lastDegList.size / 3 + 1)
+
                             // 褰撳嚭鐜拌浆寮偣鏃讹紝娓呯┖鍘嗗彶瑙掑害锛屽苟涓旇垗寮冭浆寮偣鐩稿浜庡墠涓�涓偣鐨勮搴︼紙瑙e喅涓�绉嶆瀬绔儏鍐碉紝褰撹繛缁嚭鐜拌浆寮偣鏃讹紝褰撳墠鍧愭爣鐐逛細琚崟鐙垎鍓蹭负涓�娈碉級
-                            if (!bool) lastDegList.clear()
+                            if (!bool) {
+                                lastDegList.clear()
+                            } else {
+                                lastDegList.add(deg)
+                            }
                             bool
                         } else {
                             // 褰撳潗鏍囩偣褰㈡垚鏈夋晥璺緞鏃讹紝璁板綍涓轰笂涓�涓潗鏍囩偣
                             lastDegList.add(deg)
                             true
                         }
+                        closeList.clear()
                     } else {
                         closeList.add(d)
                         isSame = true
@@ -110,4 +129,40 @@
 
         return records
     }
+
+    /**
+     * 姹傝浆鍚戣搴︾殑鍧囧��
+     */
+    private fun avgDegree(degList: List<Double>): Double {
+        if (degList.isEmpty()) return .0
+        //閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊�
+        var u = .0//涓滆タ鏂逛綅鍒嗛噺鎬诲拰
+        var v = .0//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰
+        var c = 0//鏁版嵁璁℃暟
+
+        degList.forEach {
+            val r = Math.toRadians(it)
+            u += sin(r)
+            v += cos(r)
+            c++
+        }
+
+        val avgU = u / c
+        val avgV = v / c
+        var a = atan(avgU / avgV)
+        a = Math.toDegrees(a)
+        /**
+         * avgU>0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗竴璞¢檺锛屼慨姝e�间负+0掳
+         * avgU>0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗簩璞¢檺锛屼慨姝e�间负+180掳
+         * avgU<0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗笁璞¢檺锛屼慨姝e�间负+180掳
+         * avgU<0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗洓璞¢檺锛屼慨姝e�间负+360掳
+         */
+        a += if (avgV > 0) {
+            if (avgU > 0) 0 else 360
+        } else {
+            180
+        }
+
+        return a
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3