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/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt | 32 ++++++++++
src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImplTest.kt | 30 ++++++++++
src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt | 76 +++++++++++++++++++++----
src/test/kotlin/com/flightfeather/uav/UAVApplicationTests.kt | 21 -------
src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteDataCalculateService.kt | 7 ++
5 files changed, 132 insertions(+), 34 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
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteDataCalculateService.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteDataCalculateService.kt
index 3d4fa01..98bfe6e 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteDataCalculateService.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteDataCalculateService.kt
@@ -29,4 +29,11 @@
* @param dataId 鏁版嵁绱㈠紩id
*/
fun splitData(groupId: Int, dataId:Int): List<GridDataDetail?>
+
+ /**
+ * 灏嗚蛋鑸洃娴嬫暟鎹拰鍗槦缃戞牸杩涜铻嶅悎璁$畻
+ * @param missionCode
+ * @param groupId
+ */
+ fun dataFusion(missionCode: String, groupId: Int): List<GridDataDetail?>
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt
index d69174c..7358603 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt
@@ -6,6 +6,8 @@
import com.flightfeather.uav.domain.entity.GridData
import com.flightfeather.uav.domain.entity.GridDataDetail
import com.flightfeather.uav.domain.entity.GridGroup
+import com.flightfeather.uav.domain.repository.MissionRep
+import com.flightfeather.uav.domain.repository.RealTimeDataRep
import com.flightfeather.uav.domain.repository.SatelliteGridRep
import com.flightfeather.uav.lightshare.eunm.GridType
import com.flightfeather.uav.lightshare.eunm.SatelliteDataType
@@ -22,7 +24,11 @@
* @author feiyu02
*/
@Service
-class SatelliteDataCalculateServiceImpl(private val satelliteGridRep: SatelliteGridRep) : SatelliteDataCalculateService {
+class SatelliteDataCalculateServiceImpl(
+ private val satelliteGridRep: SatelliteGridRep,
+ private val realTimeDataRep: RealTimeDataRep,
+ private val missionRep: MissionRep,
+) : SatelliteDataCalculateService {
override fun calGridVertex(groupId: Int): List<GridCell?> {
@@ -125,4 +131,28 @@
return subGridDataDetailList
}
+
+ @Transactional
+ override fun dataFusion(missionCode: String, groupId: Int): List<GridDataDetail?> {
+ // 鏌ヨ璧拌埅浠诲姟鍙婂搴旇蛋鑸洃娴嬫暟鎹�
+ val mission = missionRep.findOne(missionCode) ?: throw BizException("浠诲姟涓嶅瓨鍦�")
+ val data = realTimeDataRep.fetchData(mission)
+
+ // 鍒涘缓铻嶅悎鏁版嵁绱㈠紩瀵硅薄
+ val newGridData = GridData().apply {
+ this.groupId = groupId
+ dataTime = mission.startTime
+ type = SatelliteDataType.Monitor.value.toByte()
+ }
+ satelliteGridRep.insertGridData(newGridData)
+
+ // 鏌ヨ缃戞牸鍗曞厓鏍间俊鎭�
+ val gridCellList = satelliteGridRep.fetchGridCell(groupId)
+
+ // 灏嗚蛋鑸暟鎹拰鍗槦缃戞牸杩涜铻嶅悎璁$畻
+ val gridDataDetailList = SatelliteGridManage.dataFusion(data, newGridData, gridCellList)
+ satelliteGridRep.insertGridDataDetail(gridDataDetailList)
+
+ return gridDataDetailList
+ }
}
\ No newline at end of file
diff --git a/src/test/kotlin/com/flightfeather/uav/UAVApplicationTests.kt b/src/test/kotlin/com/flightfeather/uav/UAVApplicationTests.kt
index 6d4fab4..7409619 100644
--- a/src/test/kotlin/com/flightfeather/uav/UAVApplicationTests.kt
+++ b/src/test/kotlin/com/flightfeather/uav/UAVApplicationTests.kt
@@ -18,27 +18,6 @@
@Autowired
lateinit var realTimeDataService: RealTimeDataService
- @Autowired
- lateinit var gridDataDetailMapper: GridDataDetailMapper
-
- /**
- * 鍒锋柊姣忕粍鏁版嵁鐨勬暟鎹帓鍚�
- */
- @Test
- fun refreshDataRank() {
- for (i in 29..39) {
- val dataDetailList = gridDataDetailMapper.selectByExample(Example(GridDataDetail::class.java).apply {
- createCriteria().andEqualTo("dataId", i)
- orderBy("pm25").desc()
- })
- dataDetailList.forEachIndexed { i, d ->
- d?.rank = i + 1
- gridDataDetailMapper.updateByPrimaryKey(d)
- }
- println("finish --${i}")
- }
- }
-
@Test
fun contextLoads() {
}
diff --git a/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImplTest.kt b/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImplTest.kt
index c01f0d5..bbadfd9 100644
--- a/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImplTest.kt
+++ b/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImplTest.kt
@@ -1,11 +1,14 @@
package com.flightfeather.uav.lightshare.service.impl
+import com.flightfeather.uav.domain.entity.GridDataDetail
+import com.flightfeather.uav.domain.mapper.GridDataDetailMapper
import com.flightfeather.uav.lightshare.service.SatelliteDataCalculateService
import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringRunner
+import tk.mybatis.mapper.entity.Example
@RunWith(SpringRunner::class)
@@ -14,6 +17,27 @@
@Autowired
lateinit var satelliteDataCalculateService: SatelliteDataCalculateService
+
+ @Autowired
+ lateinit var gridDataDetailMapper: GridDataDetailMapper
+
+ /**
+ * 鍒锋柊姣忕粍鏁版嵁鐨勬暟鎹帓鍚�
+ */
+ @Test
+ fun refreshDataRank() {
+ for (i in 51..51) {
+ val dataDetailList = gridDataDetailMapper.selectByExample(Example(GridDataDetail::class.java).apply {
+ createCriteria().andEqualTo("dataId", i)
+ orderBy("pm25").desc()
+ })
+ dataDetailList.forEachIndexed { index, d ->
+ d?.rank = index + 1
+ gridDataDetailMapper.updateByPrimaryKey(d)
+ }
+ println("finish --${i}")
+ }
+ }
@Test
fun splitGrid() {
@@ -26,4 +50,10 @@
val res = satelliteDataCalculateService.splitData(4, 25)
// println(res)
}
+
+ @Test
+ fun dataFusion() {
+ val res = satelliteDataCalculateService.dataFusion("SH-CN-20241216", 3)
+// println(res)
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3