riku
2021-06-21 c2a5872d4ab060e0e19a14be271a4b50d5e6059e
1. 新增走航检测污染溯源模型逻辑
已修改3个文件
已添加6个文件
143 ■■■■■ 文件已修改
src/main/kotlin/com/flightfeather/uav/UAVApplication.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/model/BaseSection.kt 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/model/BaseWeight.kt 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/model/epw/EPWModel.kt 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/model/epw/WindDirWeight.kt 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/model/epw/WindDisWeight.kt 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/model/package-info.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/UAVApplication.kt
@@ -18,12 +18,10 @@
    @Autowired
    lateinit var electricProcessor: ElectricProcessor
    private val socketServer = UnderwaySocketServer()
    @Bean
    fun runner() = ApplicationRunner{
        socketServer.startUnderwayServer(9030, underwayProcessor)
        socketServer.startElectricServer(9009, electricProcessor)
        UnderwaySocketServer().startUnderwayServer(9030, underwayProcessor)
        UnderwaySocketServer().startElectricServer(9009, electricProcessor)
    }
}
src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt
@@ -11,6 +11,9 @@
import java.text.SimpleDateFormat
import java.util.*
/**
 * æ— äººèˆ¹é‡‡é›†æ•°æ®æ ¼å¼è½¬æ¢
 */
class FileExchange {
    companion object {
src/main/kotlin/com/flightfeather/uav/model/BaseSection.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.flightfeather.uav.model
/**
 * ç»Ÿè®¡åˆ†æ®µæˆªé¢
 * åŒä¸€ç±»åž‹çš„监测因子按照某一属性进行分段综合统计,输出统计结果,
 * å¸¸è§çš„如按照时间进行分段统计
 */
abstract class BaseSection {
}
src/main/kotlin/com/flightfeather/uav/model/BaseWeight.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.flightfeather.uav.model
/**
 * æƒé‡
 * æŸç§å½±å“å› ç´ åœ¨ä¸åŒæƒ…况下对某种监测数据产生的权重影响
 */
abstract class BaseWeight {
//    åŒºé—´é˜ˆå€¼
    abstract val sectionValues: List<Double>
//    åŒºé—´å¯¹åº”权重
    abstract val weights: List<Double>
    /**
     * æƒé‡è®¡ç®—
     * @param value å½±å“å› ç´ çš„值
     */
    fun weightCal(value: Double): Double {
        for (i in sectionValues.indices) {
            if (value < sectionValues[i]) {
                return weights[i]
            }
        }
        return weights.last()
    }
}
src/main/kotlin/com/flightfeather/uav/model/epw/EPWModel.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.flightfeather.uav.model.epw
import com.flightfeather.uav.domain.entity.Company
import com.flightfeather.uav.lightshare.bean.DataVo
import java.math.BigDecimal
/**
 * å·¥ä¸šä¼ä¸šæ±¡æŸ“权重分析模型
 * æ ¹æ®èµ°èˆªç›‘测数据,结合风速、风向、监测点与企业的相对位置等因素,计算企业对监测区域的影响程度
 * @author riku
 */
class EPWModel {
//    private val windDirWeight = WindDirWeight()
//    private val windDisWeight = WindDisWeight()
    private lateinit var datas: List<DataVo>
    private lateinit var sources: List<Company>
    fun execute() {
        datas.forEach d@{d ->
            if (d.lng == null || d.lng == 0.0 || d.lat == null || d.lat == 0.0) {
                return@d
            }
            sources.forEach s@ { s ->
                // ç»çº¬åº¦æœ‰æ•ˆæ€§åˆ¤æ–­
                if (s.ciLongitude == null || s.ciLongitude == BigDecimal(0) || s.ciLatitude == null || s.ciLatitude == BigDecimal(0)) {
                    return@s
                }
                val p1 = Pair(d.lng!!, d.lat!!)
                val p2 = Pair(s.ciLongitude.toDouble(), s.ciLatitude.toDouble())
//                windDirWeight.getWeight(p1, p2)
            }
        }
    }
}
src/main/kotlin/com/flightfeather/uav/model/epw/WindDirWeight.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.flightfeather.uav.model.epw
import com.flightfeather.uav.model.BaseWeight
import kotlin.math.PI
import kotlin.math.abs
import kotlin.math.atan2
import kotlin.math.sqrt
/**
 *
 */
class WindDirWeight : BaseWeight() {
    override val sectionValues: List<Double> = listOf(22.5, 67.5, 112.5, 157.5, 180.0)
    override val weights: List<Double> = listOf(1.0, 0.8, 0.5, 0.2, 0.1)
    fun getWeight(deg: Double):Double {
        return weightCal(deg)
    }
    fun getWeight(p1: Pair<Double, Double>, p2: Pair<Double, Double>, wd: Int): Double {
        val dx = p2.first - p1.first
        val dy = p2.second - p1.second
        var x1 = atan2(dy, dx) * 180 / PI
        if (x1 < 0) x1 += 360
        var x2 = 270 - wd
        if (x2 < 0) x2 += 360
        x1 = abs(x2 - x1)
        if (x1>180) x1 = 360 - x1
        return weightCal(x1)
    }
}
src/main/kotlin/com/flightfeather/uav/model/epw/WindDisWeight.kt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.flightfeather.uav.model.epw
import com.flightfeather.uav.model.BaseWeight
/**
 * é£Žé€Ÿè·ç¦»æƒé‡
 * ç›‘测点与污染源之间的物理距离与当前风速得出的权重
 */
class WindDisWeight : BaseWeight() {
    override val sectionValues: List<Double> = listOf(2.0, 5.0, 8.0, 12.0, 20.0, 30.0)
    override val weights: List<Double> = listOf(1.0, 0.8, 0.6, 0.5, 0.3, 0.0)
    fun getWeight(dis: Double, ws: Double): Double {
        val value = dis / ws / 60
        return weightCal(value)
    }
}
src/main/kotlin/com/flightfeather/uav/model/package-info.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
package com.flightfeather.uav.model;
/*
* ç®—法模型相关
* åŒ…括污染溯源、污染重点区域分析等功能
* */
src/main/kotlin/com/flightfeather/uav/socket/UAVByteDataDecoder.kt
@@ -16,8 +16,8 @@
        const val BASE_LENGTH = DataPackageDecoder.HEAD_BYTES + DataPackageDecoder.COMMAND_UNIT_BYTES +
                DataPackageDecoder.DEVICE_CODE_BYTES + DataPackageDecoder.DATA_LENGTH + DataPackageDecoder.BCC_BYTES
        const val HEAD1 = 0x01.toByte()
        const val COMMAND_1 = 0x01.toByte()
        const val COMMAND_2 = 0x01.toByte()
        const val COMMAND_1 = 0x04.toByte()
        const val COMMAND_2 = 0x05.toByte()
        const val HEAD_LENGTH = DataPackageDecoder.HEAD_BYTES + DataPackageDecoder.COMMAND_UNIT_BYTES +
                DataPackageDecoder.DEVICE_CODE_BYTES
    }
@@ -46,7 +46,7 @@
                    val b = ByteArray(HEAD_LENGTH)
                    it.readBytes(b)
                    if (b[0] == HEAD1 &&
                        (b[1] == COMMAND_1 || b[2] == COMMAND_2)) {
                        (b[1] == COMMAND_1 || b[1] == COMMAND_2)) {
                        b.forEach {b ->
                            dataList.add(b)
                        }