From 6d766eed50f34b102e607ea471f2ee565a8b9d30 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期五, 17 一月 2025 16:15:43 +0800 Subject: [PATCH] 1. 修改融合数据逻辑中,融合数据id数组为先排序后转换为字符串,修复同一批原始数据因为id排序不一样被判定为不同的融合数据的问题; --- src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt | 51 ++++++++++++ src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt | 110 +++++++++++++++++++++++---- src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt | 2 src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteDataMix.kt | 2 src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteDataCalculateService.kt | 19 ++++ 5 files changed, 166 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteDataMix.kt b/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteDataMix.kt index 8f4c3c9..92fffae 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteDataMix.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteDataMix.kt @@ -50,7 +50,7 @@ groupId = firstGridData?.groupId dataTime = Date() type = SatelliteDataType.Mix.value.toByte() - mixDataId = dataIdList.joinToString(",") + mixDataId = dataIdList.sorted().joinToString(",") } gridDataMapper.insert(avgGridData) 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 524dbc4..0322e9a 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/satellite/SatelliteGridManage.kt @@ -16,27 +16,32 @@ /** * 鏍规嵁姝f柟褰㈢綉鏍间腑蹇冪偣鍧愭爣锛岃绠�4涓《鐐瑰潗鏍� + * 缃戞牸涓績鐐瑰潗鏍囨寜鐓т粠宸﹀埌鍙炽�佷粠涓婂埌涓嬬殑椤哄簭鎺掑垪 * @param points 缃戞牸涓績鍧愭爣鐐规暟缁� */ fun calGridVertex(points: List<Pair<Double, Double>>): List<GridVertex> { + // 缃戞牸灏戜簬2涓紝鍒欐棤娉曠粯鍒� if (points.size < 2) return emptyList() - val p1 = points[0]; - val p2 = points[1]; + // 鑾峰彇鍓嶄袱涓綉鏍� + // Fixme 2025.01.10: 鐩墠鍏堢畝鍖栭�昏緫锛屾寜鐓у墠涓や釜鐐规槸宸﹀彸鎺掑竷锛屼笖鐐筽2鍦ㄧ偣p1鐨勪笢杈� + val p1 = points[0] + val p2 = points[1] // 涓や腑蹇冪偣闂寸殑瑙掑害 - val angle = MapUtil.getAngle(p1.first, p1.second, p2.first, p2.second); + val angle = MapUtil.getAngle(p1.first, p1.second, p2.first, p2.second) // 涓や腑蹇冪偣闂寸殑璺濈 - val dis = MapUtil.getDistance(p1.first, p1.second, p2.first, p2.second); + val dis = MapUtil.getDistance(p1.first, p1.second, p2.first, p2.second) // 缃戞牸姝f柟褰㈠瑙掔嚎鐨勪竴鍗婇暱搴� - val halfDiagonal = sqrt((dis / 2) * (dis / 2) * 2); + val halfDiagonal = sqrt((dis / 2) * (dis / 2) * 2) // 璁$畻棣栦釜姝f柟褰㈠悇椤剁偣鐩稿浜庝腑蹇冪偣鐨勮搴︼紝寰楀埌姝f柟褰㈠悇椤剁偣鐨勫潗鏍� - val angle1 = MapUtil.plusAngle(angle, 45.0); - val gp1 = MapUtil.getPointByLen(p1, halfDiagonal, angle1 * PI / 180); - val angle2 = MapUtil.plusAngle(angle1, 90.0); - val gp2 = MapUtil.getPointByLen(p1, halfDiagonal, angle2 * PI / 180); - val angle3 = MapUtil.plusAngle(angle2, 90.0); - val gp3 = MapUtil.getPointByLen(p1, halfDiagonal, angle3 * PI / 180); - val angle4 = MapUtil.plusAngle(angle3, 90.0); - val gp4 = MapUtil.getPointByLen(p1, halfDiagonal, angle4 * PI / 180); + // 4涓《鐐规寜鐓т粠宸︿笂瑙掑紑濮嬶紝椤烘椂閽堟柟鍚戠殑椤哄簭杩涜鎺掑垪 + val angle1 = MapUtil.plusAngle(angle, 45.0 + 180.0) + val gp1 = MapUtil.getPointByLen(p1, halfDiagonal, angle1 * PI / 180) + val angle2 = MapUtil.plusAngle(angle1, 90.0) + val gp2 = MapUtil.getPointByLen(p1, halfDiagonal, angle2 * PI / 180) + val angle3 = MapUtil.plusAngle(angle2, 90.0) + val gp3 = MapUtil.getPointByLen(p1, halfDiagonal, angle3 * PI / 180) + val angle4 = MapUtil.plusAngle(angle3, 90.0) + val gp4 = MapUtil.getPointByLen(p1, halfDiagonal, angle4 * PI / 180) // 璁$畻4涓《鐐瑰垎鍒笌涓績鐐圭殑缁忕含搴﹀樊鍊� val dx1 = gp1.first - p1.first val dy1 = gp1.second - p1.second @@ -59,10 +64,83 @@ } /** - * 鎷嗗垎缃戞牸 + * 鎷嗗垎缃戞牸涓虹粏鍒嗙綉鏍� + * 鏍规嵁鐩镐技鐭╁舰鐨勫師鐞嗭紝鍙互鍒嗗埆鎸夋瘮渚嬪緱鍒版瘡涓粏鍒嗙綉鏍肩殑缁忕含搴� + * @param gridCellList 鍘熷缃戞牸鏁扮粍 + * @param scale 鎷嗗垎鐨勭郴鏁帮紝渚嬪 2锛岃〃绀哄皢鍘熸湁缃戞牸鎸夎竟闀跨殑 1/2 鎷嗗垎鎴� 2 * 2 鐨�4涓綉鏍� */ - fun splitGrid(gridCellList: List<GridCell?>): List<GridCell> { - TODO() + fun splitGrid(gridCellList: List<GridCell>, scale: Int): List<GridCell> { + if (scale <= 0) throw IllegalArgumentException("缃戞牸鎷嗗垎鐨勬暟閲忎笉鑳藉皬浜�1") + // 鎷嗗垎绯绘暟涓�1锛屽垯琛ㄧず涓嶆媶鍒� + if (scale == 1) return gridCellList + if (gridCellList.isEmpty()) return emptyList() + + val newGridCellList = mutableListOf<GridCell>() + + // 鏍规嵁鍑芥暟[calGridVertex]鐢熸垚鐨勭綉鏍�4涓《鐐瑰潗鏍囷紝浠ヤ笂鍖椾笅鍗楀乏瑗垮彸涓滄柟鍚戜负鏍囧噯 + // 璁$畻棣栦釜缃戞牸涓績鍧愭爣鐐瑰垎鍒拰4涓《鐐圭殑缁忕含搴﹀樊鍊� + val p = gridCellList[0] + // 锛堥�氳繃杩戜技骞抽潰鍧愭爣绯荤殑鏂瑰紡锛夋牴鎹崟涓師濮嬬綉鏍肩殑4涓《鐐瑰潗鏍囷紝鍒嗗埆纭畾浠ヤ笅涓夌粍鍧愭爣鐐逛箣闂寸殑缁忕含搴﹀崟浣嶅亸绉婚噺 + val p1 = p.point1Lon to p.point1Lat + val p2 = p.point2Lon to p.point2Lat + val p3 = p.point3Lon to p.point3Lat + val p4 = p.point4Lon to p.point4Lat + // p1銆乸3鐨勭粡绾害鍗曚綅宸�� + val dx1 = (p3.first - p1.first) / scale.toBigDecimal() + val dy1 = (p3.second - p1.second) / scale.toBigDecimal() + // p1銆乸2鐨勭粡绾害鍗曚綅宸�� + val dx2 = (p2.first - p1.first) / scale.toBigDecimal() + val dy2 = (p2.second - p1.second) / scale.toBigDecimal() + // p3銆乸4鐨勭粡绾害鍗曚綅宸�� + val dx3 = (p4.first - p3.first) / scale.toBigDecimal() + val dy3 = (p4.second - p3.second) / scale.toBigDecimal() + // 涓績鐐瑰拰p1鐨勭粡绾害鍗曚綅宸�� + val dxC = (p.longitude - p1.first) / scale.toBigDecimal() + val dyC = (p.latitude - p1.second) / scale.toBigDecimal() + + // 缃戞牸琛屽惊鐜� + for (row in 0 until scale) { + val newGridCell1 = GridCell() + + // 纭畾姣忎竴琛岄涓粏鍒嗙綉鏍肩殑涓績鍧愭爣鍜�4涓《鐐瑰潗鏍� + // 宸︿笂瑙掗《鐐规牴鎹墍鍦ㄨ鏁板湪鍘熷缃戞牸椤剁偣鍩虹涓婂鍔犲亸绉婚噺 + newGridCell1.point1Lon = p1.first + dx1 * row.toBigDecimal() + newGridCell1.point1Lat = p1.second + dy1 * row.toBigDecimal() + // 宸︿笅瑙掗《鐐规牴鎹墍鍦ㄨ鏁板湪鍘熷缃戞牸椤剁偣鍩虹涓婂鍔犲亸绉婚噺锛堟瘮宸︿笂瑙掗《鐐瑰涓�涓亸绉伙級 + newGridCell1.point3Lon = p1.first + dx1 * (row + 1).toBigDecimal() + newGridCell1.point3Lat = p1.second + dy1 * (row + 1).toBigDecimal() + // 鍙充笂瑙掗《鐐瑰湪缁嗗垎缃戞牸宸︿笂瑙掔殑鍩虹涓婂鍔犵浉搴旂殑鍋忕Щ閲� + newGridCell1.point2Lon = newGridCell1.point1Lon + dx2 + newGridCell1.point2Lat = newGridCell1.point1Lat + dy2 + // 鍙充笅瑙掗《鐐瑰湪缁嗗垎缃戞牸宸︿笅瑙掔殑鍩虹涓婂鍔犵浉搴旂殑鍋忕Щ閲� + newGridCell1.point4Lon = newGridCell1.point3Lon + dx3 + newGridCell1.point4Lat = newGridCell1.point3Lat + dy3 + // 涓績鐐瑰湪缁嗗垎缃戞牸宸︿笂瑙掔殑鍩虹涓婂鍔犲浐瀹氬亸绉婚噺 + newGridCell1.longitude = newGridCell1.point1Lon + dxC + newGridCell1.latitude = newGridCell1.point1Lat + dyC + + // 鍔犲叆缁撴灉闆嗗悎 + newGridCellList.add(newGridCell1) + + // 缃戞牸鍒楀惊鐜�(浠庣2鍒楀紑濮�) + for (col in 1 until scale) { + val newGridCell = GridCell() + newGridCell.point1Lon = newGridCell1.point1Lon + dx2 * col.toBigDecimal() + newGridCell.point1Lat = newGridCell1.point1Lat + dy2 * col.toBigDecimal() + newGridCell.point2Lon = newGridCell1.point2Lon + dx2 * col.toBigDecimal() + newGridCell.point2Lat = newGridCell1.point2Lat + dy2 * col.toBigDecimal() + newGridCell.point3Lon = newGridCell1.point3Lon + dx3 * col.toBigDecimal() + newGridCell.point3Lat = newGridCell1.point3Lat + dy3 * col.toBigDecimal() + newGridCell.point4Lon = newGridCell1.point4Lon + dx3 * col.toBigDecimal() + newGridCell.point4Lat = newGridCell1.point4Lat + dy3 * col.toBigDecimal() + newGridCell.longitude = newGridCell.point1Lon + dxC + newGridCell.latitude = newGridCell.point1Lat + dyC + + newGridCellList.add(newGridCell) + } + } + + return newGridCellList } } \ 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 new file mode 100644 index 0000000..26073dc --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/SatelliteDataCalculateService.kt @@ -0,0 +1,19 @@ +package com.flightfeather.uav.lightshare.service + +import com.flightfeather.uav.domain.entity.GridCell + +/** + * + * @date 2025/1/13 + * @author feiyu02 + */ +interface SatelliteDataCalculateService { + + /** + * 鏍规嵁鍗槦閬ユ祴缃戞牸鐨勪腑蹇冨潗鏍囩偣锛岃绠楃綉鏍�4涓《鐐瑰潗鏍� + * @param groupId 缃戞牸缁勭储寮昳d + */ + fun calGridVertex(groupId: Int): List<GridCell?> + + fun splitGrid(groupId: Int): List<GridCell?> +} \ 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 new file mode 100644 index 0000000..9fcf324 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt @@ -0,0 +1,51 @@ +package com.flightfeather.uav.lightshare.service.impl + +import com.flightfeather.uav.biz.satellite.SatelliteGridManage +import com.flightfeather.uav.common.exception.BizException +import com.flightfeather.uav.domain.entity.GridCell +import com.flightfeather.uav.domain.repository.SatelliteGridRep +import com.flightfeather.uav.lightshare.service.SatelliteDataCalculateService +import org.springframework.stereotype.Service + +/** + * + * @date 2025/1/15 + * @author feiyu02 + */ +@Service +class SatelliteDataCalculateServiceImpl(private val satelliteGridRep: SatelliteGridRep) : SatelliteDataCalculateService { + + + override fun calGridVertex(groupId: Int): List<GridCell?> { + val cellList = satelliteGridRep.fetchGridCell(groupId) + val vertexList = SatelliteGridManage.calGridVertex(cellList.map { + if (it?.longitude == null || it.latitude == null) { + throw BizException("鍗槦閬ユ祴缃戞牸璁$畻椤剁偣鍧愭爣鐐瑰け璐ワ紝瀛樺湪涓績鐐瑰潗鏍囦负绌虹殑鎯呭喌") + } + it.longitude?.toDouble()!! to it.latitude?.toDouble()!! + }) + + cellList.forEachIndexed { i, c -> + val v = vertexList[i] + c?.point1Lon = v.point1Lon.toBigDecimal() + c?.point1Lat = v.point1Lat.toBigDecimal() + + c?.point2Lon = v.point2Lon.toBigDecimal() + c?.point2Lat = v.point2Lat.toBigDecimal() + + c?.point3Lon = v.point3Lon.toBigDecimal() + c?.point3Lat = v.point3Lat.toBigDecimal() + + c?.point4Lon = v.point4Lon.toBigDecimal() + c?.point4Lat = v.point4Lat.toBigDecimal() + } + + satelliteGridRep.updateGridCellBatch(cellList) + + return cellList + } + + override fun splitGrid(groupId: Int): List<GridCell?> { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt index 3e24c07..982c6ca 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteTelemetryServiceImpl.kt @@ -72,7 +72,7 @@ // 1. 鏍规嵁鏁版嵁涓婚敭id鏁扮粍锛屾煡璇㈣缁勫悎涓嬫槸鍚﹀凡鏈夋暟鎹瀺鍚堣褰� val exist = satelliteGridRep.fetchGridData(GridData().apply { type = 1 - mixDataId = dataIdList.joinToString(",") + mixDataId = dataIdList.sorted().joinToString(",") }) // 2. 鑻ヨ瀺鍚堟暟鎹凡瀛樺湪锛岀洿鎺ヨ繑鍥� return exist.ifEmpty { -- Gitblit v1.9.3