feiyu02
2025-12-25 d649f734c44541641158aec2d6b10d630f5a0827
src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedArea.kt
@@ -3,8 +3,6 @@
import com.flightfeather.uav.biz.sourcetrace.config.RTExcWindLevelConfig
import com.flightfeather.uav.common.net.AMapService
import com.flightfeather.uav.common.utils.MapUtil
import com.flightfeather.uav.domain.entity.BaseRealTimeData
import com.flightfeather.uav.domain.entity.avg
import kotlin.math.PI
/**
@@ -20,15 +18,14 @@
     */
    constructor(
        historyData: List<BaseRealTimeData>,
        exceptionData: List<BaseRealTimeData>,
        pollutedData: PollutedData,
        config: RTExcWindLevelConfig,
        windLevelCondition: RTExcWindLevelConfig.WindLevelCondition?,
    ) : this() {
    ) : this(){
        distanceType = windLevelCondition?.distanceType
        distanceRange = distanceType?.disRange
        distanceDes = distanceType?.des
        windLevelCondition?.let { sourceTrace(historyData, exceptionData, config, it) }
        windLevelCondition?.let { sourceTrace(pollutedData, config, it) }
    }
    // 所属街镇
@@ -41,8 +38,12 @@
    var streetNumber:String? = null
    // 处于该门牌号的方向
    var direction:String? = null
    // 处于该门牌号的方向距离
    var distance: String? = null
    // 所处最近交叉路口的方向和距离
    var roadinter:String? = null
    // 所处最近交叉路口的距离
    var distance2: String? = null
    // 污染范围扇形区域(经纬度多边形)
    var polygon: List<Pair<Double, Double>>? = null
@@ -60,19 +61,13 @@
     * 反向溯源
     */
    private fun sourceTrace(
        historyData: List<BaseRealTimeData>,
        exceptionData: List<BaseRealTimeData>,
        pollutedData: PollutedData,
        config: RTExcWindLevelConfig,
        windLevelCondition: RTExcWindLevelConfig.WindLevelCondition,
    ) {
        val avgData = if (exceptionData.size == 1) {
            exceptionData.first()
        } else {
            exceptionData.avg()
        }
        val avgData = pollutedData.exceptionAvgData()
        val pair = avgData.longitude!!.toDouble() to avgData.latitude!!.toDouble()
        polygon = calSector(
            avgData.windDirection?.toDouble() ?: .0,
            pair,
@@ -83,7 +78,7 @@
            MapUtil.wgs84ToGcj02(it)
        }
        closePolygon = closeSourceTrace(historyData, pair).map {
        closePolygon = closeSourceTrace(pair).map {
            // 将坐标转换为gcj02(火星坐标系),因为污染源场景信息都为此坐标系
            MapUtil.wgs84ToGcj02(it)
        }
@@ -96,7 +91,9 @@
                this.street = address.street
                this.streetNumber = address.streetNumber
                this.direction = address.direction
                this.distance = address.distance
                this.roadinter = address.roadinter
                this.distance2 = address.distance2
                Thread.sleep(100)
            } catch (e: Exception) {
                e.printStackTrace()
@@ -155,10 +152,7 @@
        return result
    }
    private fun closeSourceTrace(
        historyData: List<BaseRealTimeData>,
        center: Pair<Double, Double>,
    ): List<Pair<Double, Double>> {
    private fun closeSourceTrace(center: Pair<Double, Double>): List<Pair<Double, Double>> {
        val result = mutableListOf<Pair<Double, Double>>()
        var startDeg = 0
        while (startDeg <= 360) {