From db7243622e8b5f4cc23de5594b2d973562f0b2a3 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期三, 10 十一月 2021 09:54:36 +0800 Subject: [PATCH] 1. 添加网格化数据分钟均值计算逻辑 --- src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt | 11 ++ src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt | 155 +++++++++++++++++++++++++++++++ src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java | 1 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt | 22 +++- src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt | 53 ++++++++++ 5 files changed, 237 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt b/src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt new file mode 100644 index 0000000..316fe93 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt @@ -0,0 +1,53 @@ +package com.flightfeather.uav.dataprocess + +/** + * 鍧囧�艰绠楀伐鍏凤紝灏嗕竴缁勮繛缁暟鎹浆鎹负鑷畾涔夊懆鏈熺殑鍧囧�兼暟鎹� + * 瑕佹眰浼犲叆鐨勬暟鎹寜鐓ф椂闂撮『搴忔帓鍒楋紝 + * @param onTag 瀹氫箟鏁版嵁鏍囩鑾峰彇鍥炶皟鍑芥暟锛屽綋褰撳墠鏁版嵁鏍囩涓庝笂涓暟鎹爣绛句笉鍚屾椂锛屽嵆璁や负涓婁竴缁勬暟鎹负鍚屼竴缁勬暟鎹紝闇�姹傚嚭鍧囧�� + * @param onAvg 瀹氫箟鍧囧�艰绠楁柟娉� + */ +class AverageUtil<T : Any>(var onTag: (d: T) -> String, var onAvg: (list: List<T>) -> T) { + + // 缂撳瓨鏈�鏂扮殑tag + private var lastTag: String? = null + // 涓存椂鏁版嵁缂撳瓨 + private val dataSet = mutableListOf<T>() + // 杞崲缁撴灉 + private val result = mutableListOf<T>() + + /** + * 灏嗘暟鎹泦杞崲涓哄潎鍊兼暟鎹� + * @param list 鍘熷鏁版嵁 + * @return 鍧囧�兼暟鎹� + */ + fun avg(list: List<T>): List<T> { + // 鍒濆鍖栨墍鏈夊彉閲� + clear() + // 璁$畻鍧囧�� + list.forEach { + val tag = onTag(it) + // 绗竴鏉℃暟鎹拰tag鐩稿悓鏃讹紝灏嗘暟鎹斁鍏ヤ复鏃剁紦瀛樺垪琛� + if (lastTag == null || tag == lastTag) { + dataSet.add(it) + } + // 褰搕ag涓嶅悓鏃讹紝璁$畻涔嬪墠鏁版嵁鐨勫潎鍊硷紝鍚屾椂鎯呭喌涓存椂鏁版嵁缂撳瓨锛屾坊鍔犲綋鍓嶇殑鏂版暟鎹� + else { + result.add(onAvg(dataSet)) + dataSet.clear() + dataSet.add(it) + } + lastTag = tag + } + // 鍒楄〃寰幆缁撴潫鍚庯紝鑻ョ紦瀛樺垪琛ㄤ腑浠嶆湁鏁版嵁锛屽垯璁$畻鏈�鍚庝竴涓潎鍊� + if (dataSet.isNotEmpty()) { + result.add(onAvg(dataSet)) + } + return result + } + + private fun clear() { + lastTag = null + dataSet.clear() + result.clear() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt b/src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt new file mode 100644 index 0000000..02daa91 --- /dev/null +++ b/src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt @@ -0,0 +1,11 @@ +package com.flightfeather.uav.dataprocess + +data class AvgPair( + var t: Float, var c: Int +){ + fun avg(): Float = if (c == 0) { + 0f + } else { + t / c + } +} \ No newline at end of file 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..cb51649 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,19 @@ package com.flightfeather.uav.domain.entity import com.flightfeather.uav.common.utils.DateUtil +import com.flightfeather.uav.dataprocess.AvgPair 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.time.ZoneOffset import java.util.* import javax.persistence.Column import javax.persistence.Id +import kotlin.math.cos +import kotlin.math.sin /** * 瀹炴椂鐩戞祴鏁版嵁鍩虹被 @@ -103,4 +109,153 @@ add(AirData().apply { setData(FactorType.HEIGHT, height) }) } } +} + +fun List<RealTimeDataGrid>.avg(): RealTimeDataGrid { + //椋庡悜閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊� + var u = 0f//涓滆タ鏂逛綅鍒嗛噺鎬诲拰 + var v = 0f//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰 + var c = 0//椋庡悜鏁版嵁璁℃暟 + + //闄ら鍚戝鐨勫叾浠栧洜瀛愰噰鐢ㄧ畻鏈钩鍧囨硶姹傚彇鍧囧�� + val tmpList = mutableListOf<AvgPair>() + repeat(17) { + tmpList.add(AvgPair(0f, 0)) + } + + forEach { + //椋庡悜 + it.windDirection?.let {w -> + u += sin(w) + v += cos(w) + 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++ + } + } + } + + return RealTimeDataGrid().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 newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java b/src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java index 38cbd30..b6e5dce 100644 --- a/src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java +++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java @@ -6,4 +6,5 @@ @Table(name = "real_time_data_grid") public class RealTimeDataGrid extends BaseRealTimeData { + } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt index 718bc7a..ed3f0f2 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt @@ -4,6 +4,7 @@ import com.flightfeather.uav.common.utils.ExcelUtil import com.flightfeather.uav.common.utils.FileExchange import com.flightfeather.uav.common.utils.GsonUtils +import com.flightfeather.uav.dataprocess.AverageUtil import com.flightfeather.uav.domain.entity.* import com.flightfeather.uav.domain.mapper.RealTimeDataGridMapper import com.flightfeather.uav.domain.mapper.RealTimeDataMapper @@ -276,17 +277,28 @@ var total = -1 var count = 0 + val minFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm") + val averageUtil = AverageUtil<RealTimeDataGrid>({d -> + minFormatter.format(d.dataTime) + },{list -> + list.avg() + }) + while (total == -1 || page <= total) { println("------start------") - val res = getOriginData("0d0000000001", "2021-07-05 19:47:01", "2021-11-05 00:00:00", page, 50000) - res.head?.let { - total = it.totalPage - } + + val p = PageHelper.startPage<RealTimeDataGrid>(page, 50000) + val res = realTimeDataGridMapper.selectByExample(Example(RealTimeDataGrid::class.java).apply { + createCriteria().andBetween("dataTime", "2021-06-01 00:00:00", "2021-11-05 00:00:00") + }) + + total = p.pages + if (page == 1) { println("鎬婚〉鏁帮細$total") } println("褰撳墠椤垫暟锛�$page") - res.data?.forEach { + averageUtil.avg(res).forEach { } -- Gitblit v1.9.3