| | |
| | | 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 |
| | | |
| | | /** |
| | |
| | | * @author feiyu02 |
| | | */ |
| | | class MissionGridFusion(private val sceneInfoRep: SceneInfoRep) { |
| | | |
| | | companion object { |
| | | // 需统计高风险网格的数量 |
| | | const val HIGH_RISK_GRID_NUM = 3 |
| | | } |
| | | |
| | | /** |
| | | * 按AQI等级叠加网格 |
| | |
| | | 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() |
| | | } |
| | | |
| | | /** |
| | |
| | | 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)) |
| | | // } |
| | | // } |
| | | } |
| | | } |
| | | } |
| | | } |