feiyu02
2025-10-21 eb3dd00b0b7fcda477229d518d250f9c842b790b
src/main/kotlin/com/flightfeather/uav/biz/report/MissionGridFusion.kt
@@ -8,6 +8,7 @@
import com.flightfeather.uav.domain.repository.SceneInfoRep
import com.flightfeather.uav.lightshare.bean.GridDataDetailMixVo
import com.flightfeather.uav.lightshare.eunm.PollutionDegree
import com.flightfeather.uav.lightshare.eunm.SceneType
import com.flightfeather.uav.socket.eunm.FactorType
/**
@@ -16,6 +17,11 @@
 * @author feiyu02
 */
class MissionGridFusion(private val sceneInfoRep: SceneInfoRep) {
    companion object {
        // 需统计高风险网格的数量
        const val HIGH_RISK_GRID_NUM = 3
    }
    /**
     * 按AQI等级叠加网格
@@ -26,6 +32,10 @@
        var missionList: MutableList<MissionInventory.MissionInfo> = mutableListOf()
        var gridFusionList: MutableList<FusionGrid> = mutableListOf()
        var highRiskGridList: MutableList<HighRiskGridByFactor> = mutableListOf()
        // 走航区域内的高风险网格
        var highRiskGridMap: MutableMap<FactorType, List<HighRiskGridByFactor>> = mutableMapOf()
        // 报告对应的辖区内的高风险网格
        var highRiskGridMap2: MutableMap<FactorType, List<HighRiskGridByFactor>> = mutableMapOf()
    }
    /**
@@ -72,41 +82,156 @@
        gridCells: List<GridCell>,
        dataList: List<Triple<PollutionDegree, List<MissionInventory.MissionInfo>, List<GridDataDetailMixVo>>>,
    ): List<GridFusionByAQI> {
        val polyLineJingAn = AMapService.polyLineJingAn.split(";")
            .map {
                val p = it.split(",")
                Pair(p[0].toDouble(), p[1].toDouble())
            }
        return dataList.map {
            GridFusionByAQI().apply {
                // 空气质量等级
                pollutionDegree = it.first.des
                // 网格边长(米)
                this.gridLen = gridLen
                // 走航任务详情列表
                missionList.addAll(it.second)
                // 网格融合列表
                gridFusionList.addAll(it.third.map { gdm ->
                    val grid = gridCells.find { it.cellIndex == gdm.cellId }
                        ?: throw IllegalArgumentException("网格组${gdm.groupId}中,单元ID: ${gdm.cellId} 不存在")
                    FusionGrid(grid, gdm)
                })
                highRiskGridList.addAll(factorTypes.map { f->
                    HighRiskGridByFactor().apply {
                        factorType = f
                        highRiskGrid = gridFusionList.maxByOrNull { gf->gf.data.getByFactorType(f) ?: 0f }
                        if (highRiskGrid != null) {
                            factorValue = highRiskGrid!!.data.getByFactorType(f)
                            if (highRiskGrid!!.cell.longitude != null && highRiskGrid!!.cell.latitude != null) {
                                Thread.sleep(100)
                                val address = AMapService.reGeo(MapUtil.wgs84ToGcj02(
                                    highRiskGrid!!.cell.longitude.toDouble()
                                            to highRiskGrid!!.cell.latitude.toDouble()
                                ))
                                town = address.township + address.address
                // 监测因子的高风险叠加网格列表(每种因子取均值最高的网格)(2025.10.17 取消此逻辑)
//                highRiskGridList.addAll(factorTypes.map { f->
//                    HighRiskGridByFactor().apply {
//                        factorType = f
//                        highRiskGrid = gridFusionList.maxByOrNull { gf->gf.data.getByFactorType(f) ?: 0f }
//                        if (highRiskGrid != null) {
//                            factorValue = highRiskGrid!!.data.getByFactorType(f)
//                            if (highRiskGrid!!.cell.longitude != null && highRiskGrid!!.cell.latitude != null) {
//                                Thread.sleep(100)
//                                val address = AMapService.reGeo(MapUtil.wgs84ToGcj02(
//                                    highRiskGrid!!.cell.longitude.toDouble()
//                                            to highRiskGrid!!.cell.latitude.toDouble()
//                                ))
//                                town = address.township + address.address
//                            }
//                            val polygon = listOf(
//                                highRiskGrid!!.cell.point1Lon.toDouble() to highRiskGrid!!.cell.point1Lat.toDouble(),
//                                highRiskGrid!!.cell.point2Lon.toDouble() to highRiskGrid!!.cell.point2Lat.toDouble(),
//                                highRiskGrid!!.cell.point3Lon.toDouble() to highRiskGrid!!.cell.point3Lat.toDouble(),
//                                highRiskGrid!!.cell.point4Lon.toDouble() to highRiskGrid!!.cell.point4Lat.toDouble(),
//                            )
//                            bounds = MapUtil.calFourBoundaries(polygon)
//                            highRiskScenes = sceneInfoRep.findByPolygon(polygon)
//                        }
//                    }
//                })
                // 监测因子的高风险叠加网格列表(每种因子取均值最高的3个网格)(2025.10.17 新增此逻辑)
                factorTypes.forEach { f->
                    gridFusionList.sortByDescending { gf->gf.data.getByFactorType(f) ?: 0f }
                    val takeList = mutableListOf<HighRiskGridByFactor>()
                    val takeList2 = mutableListOf<HighRiskGridByFactor>()
                    for (i in gridFusionList.indices) {
                        val gf = gridFusionList[i]
                        var highRiskGridByFactor: HighRiskGridByFactor? = null
                        if (takeList2.size < HIGH_RISK_GRID_NUM) {
                            highRiskGridByFactor = HighRiskGridByFactor().apply {
                                factorType = f
                                highRiskGrid = gf
                                factorValue = gf.data.getByFactorType(f)
                                if (gf.cell.longitude != null && gf.cell.latitude != null) {
                                    Thread.sleep(500)
                                    val address = AMapService.reGeo(MapUtil.wgs84ToGcj02(
                                        gf.cell.longitude.toDouble() to gf.cell.latitude.toDouble()
                                    ))
                                    town = if (address.address.contains(address.streetNumber)) {
                                        address.address
                                    } else {
                                        address.address + "(" + address.street + address.streetNumber + ")"
                                    }
                                }
                                val polygon = listOf(
                                    gf.cell.point1Lon.toDouble() to gf.cell.point1Lat.toDouble(),
                                    gf.cell.point2Lon.toDouble() to gf.cell.point2Lat.toDouble(),
                                    gf.cell.point3Lon.toDouble() to gf.cell.point3Lat.toDouble(),
                                    gf.cell.point4Lon.toDouble() to gf.cell.point4Lat.toDouble(),
                                )
                                bounds = MapUtil.calFourBoundaries(polygon)
                                highRiskScenes =
                                    sceneInfoRep.findByPolygon(polygon, listOf(SceneType.TYPE19, SceneType.TYPE20, SceneType.TYPE21))
                            }
                            val polygon = listOf(
                                highRiskGrid!!.cell.point1Lon.toDouble() to highRiskGrid!!.cell.point1Lat.toDouble(),
                                highRiskGrid!!.cell.point2Lon.toDouble() to highRiskGrid!!.cell.point2Lat.toDouble(),
                                highRiskGrid!!.cell.point3Lon.toDouble() to highRiskGrid!!.cell.point3Lat.toDouble(),
                                highRiskGrid!!.cell.point4Lon.toDouble() to highRiskGrid!!.cell.point4Lat.toDouble(),
                            )
                            bounds = MapUtil.calFourBoundaries(polygon)
                            highRiskScenes = sceneInfoRep.findByPolygon(polygon)
                            takeList2.add(highRiskGridByFactor)
                        }
                        //
                        if (takeList.size >= HIGH_RISK_GRID_NUM) break
                        // fixme 2025.10.20 临时添加筛选在静安区内部的网格
                        val check = if (it.second[0].districtCode == "310106") {
                            MapUtil.isPointInPolygon(
                                    Pair(gf.cell.longitude.toDouble(), gf.cell.latitude.toDouble()),
                                    polyLineJingAn
                                )
                        } else {
                            true
                        }
                        if (check) {
                            takeList.add(highRiskGridByFactor ?: HighRiskGridByFactor().apply {
                                factorType = f
                                highRiskGrid = gf
                                factorValue = gf.data.getByFactorType(f)
                                if (gf.cell.longitude != null && gf.cell.latitude != null) {
                                    Thread.sleep(100)
                                    val address = AMapService.reGeo(MapUtil.wgs84ToGcj02(
                                        gf.cell.longitude.toDouble() to gf.cell.latitude.toDouble()
                                    ))
                                    town = if (address.address.contains(address.streetNumber)) {
                                        address.address
                                    } else {
                                        address.address + address.street + address.streetNumber
                                    }
                                }
                                val polygon = listOf(
                                    gf.cell.point1Lon.toDouble() to gf.cell.point1Lat.toDouble(),
                                    gf.cell.point2Lon.toDouble() to gf.cell.point2Lat.toDouble(),
                                    gf.cell.point3Lon.toDouble() to gf.cell.point3Lat.toDouble(),
                                    gf.cell.point4Lon.toDouble() to gf.cell.point4Lat.toDouble(),
                                )
                                bounds = MapUtil.calFourBoundaries(polygon)
                                highRiskScenes =
                                    sceneInfoRep.findByPolygon(polygon, listOf(SceneType.TYPE19, SceneType.TYPE20, SceneType.TYPE21))
                            })
                        }
                    }
                })
                    highRiskGridMap[f] = takeList
                    highRiskGridMap2[f] = takeList2
//                    highRiskGridMap[f] = gridFusionList.take(HIGH_RISK_GRID_NUM).map { gf->
//                        HighRiskGridByFactor().apply {
//                            factorType = f
//                            highRiskGrid = gf
//                            factorValue = gf.data.getByFactorType(f)
//                            if (gf.cell.longitude != null && gf.cell.latitude != null) {
//                                Thread.sleep(100)
//                                val address = AMapService.reGeo(MapUtil.wgs84ToGcj02(
//                                    gf.cell.longitude.toDouble() to gf.cell.latitude.toDouble()
//                                ))
//                                town = address.address + address.street + address.streetNumber
//                            }
//                            val polygon = listOf(
//                                gf.cell.point1Lon.toDouble() to gf.cell.point1Lat.toDouble(),
//                                gf.cell.point2Lon.toDouble() to gf.cell.point2Lat.toDouble(),
//                                gf.cell.point3Lon.toDouble() to gf.cell.point3Lat.toDouble(),
//                                gf.cell.point4Lon.toDouble() to gf.cell.point4Lat.toDouble(),
//                            )
//                            bounds = MapUtil.calFourBoundaries(polygon)
//                            highRiskScenes =
//                                sceneInfoRep.findByPolygon(polygon, listOf(SceneType.TYPE19, SceneType.TYPE20, SceneType.TYPE21))
//                        }
//                    }
                }
            }
        }
    }