| | |
| | | package com.flightfeather.uav.domain.entity |
| | | |
| | | import com.flightfeather.uav.biz.dataprocess.AvgPair |
| | | import com.flightfeather.uav.common.utils.DateUtil |
| | | import com.flightfeather.uav.common.utils.GsonUtils |
| | | import com.flightfeather.uav.lightshare.bean.DataVo |
| | | import com.flightfeather.uav.socket.bean.AirData |
| | | import com.flightfeather.uav.socket.eunm.FactorType |
| | | import com.flightfeather.uav.socket.eunm.FactorType.* |
| | | import kotlin.math.atan |
| | | import kotlin.math.cos |
| | | import kotlin.math.round |
| | | import kotlin.math.sin |
| | | |
| | | /** |
| | | * 数据库表实体扩展方法 |
| | |
| | | list.add("纬度") |
| | | val values = GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java) |
| | | values.forEach { |
| | | if (FactorType.outputFactor(it.factorName)) { |
| | | if (FactorType.isOutputFactor(it.factorName)) { |
| | | val name = it.factorName ?: "" |
| | | list.add(name) |
| | | // list.add("$name(物理量)") |
| | |
| | | } |
| | | val values = GsonUtils.parserJsonToArrayBeans(factors, AirData::class.java) |
| | | values.forEach { |
| | | if (FactorType.outputFactor(it.factorName)) { |
| | | if (FactorType.isOutputFactor(it.factorName)) { |
| | | row.add(it.factorData ?: -1.0) |
| | | // row.add(it.physicalQuantity ?: -1.0) |
| | | } |
| | |
| | | factorData = mvPowerC |
| | | }, |
| | | ) |
| | | } |
| | | } |
| | | |
| | | |
| | | /** GridDataDetail-start ********************************************************************/ |
| | | /** |
| | | * 根据监测因子类型赋值 |
| | | */ |
| | | fun GridDataDetail.setFactorValue(type: FactorType?, value: Float) { |
| | | when (type) { |
| | | NO -> no = value |
| | | NO2 -> no2 = value |
| | | CO -> co = value |
| | | H2S -> h2s = value |
| | | SO2 -> so2 = value |
| | | O3 -> o3 = value |
| | | PM25 -> pm25 = value |
| | | PM10 -> pm10 = value |
| | | TEMPERATURE -> temperature = value |
| | | HUMIDITY -> humidity = value |
| | | VOC -> voc = value |
| | | NOI -> noi = value |
| | | WIND_SPEED -> windSpeed = value |
| | | WIND_DIRECTION -> windDirection = value |
| | | LNG -> TODO("no such factor") |
| | | LAT -> TODO("no such factor") |
| | | VELOCITY -> TODO("no such factor") |
| | | TIME -> TODO("no such factor") |
| | | HEIGHT -> TODO("no such factor") |
| | | else -> TODO("no such factor") |
| | | } |
| | | } |
| | | |
| | | fun GridDataDetail.getByFactorType(type: FactorType?): Float? { |
| | | return when (type) { |
| | | NO2 -> no2 |
| | | CO -> co |
| | | H2S -> h2s |
| | | SO2 -> so2 |
| | | O3 -> o3 |
| | | PM25 -> pm25 |
| | | PM10 -> pm10 |
| | | TEMPERATURE -> temperature |
| | | HUMIDITY -> humidity |
| | | VOC -> voc |
| | | NOI -> noi |
| | | WIND_SPEED -> windSpeed |
| | | WIND_DIRECTION -> windDirection |
| | | NO -> no |
| | | else -> null |
| | | } |
| | | } |
| | | |
| | | fun List<GridDataDetail>.avg(): GridDataDetail { |
| | | //风向采用单位矢量法求取均值 |
| | | var u = .0//东西方位分量总和 |
| | | var v = .0//南北方位分量总和 |
| | | var c = 0//风向数据计数 |
| | | |
| | | //除风向外的其他因子采用算术平均法求取均值 |
| | | val tmpList = mutableListOf<AvgPair>() |
| | | repeat(18) { |
| | | tmpList.add(AvgPair(0f, 0)) |
| | | } |
| | | |
| | | forEach { f -> |
| | | //风向 |
| | | f.windDirection?.let { w -> |
| | | val r = Math.toRadians(w.toDouble()) |
| | | u += sin(r) |
| | | v += cos(r) |
| | | c++ |
| | | } |
| | | //其余因子 |
| | | tmpList[0].apply { |
| | | f.no2?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[1].apply { |
| | | f.co?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[2].apply { |
| | | f.h2s?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[3].apply { |
| | | f.so2?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[4].apply { |
| | | f.o3?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[5].apply { |
| | | f.pm25?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[6].apply { |
| | | f.pm10?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[7].apply { |
| | | f.temperature?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[8].apply { |
| | | f.humidity?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[9].apply { |
| | | f.voc?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[10].apply { |
| | | f.noi?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[11].apply { |
| | | f.windSpeed?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | tmpList[12].apply { |
| | | f.no?.let { |
| | | t += it |
| | | this.c++ |
| | | } |
| | | } |
| | | } |
| | | |
| | | return GridDataDetail().apply { |
| | | no2 = tmpList[0].avg() |
| | | co = tmpList[1].avg() |
| | | h2s = tmpList[2].avg() |
| | | so2 = tmpList[3].avg() |
| | | o3 = tmpList[4].avg() |
| | | pm25 = tmpList[5].avg() |
| | | pm10 = tmpList[6].avg() |
| | | temperature = tmpList[7].avg() |
| | | humidity = tmpList[8].avg() |
| | | voc = tmpList[9].avg() |
| | | noi = tmpList[10].avg() |
| | | windSpeed = tmpList[11].avg() |
| | | no = tmpList[12].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: 真实角度处于第一象限,修正值为+0° |
| | | * avgU>0;avgV<0: 真实角度处于第二象限,修正值为+180° |
| | | * avgU<0;avgV<0: 真实角度处于第三象限,修正值为+180° |
| | | * avgU<0;avgV>0: 真实角度处于第四象限,修正值为+360° |
| | | */ |
| | | a += if (avgV > 0) { |
| | | if (avgU > 0) 0 else 360 |
| | | } else { |
| | | 180 |
| | | } |
| | | windDirection = round(a.toFloat()) |
| | | } |
| | | } |
| | | } |
| | | /** GridDataDetail-over ********************************************************************/ |