From 698f8f0f22af4c66581ce284407e986ca036aec6 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 23 一月 2025 17:10:26 +0800
Subject: [PATCH] 1. 网格细分逻辑(编写中)

---
 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt |  181 +++++++++++++++++++++++++++++++++++++-------
 1 files changed, 150 insertions(+), 31 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt
index e18a148..0986058 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt
@@ -3,20 +3,22 @@
 import com.flightfeather.uav.common.GridLat
 import com.flightfeather.uav.common.GridLng
 import com.flightfeather.uav.common.utils.MapUtil
-import com.flightfeather.uav.lightshare.bean.BaseResponse
-import com.flightfeather.uav.lightshare.bean.GridVo
+import com.flightfeather.uav.lightshare.bean.*
 import com.flightfeather.uav.lightshare.service.EPWModelService
 import com.flightfeather.uav.lightshare.service.RealTimeDataService
 import com.flightfeather.uav.model.epw.EPWGridModel
-import com.flightfeather.uav.model.epw.EPWModel
 import com.flightfeather.uav.socket.eunm.UWDeviceType
 import org.springframework.stereotype.Service
-import kotlin.math.PI
+import kotlin.math.*
 
 @Service
 class EPWModelServiceImpl(
     private val realTimeDataService: RealTimeDataService,
 ) : EPWModelService {
+
+    companion object {
+        private const val LEN = 3// 鏍规嵁椋庡悜缃戞牸鍚戝鎷撳睍鍦堟暟
+    }
 
     val epwModel = EPWGridModel()
 
@@ -34,6 +36,60 @@
         if (gridType == 'f') return BaseResponse(false)
 
         val points = mutableListOf<GridVo>()
+
+        // 鑾峰彇鍏ㄩ儴鏁版嵁璁$畻骞冲潎椋庡悜
+        val dataList = mutableListOf<DataVo>()
+        var page = 1
+        var totalPage = -1
+        //椋庡悜閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊�
+        var u = .0//涓滆タ鏂逛綅鍒嗛噺鎬诲拰
+        var v = .0//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰
+        var c = 0//椋庡悜鏁版嵁璁℃暟
+        var windDirection = .0 // 骞冲潎椋庡悜瑙掑害
+        while (totalPage == -1 || page <= totalPage) {
+            realTimeDataService.getSecondData(null, deviceCode, startTime, endTime, 0, page, 5000).apply {
+                if (totalPage == -1) {
+                    totalPage = head?.totalPage ?: 0
+                }
+                val list = data ?: emptyList()
+
+                // FIXME: 2021/7/13 姝ゅ涓轰簡娴嬭瘯鏆傛椂灏嗙珯鐐圭粡绾害鍐欐锛屽悗缁�氳繃鏁版嵁搴撻厤缃幏鍙�
+                list.forEach {
+                    if (it.lng == 0.0 && it.lat == 0.0) {
+                        it.lng = GridLng
+                        it.lat = GridLat
+                    }
+
+                    val r = Math.toRadians(it.values?.get(16)?.factorData ?: .0)
+                    u += sin(r)
+                    v += cos(r)
+                    c++
+                }
+
+                dataList.addAll(list)
+                page++
+            }
+        }
+
+        if (c != 0) {
+            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
+            }
+            windDirection = a
+        }
+
         // 鏍规嵁涓嶅悓绫诲瀷锛岀‘瀹氫笉鍚岀殑缃戞牸鐢熸垚鏂瑰紡锛屽緱鍑虹綉鏍间腑蹇冪偣闆嗗悎(缃戞牸榛樿閲囩敤姝f柟褰�)
         // 璧拌埅鐩戞祴
         if (gridType == '0') {
@@ -42,26 +98,51 @@
         // 瀹氱偣鐩戞祴
         else if (gridType == '1') {
             // FIXME: 2021/12/6 姝ゅ涓轰簡娴嬭瘯鏆傛椂灏嗙珯鐐圭粡绾害鍐欐锛屽悗缁�氳繃鏁版嵁搴撻厤缃幏鍙�
-            val center = Pair(121.235813, 30.835898)
+            val center = Pair(GridLng, GridLat)
             // a.纭畾缃戞牸闀垮害瀵瑰簲鐨勫潗鏍囧樊鍊�
+            // FIXME: 2021/12/16 姝ゅ缃戞牸鍧愭爣鐨勮绠楁瘮杈冪畝鍗曪紝杩戜技灏嗗叾褰撲綔骞抽潰鍧愭爣鏉ュ仛锛屽悗缁彲鏀硅繘
             val p1 = MapUtil.getPointByLen(center, len, PI / 2)//姝d笢鏂瑰悜锛�90掳锛夌殑鍧愭爣鐐�
             val p2 = MapUtil.getPointByLen(center, len, PI)//姝e崡鏂瑰悜锛�180掳锛夌殑鍧愭爣鐐�
             val dx = p1.first - center.first
             val dy = center.second - p2.second
             // b.纭畾鍗曡竟鏈夊灏戜釜缃戞牸(瑙勫畾鐩戞祴鐐瑰湪涓績缃戞牸鐨勪腑鐐逛笂锛屽洜姝ゅ崟杈圭綉鏍兼暟涓�瀹氫负濂囨暟)
-            val totalLen = 2000 // 缃戞牸鑼冨洿锛岃竟闀夸负20鍗冪背鐨勬鏂瑰舰
+            val totalLen = 2000 // FIXME: 2021/12/16 缃戞牸鑼冨洿锛岃竟闀夸负20鍗冪背鐨勬鏂瑰舰
             val gridNum = ((totalLen / 2 / len).toInt() - 1) * 2 + 1
             // c.纭畾宸︿笂瑙掔綉鏍煎乏涓嬪拰鍙充笂鐨勪袱涓瑙掔偣鍧愭爣
+            var len1 = gridNum//姘村钩鏂瑰悜缃戞牸鏁�
+            var width = gridNum//鍨傜洿鏂瑰悜缃戞牸鏁�
             //涓績鐐瑰潗鏍�
-            val g1CenterLng = center.first - (gridNum - 1) / 2 * dx//缁忓害鍑忓皬
-            val g1CenterLat = center.second + (gridNum - 1) / 2 * dy//绾害澧炲姞
+            var g1CenterLng = center.first - (gridNum - 1) / 2 * dx//缁忓害鍑忓皬
+            var g1CenterLat = center.second + (gridNum - 1) / 2 * dy//绾害澧炲姞
+            when (windDirection) {
+                in .0..90.0 -> {
+                    g1CenterLat += LEN * dy
+                    width += LEN
+                    len1 += LEN
+                }
+                in 90.0..180.0 -> {
+                    len1 += LEN
+                    width += LEN
+                }
+                in 180.0..270.0 -> {
+                    g1CenterLng -= LEN * dx
+                    len1 += LEN
+                    width += LEN
+                }
+                in 270.0..360.0 -> {
+                    g1CenterLng -= LEN * dx
+                    g1CenterLat += LEN * dy
+                    len1 += LEN
+                    width += LEN
+                }
+            }
             //宸︿笅鍧愭爣
             val g1LB = Pair(g1CenterLng - dx / 2, g1CenterLat - dy / 2)
             //鍙充笂鍧愭爣
             val g1RT = Pair(g1CenterLng + dx / 2, g1CenterLat + dy / 2)
             // d.寰楀嚭鎵�鏈夌綉鏍肩殑涓や釜瀵硅鐐瑰潗鏍�
-            for (x in 0 until gridNum) {
-                for (y in 0 until gridNum) {
+            for (x in 0 until len1) {
+                for (y in 0 until width) {
                     points.add(GridVo("$x-$y").apply {
                         this.lb = Pair(g1LB.first + dx * x, g1LB.second - dy * y)
                         this.rt = Pair(g1RT.first + dx * x, g1RT.second - dy * y)
@@ -72,27 +153,7 @@
             }
         }
         // 璁$畻鍚勪腑蹇冪偣姹℃煋椋庨櫓鏉冮噸缁撴灉骞惰祴浜堝搴斿奖鍝嶇瓑绾�
-        var page = 1
-        var totalPage = -1
-        while (totalPage == -1 || page <= totalPage) {
-            realTimeDataService.getSecondData(deviceCode, startTime, endTime, 0, page, 5000).apply {
-                if (totalPage == -1) {
-                    totalPage = head?.totalPage ?: 0
-                }
-                val dataList = data ?: emptyList()
-
-                // FIXME: 2021/7/13 姝ゅ涓轰簡娴嬭瘯鏆傛椂灏嗙珯鐐圭粡绾害鍐欐锛屽悗缁�氳繃鏁版嵁搴撻厤缃幏鍙�
-                dataList.forEach {
-                    if (it.lng == 0.0 && it.lat == 0.0) {
-                        it.lng = GridLng
-                        it.lat = GridLat
-                    }
-                }
-
-                epwModel.execute(dataList, points, true)
-                page++
-            }
-        }
+        epwModel.execute(dataList, points, true)
         val r = epwModel.outputResult()
 
         val max = mutableMapOf<String, Double>()//璁板綍姣忕鐩戞祴鍥犲瓙鐨勬渶澶у��
@@ -138,4 +199,62 @@
         }
         return BaseResponse(true, data = points)
     }
+
+    /**
+     * 浠ョ洃娴嬬偣涓虹綉鏍肩嚎涓婄殑涓績锛屽悜澶栨寜鐓ф鏂瑰舰杩涜鎵╂暎銆�
+     * 棣栧厛榛樿灞曠ず鐩戞祴鐐瑰懆鍥翠竴鍦�16涓綉鏍硷紝鐒跺悗鍐嶄互澶栧湀12涓綉鏍间负鍩虹鍚戝鎵╂暎锛屾瘡娆℃渶澶氭墿鏁d竴鍦堬紝鍒ゆ柇鏉冮噸缁撴灉锛屼繚鐣欐墍鏈夌殑楂橀闄╁拰涓闄╃綉鏍硷紝骞朵繚鐣欎袱鍦堜綆椋庨櫓缃戞牸
+     * 鍏朵腑鐨勯珮銆佷腑銆佷綆椋庨櫓鍒ゆ柇渚濇嵁涓虹綉鏍兼潈閲嶅�煎搴斿綋鍓嶆渶澶у�肩殑姣斾緥锛堝垎鐣屼负66.66%鍜�33.33%锛�
+     */
+    override fun getEpwModelResultDynamic(deviceCode: String, startTime: String, endTime: String, len: Double): BaseResponse<List<GridVo>> {
+//        if (deviceCode.length < 2) return BaseResponse(false, "璁惧缂栧彿鏍煎紡閿欒")
+//        // 纭畾鏁版嵁婧愮被鍨嬶紝鍖哄垎涓衡�樺畾鐐圭洃娴嬫暟鎹�欏拰鈥樼Щ鍔ㄧ洃娴嬫暟鎹袱绉嶁��
+//        val gridType = when (deviceCode.substring(0, 2)) {
+//            UWDeviceType.UAV.value -> '0'
+//            UWDeviceType.VEHICLE.value -> '0'
+//            UWDeviceType.GRID.value -> '1'
+//            UWDeviceType.BOAT.value -> 'f'
+//            else -> 'f'
+//        }
+//        if (gridType == 'f' || gridType == '0') return BaseResponse(false, "璇ヨ澶囩被鍨嬩笉鏀寔鍔ㄦ�佺綉鏍奸闄╄绠楋紝鍙湁瀹氱偣缃戞牸鍖栬澶囧彲琛�")
+//        val points = mutableListOf<GridVo>()
+//        // FIXME: 2021/12/6 姝ゅ涓轰簡娴嬭瘯鏆傛椂灏嗙珯鐐圭粡绾害鍐欐锛屽悗缁�氳繃鏁版嵁搴撻厤缃幏鍙�
+//        val center = Pair(GridLng, GridLat)
+//
+//        // a.纭畾缃戞牸闀垮害瀵瑰簲鐨勫潗鏍囧樊鍊�
+//        // FIXME: 2021/12/16 姝ゅ缃戞牸鍧愭爣鐨勮绠楁瘮杈冪畝鍗曪紝杩戜技灏嗗叾褰撲綔骞抽潰鍧愭爣鏉ュ仛锛屽悗缁彲鏀硅繘
+//        val p1 = MapUtil.getPointByLen(center, len, PI / 2)//姝d笢鏂瑰悜锛�90掳锛夌殑鍧愭爣鐐�
+//        val p2 = MapUtil.getPointByLen(center, len, PI)//姝e崡鏂瑰悜锛�180掳锛夌殑鍧愭爣鐐�
+//        val dx = p1.first - center.first
+//        val dy = center.second - p2.second
+//
+//        val grids = mutableListOf<QuadrantInfo>()// 鎵�鏈夌綉鏍�
+//        val outerMost = mutableMapOf<Quadrant, QuadrantInfo>()// 褰撳墠鏈�澶栧湀鐨勭綉鏍�
+//        // b.鍏堣绠楀唴閮ㄤ袱鍦堢殑缁撴灉
+//        grids.addAll(listOf(
+//            // 绗竴鍦�
+//            QuadrantInfo(Quadrant.First, 0),
+//            QuadrantInfo(Quadrant.Second, 0),
+//            QuadrantInfo(Quadrant.Third, 0),
+//            QuadrantInfo(Quadrant.Fourth, 0),
+//            // 绗簩鍦�
+//            QuadrantInfo(Quadrant.First, 1),
+//            QuadrantInfo(Quadrant.Second, 1),
+//            QuadrantInfo(Quadrant.Third, 1),
+//            QuadrantInfo(Quadrant.Fourth, 1),
+//        ))
+//        //褰撳墠鏈�澶栧湀锛堢浜屽湀锛�
+//        outerMost[Quadrant.First] = grids[4]
+//        outerMost[Quadrant.Second] = grids[5]
+//        outerMost[Quadrant.Third] = grids[6]
+//        outerMost[Quadrant.Fourth] = grids[7]
+//        //涓績鐐瑰潗鏍�
+//        val g1CenterLng = center.first - (gridNum - 1) / 2 * dx//缁忓害鍑忓皬
+//        val g1CenterLat = center.second + (gridNum - 1) / 2 * dy//绾害澧炲姞
+//        //宸︿笅鍧愭爣
+//        val g1LB = Pair(g1CenterLng - dx / 2, g1CenterLat - dy / 2)
+//        //鍙充笂鍧愭爣
+//        val g1RT = Pair(g1CenterLng + dx / 2, g1CenterLat + dy / 2)
+
+        return BaseResponse(true)
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3