From 8eb584869b4fd4de0f51c93f2616f12e51df9193 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 18 十二月 2025 17:48:29 +0800
Subject: [PATCH] 2025.12.18 1. 动态溯源相关分析逻辑调整; 2. 走航报告接口参数调整;

---
 src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt |  123 +++++++++++++++++++++++++++++-----------
 1 files changed, 89 insertions(+), 34 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt
index fac9ce7..127622c 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt
@@ -1,5 +1,7 @@
 package com.flightfeather.uav.biz.sourcetrace.model
 
+import com.flightfeather.uav.biz.FactorFilter
+import com.flightfeather.uav.biz.dataanalysis.model.ExceptionTag
 import com.flightfeather.uav.biz.sourcetrace.config.RTExcWindLevelConfig
 import com.flightfeather.uav.common.net.AMapService
 import com.flightfeather.uav.common.utils.MapUtil
@@ -20,50 +22,86 @@
      */
 
     constructor(
-        exceptionData: List<BaseRealTimeData>,
+        pollutedData: PollutedData,
         config: RTExcWindLevelConfig,
-        windLevelCondition: RTExcWindLevelConfig.WindLevelCondition,
-    ) : this() {
-        distanceType = windLevelCondition.mutationRate.second
-        sourceTrace(exceptionData, config, windLevelCondition)
+        windLevelCondition: RTExcWindLevelConfig.WindLevelCondition?,
+    ) : this(){
+        distanceType = windLevelCondition?.distanceType
+        distanceRange = distanceType?.disRange
+        distanceDes = distanceType?.des
+        windLevelCondition?.let { sourceTrace(pollutedData, config, it) }
     }
 
+    // 鎵�灞炶闀�
+    var township:String? = null
+    // 鏍煎紡鍖栧湴鍧�
     var address: String? = null
+    // 鎵�鍦ㄩ亾璺悕绉�
+    var street:String? = null
+    // 鎵�鍦ㄩ亾璺笂鐨勬渶杩戦棬鐗屽彿
+    var streetNumber:String? = null
+    // 澶勪簬璇ラ棬鐗屽彿鐨勬柟鍚�
+    var direction:String? = null
+    // 澶勪簬璇ラ棬鐗屽彿鐨勬柟鍚戣窛绂�
+    var distance: String? = null
+    // 鎵�澶勬渶杩戜氦鍙夎矾鍙g殑鏂瑰悜鍜岃窛绂�
+    var roadinter:String? = null
+    // 鎵�澶勬渶杩戜氦鍙夎矾鍙g殑璺濈
+    var distance2: String? = null
 
-    // 姹℃煋鑼冨洿鍖哄煙(缁忕含搴﹀杈瑰舰)
+    // 姹℃煋鑼冨洿鎵囧舰鍖哄煙(缁忕含搴﹀杈瑰舰)
     var polygon: List<Pair<Double, Double>>? = null
+
+    // 杩戣窛绂绘薄鏌撳渾褰㈠尯鍩�
+    var closePolygon: List<Pair<Double, Double>>? = null
 
     // 姹℃煋鍙兘鐨勫彂鐢熻窛绂�
     var distanceType: DistanceType? = null
