From dacef58ee7c44dffdd40cb646435c2993ad7a217 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期五, 21 二月 2025 17:20:00 +0800
Subject: [PATCH] 1. 新增坐标点是否在多边形内部的判定算法并测试

---
 src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt |   76 ++++++++++++++++++++++++++++++++------
 1 files changed, 64 insertions(+), 12 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt b/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt
index bdbb96a..36c85c7 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt
@@ -1,10 +1,7 @@
 package com.flightfeather.uav.biz.satellite
 
 import com.flightfeather.uav.common.utils.MapUtil
-import com.flightfeather.uav.domain.entity.BaseRealTimeData
-import com.flightfeather.uav.domain.entity.GridCell
-import com.flightfeather.uav.domain.entity.GridData
-import com.flightfeather.uav.domain.entity.GridDataDetail
+import com.flightfeather.uav.domain.entity.*
 import kotlin.math.PI
 import kotlin.math.sqrt
 
@@ -20,7 +17,9 @@
     /**
      * 鏍规嵁姝f柟褰㈢綉鏍间腑蹇冪偣鍧愭爣锛岃绠�4涓《鐐瑰潗鏍�
      * 缃戞牸涓績鐐瑰潗鏍囨寜鐓т粠宸﹀埌鍙炽�佷粠涓婂埌涓嬬殑椤哄簭鎺掑垪
+     * @date 2025.1.8
      * @param points 缃戞牸涓績鍧愭爣鐐规暟缁�
+     * @return 缃戞牸4涓《鐐圭粡绾害鍧愭爣
      */
     fun calGridVertex(points: List<Pair<Double, Double>>): List<GridVertex> {
         // 缃戞牸灏戜簬2涓紝鍒欐棤娉曠粯鍒�
@@ -69,10 +68,11 @@
     /**
      * 鎷嗗垎缃戞牸涓虹粏鍒嗙綉鏍硷紝鎵�鏈夌綉鏍煎簲璇ユ槸鐩稿悓杈归暱鐨勬鏂瑰舰
      * 鏍规嵁鐩镐技鐭╁舰鐨勫師鐞嗭紝鍙互鍒嗗埆鎸夋瘮渚嬪緱鍒版瘡涓粏鍒嗙綉鏍肩殑缁忕含搴�
+     * @date 2025.1.17
      * @param gridCellList 鍘熷缃戞牸鏁扮粍
      * @param scale 鎷嗗垎鐨勭郴鏁帮紝渚嬪 2锛岃〃绀哄皢鍘熸湁缃戞牸鎸夎竟闀跨殑 1/2 鎷嗗垎鎴� 2 * 2 鐨�4涓綉鏍�
      * @param groupId 缁嗗垎鍚庣殑缃戞牸鎵�灞炵殑缃戞牸缁刬d
-     * @return
+     * @return 缁嗗垎缃戞牸
      */
     fun splitGrid(gridCellList: List<GridCell?>, scale: Int, groupId:Int): List<GridCell?> {
         if (scale <= 0) throw IllegalArgumentException("缃戞牸鎷嗗垎鐨勬暟閲忎笉鑳藉皬浜�1")
@@ -165,9 +165,11 @@
 
     /**
      * 鎷嗗垎鏁版嵁锛屽皢鍘熷鍗槦缃戞牸閬ユ祴鏁版嵁鏄犲皠鍒板搴旂粏鍒嗙綉鏍间笂
-     * @param subGridCellList 缁嗗垎缃戞牸, 鎸夌収
+     * @date 2025.2.7
+     * @param subGridCellList 缁嗗垎缃戞牸
      * @param subGridData 缁嗗垎缃戞牸瀵瑰簲鐨勬暟鎹储寮�
      * @param originGridDataDetailList 缁嗗垎缃戞牸鎵�灞炵綉鏍肩殑鍘熷缃戞牸鏁版嵁
+     * @return 鏄犲皠鍚庣殑缁嗗垎缃戞牸閬ユ祴鏁版嵁
      */
     fun splitData(
         subGridCellList: List<GridCell?>, subGridData: GridData, originGridDataDetailList: List<GridDataDetail?>
@@ -217,21 +219,71 @@
     }
 
     /**
-     * 鏁版嵁铻嶅悎
+     * 璧拌埅鏁版嵁鍜屽崼鏄熺綉鏍艰瀺鍚�
+     * 鏁版嵁铻嶅悎閲囩敤鍧囧�兼柟寮忕粺璁★紙鏆傛椂锛�
+     * @date 2025.2.7
      * @param realTimeDataList 寰呰瀺鍚堢殑璧拌埅鐩戞祴鏁版嵁
      * @param gridData 铻嶅悎鍚庣殑鏁版嵁缁勭储寮�
      * @param gridCellList 寰呰瀺鍚堢殑鍗槦缃戞牸
+     * @return 铻嶅悎鍚庣殑缃戞牸鐩戞祴鏁版嵁
      */
-    fun dataFusion(realTimeDataList:List<BaseRealTimeData>, gridData: GridData, gridCellList: List<GridCell?>) {
-        // 閬嶅巻璧拌埅鐩戞祴鏁版嵁锛岃绠楁瘡涓偣鎵�鍦ㄧ綉鏍�,骞跺舰鎴愮綉鏍煎��
+    fun dataFusion(
+        realTimeDataList: List<BaseRealTimeData>,
+        gridData: GridData,
+        gridCellList: List<GridCell?>,
+    ): List<GridDataDetail> {
+        // 閬嶅巻璧拌埅鐩戞祴鏁版嵁锛岃绠楁瘡涓偣鎵�鍦ㄧ綉鏍�
+        val dataMap = mutableMapOf<GridCell, MutableList<BaseRealTimeData>>()
         realTimeDataList.forEach {
-            it.longitude
-            it.latitude
-            gridCellList.forEach {
+            if (it.longitude == null || it.latitude == null) return@forEach
 
+            searchGirdIn(it.longitude!!.toDouble() to it.latitude!!.toDouble(), gridCellList)?.let { cell ->
+                if (!dataMap.containsKey(cell)) {
+                    dataMap[cell] = mutableListOf()
+                }
+                dataMap[cell]?.add(it)
             }
         }
+
+        // 缁熻姣忎釜缃戞牸涓殑鍧囧��
+        // Fixme 2025.2.20 鏆傛椂榛樿浠ュ潎鍊兼柟寮忕粺璁★紝鍚庣画璋冩暣涓哄绉嶆柟寮忓苟鏀寔鐢ㄦ埛閫夋嫨
+        val gridDataDetailList = mutableListOf<GridDataDetail>()
+        dataMap.forEach { (k, v) ->
+            val avgData = v.avg()
+            val dataDetail = GridDataDetail().apply {
+                dataId = gridData.id
+                groupId = k.groupId
+                cellId = k.cellIndex
+                pm25 = avgData.pm25
+                rank
+            }
+            gridDataDetailList.add(dataDetail)
+        }
+
+        return gridDataDetailList
     }
 
+    /**
+     * 璁$畻鍧愭爣鐐瑰湪鍝釜鍗槦缃戞牸鍐�
+     * @date 2025.2.14
+     * @param point 鍧愭爣鐐�
+     * @param gridCellList 鍗槦缃戞牸
+     */
+    fun searchGirdIn(point: Pair<Double, Double>, gridCellList: List<GridCell?>): GridCell? {
+        for (i in gridCellList.indices) {
+            val gridCell = gridCellList[i] ?: continue
+            val polygon = listOf(
+                gridCell.point1Lon.toDouble() to gridCell.point1Lat.toDouble(),
+                gridCell.point2Lon.toDouble() to gridCell.point2Lat.toDouble(),
+                gridCell.point3Lon.toDouble() to gridCell.point3Lat.toDouble(),
+                gridCell.point4Lon.toDouble() to gridCell.point4Lat.toDouble(),
+            )
+            if (MapUtil.isPointInPolygon(point, polygon)) {
+                return gridCell
+            }
+        }
+
+        return null
+    }
 
 }
\ No newline at end of file

--
Gitblit v1.9.3