From 9a9a27f185bc0cf9dc0001cfc6839e6d13dbccd9 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期四, 08 五月 2025 17:38:30 +0800 Subject: [PATCH] 1. 添加了动态污染溯源相关功能逻辑 --- src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 213 insertions(+), 0 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt index a94c014..d4d315c 100644 --- a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt +++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt @@ -1,13 +1,20 @@ package com.flightfeather.uav.domain.entity +import com.flightfeather.uav.biz.dataprocess.AvgPair import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.lightshare.bean.DataVo import com.flightfeather.uav.socket.bean.AirData import com.flightfeather.uav.socket.eunm.FactorType import java.math.BigDecimal +import java.time.LocalDateTime +import java.time.ZoneId import java.util.* import javax.persistence.Column import javax.persistence.Id +import kotlin.math.atan +import kotlin.math.cos +import kotlin.math.round +import kotlin.math.sin /** * 瀹炴椂鐩戞祴鏁版嵁鍩虹被 @@ -62,6 +69,9 @@ @Column(name = "NOI") var noi: Float? = null + @Column(name = "NO") + var no: Float? = null + var velocity: Float? = null @Column(name = "wind_speed") @@ -101,6 +111,209 @@ add(AirData().apply { setData(FactorType.WIND_SPEED, windSpeed) }) add(AirData().apply { setData(FactorType.WIND_DIRECTION, windDirection) }) add(AirData().apply { setData(FactorType.HEIGHT, height) }) + add(AirData().apply { setData(FactorType.NO, no) }) + } + } + + fun getByFactorType(type: FactorType?): Float? { + return when (type) { + FactorType.NO2 -> no2 + FactorType.CO -> co + FactorType.H2S -> h2s + FactorType.SO2 -> so2 + FactorType.O3 -> o3 + FactorType.PM25 -> pm25 + FactorType.PM10 -> pm10 + FactorType.TEMPERATURE -> temperature + FactorType.HUMIDITY -> humidity + FactorType.VOC -> voc + FactorType.NOI -> noi + FactorType.LNG -> longitude?.toFloat() + FactorType.LAT -> latitude?.toFloat() + FactorType.VELOCITY -> velocity +// FactorType.TIME -> dataTime?.time?.toFloat() + FactorType.WIND_SPEED -> windSpeed + FactorType.WIND_DIRECTION -> windDirection + FactorType.HEIGHT -> height + FactorType.NO -> no + else -> null + } + } + +} + +fun List<BaseRealTimeData>.avg(): BaseRealTimeData { + //椋庡悜閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊� + var u = .0//涓滆タ鏂逛綅鍒嗛噺鎬诲拰 + var v = .0//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰 + var c = 0//椋庡悜鏁版嵁璁℃暟 + + //闄ら鍚戝鐨勫叾浠栧洜瀛愰噰鐢ㄧ畻鏈钩鍧囨硶姹傚彇鍧囧�� + val tmpList = mutableListOf<AvgPair>() + repeat(18) { + tmpList.add(AvgPair(0f, 0)) + } + + forEach { + //椋庡悜 + it.windDirection?.let {w -> + val r = Math.toRadians(w.toDouble()) + u += sin(r) + v += cos(r) + c++ + } + //鍏朵綑鍥犲瓙 + tmpList[0].apply { + it.latitude?.let { + t += it.toFloat() + this.c++ + } + } + tmpList[1].apply { + it.longitude?.let { + t += it.toFloat() + this.c++ + } + } + tmpList[2].apply { + it.altitude?.let { + t += it + this.c++ + } + } + tmpList[3].apply { + it.no2?.let { + t += it + this.c++ + } + } + tmpList[4].apply { + it.co?.let { + t += it + this.c++ + } + } + tmpList[5].apply { + it.h2s?.let { + t += it + this.c++ + } + } + tmpList[6].apply { + it.so2?.let { + t += it + this.c++ + } + } + tmpList[7].apply { + it.o3?.let { + t += it + this.c++ + } + } + tmpList[8].apply { + it.pm25?.let { + t += it + this.c++ + } + } + tmpList[9].apply { + it.pm10?.let { + t += it + this.c++ + } + } + tmpList[10].apply { + it.temperature?.let { + t += it + this.c++ + } + } + tmpList[11].apply { + it.humidity?.let { + t += it + this.c++ + } + } + tmpList[12].apply { + it.voc?.let { + t += it + this.c++ + } + } + tmpList[13].apply { + it.noi?.let { + t += it + this.c++ + } + } + tmpList[14].apply { + it.velocity?.let { + t += it + this.c++ + } + } + tmpList[15].apply { + it.windSpeed?.let { + t += it + this.c++ + } + } + tmpList[16].apply { + it.height?.let { + t += it + this.c++ + } + } + tmpList[17].apply { + it.no?.let { + t += it + this.c++ + } + } + } + + return RealTimeDataGridMin().apply { + val time = LocalDateTime.ofInstant(get(0).dataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0) + deviceCode = get(0).deviceCode + dataTime = Date.from(time.atZone(ZoneId.systemDefault()).toInstant()) + createTime = dataTime + latitude = tmpList[0].avg().toBigDecimal() + longitude = tmpList[1].avg().toBigDecimal() + altitude = tmpList[2].avg() + no2 = tmpList[3].avg() + co = tmpList[4].avg() + h2s = tmpList[5].avg() + so2 = tmpList[6].avg() + o3 = tmpList[7].avg() + pm25 = tmpList[8].avg() + pm10 = tmpList[9].avg() + temperature = tmpList[10].avg() + humidity = tmpList[11].avg() + voc = tmpList[12].avg() + noi = tmpList[13].avg() + velocity = tmpList[14].avg() + windSpeed = tmpList[15].avg() + height = tmpList[16].avg() + no = tmpList[17].avg() + + if (c != 0) { + val avgU = u / c + val avgV = v / c + var a = atan(avgU / avgV) + a = Math.toDegrees(a) + /** + * avgU>0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗竴璞¢檺锛屼慨姝e�间负+0掳 + * avgU>0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗簩璞¢檺锛屼慨姝e�间负+180掳 + * avgU<0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗笁璞¢檺锛屼慨姝e�间负+180掳 + * avgU<0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗洓璞¢檺锛屼慨姝e�间负+360掳 + */ + a += if (avgV > 0) { + if (avgU > 0) 0 else 360 + } else { + 180 + } + windDirection = round(a.toFloat()) } } } \ No newline at end of file -- Gitblit v1.9.3