+
+    var distanceRange: Pair<Double, Double>? = null
+    var distanceDes: String? = null
 
     /**
      * 鍙嶅悜婧簮
      */
     private fun sourceTrace(
-        exceptionData: List<BaseRealTimeData>,
+        pollutedData: PollutedData,
         config: RTExcWindLevelConfig,
         windLevelCondition: RTExcWindLevelConfig.WindLevelCondition,
     ) {
-        val avgData = if (exceptionData.size == 1) {
-            exceptionData.first()
-        } else {
-            exceptionData.avg()
+
+        val avgData = pollutedData.getExceptionAvgData()
+        val pair = avgData.longitude!!.toDouble() to avgData.latitude!!.toDouble()
+        polygon = calSector(
+            avgData.windDirection?.toDouble() ?: .0,
+            pair,
+            windLevelCondition.distanceType.disRange,
+            config.sourceTraceDegOffset
+        ).map {
+            // 灏嗗潗鏍囪浆鎹负gcj02锛堢伀鏄熷潗鏍囩郴锛夛紝鍥犱负姹℃煋婧愬満鏅俊鎭兘涓烘鍧愭爣绯�
+            MapUtil.wgs84ToGcj02(it)
         }
 
-        val pair = avgData.longitude!!.toDouble() to avgData.latitude!!.toDouble()
+        closePolygon = closeSourceTrace(pair).map {
+            // 灏嗗潗鏍囪浆鎹负gcj02锛堢伀鏄熷潗鏍囩郴锛夛紝鍥犱负姹℃煋婧愬満鏅俊鎭兘涓烘鍧愭爣绯�
+            MapUtil.wgs84ToGcj02(it)
+        }
 
-        polygon = calSector(
-            avgData.windSpeed!!.toDouble(),
-            pair,
-            windLevelCondition.mutationRate.second.disRange,
-            config.sourceTraceDegOffset
-        )
-
-        try {
-            val address = AMapService.reGeo(pair)
-            this.address = address.township + address.street
-        } catch (e: Exception) {
-            e.printStackTrace()
+        if (config.isSearchAddress) {
+            try {
+                val address = AMapService.reGeo(MapUtil.wgs84ToGcj02(pair))
+                this.township = address.province + address.district + address.township
+                this.address = address.address
+                this.street = address.street
+                this.streetNumber = address.streetNumber
+                this.direction = address.direction
+                this.distance = address.distance
+                this.roadinter = address.roadinter
+                this.distance2 = address.distance2
+                Thread.sleep(100)
+            } catch (e: Exception) {
+                e.printStackTrace()
+            }
         }
 
     }
@@ -89,25 +127,42 @@
         val result = mutableListOf<Pair<Double, Double>>()
 
         if (distanceRange.first == .0) {
-            result.add(center)
+//            result.add(center)
+            var startDeg = 0
+            while (startDeg <= 360) {
+                val p = MapUtil.getPointByLen(center, distanceRange.second, startDeg * PI / 180)
+                result.add(p)
+                startDeg++
+            }
         } else {
-            // 浠庡紑濮嬭搴﹀惊鐜绠楀潗鏍囩偣鍊肩粨鏉熻搴︼紝姝ラ暱1掳
+            // 浠庡紑濮嬭搴﹀惊鐜绠楀潗鏍囩偣鑷崇粨鏉熻搴︼紝姝ラ暱1掳
             var startDeg = sDeg
             while (startDeg <= eDeg) {
                 val p = MapUtil.getPointByLen(center, distanceRange.first, startDeg * PI / 180)
                 result.add(p)
                 startDeg++
             }
+            if (distanceRange.second > .0) {
+                // 姝ゅ闇�瑕佷粠缁撴潫瑙掑害寮�濮嬪弽鍚戝惊鐜绠楄嚦寮�濮嬭搴︼紝姝ラ暱1掳锛屼娇寰椾袱缁勫潗鏍囩偣鎸夐『搴忔帓鍒楋紝鍙粯鍒跺搴旂殑澶氳竟褰�
+                startDeg = eDeg
+                while (startDeg >= sDeg) {
+                    val p = MapUtil.getPointByLen(center, distanceRange.second, startDeg * PI / 180)
+                    result.add(p)
+                    startDeg--
+                }
+            }
         }
 
-        if (distanceRange.second > .0) {
-            // 姝ゅ闇�瑕佷粠缁撴潫瑙掑害寮�濮嬪弽鍚戝惊鐜绠楄嚦寮�濮嬭搴︼紝姝ラ暱1掳锛屼娇寰椾袱缁勫潗鏍囩偣鎸夐『搴忔帓鍒楋紝鍙粯鍒跺搴旂殑澶氳竟褰�
-            var startDeg = eDeg
-            while (startDeg >= sDeg) {
-                val p = MapUtil.getPointByLen(center, distanceRange.second, startDeg * PI / 180)
-                result.add(p)
-                startDeg--
-            }
+        return result
+    }
+
+    private fun closeSourceTrace(center: Pair<Double, Double>): List<Pair<Double, Double>> {
+        val result = mutableListOf<Pair<Double, Double>>()
+        var startDeg = 0
+        while (startDeg <= 360) {
+            val p = MapUtil.getPointByLen(center, DistanceType.TYPE1.disRange.second, startDeg * PI / 180)
+            result.add(p)
+            startDeg++
         }
 
         return result

--
Gitblit v1.9.3