src/main/kotlin/com/flightfeather/uav/common/utils/FileExchange.kt
@@ -33,6 +33,8 @@ val dataList = mutableListOf<RealTimeData>() val lastData = mutableListOf<Double>() for (i in 1 until sheet.lastRowNum) { val row = sheet.getRow(i) val time = row.getCell(2).numericCellValue.toLong() * 1000 @@ -44,11 +46,27 @@ val datetime = Date(time) //çæµå å val jO = JSONObject.parseObject(value) val tmp = jO.getDoubleValue(TMP) val spC = jO.getDoubleValue(SPCOND) val tur = jO.getDoubleValue(TUR) val dO = jO.getDoubleValue(DO) val ph = jO.getDoubleValue(PH) var tmp = jO.getDoubleValue(TMP) var spC = jO.getDoubleValue(SPCOND) var tur = jO.getDoubleValue(TUR) var dO = jO.getDoubleValue(DO) var ph = jO.getDoubleValue(PH) if (lastData.isEmpty()) { lastData.addAll(listOf(tmp, spC, tur, dO, ph)) } else { if (tmp == .0) tmp = lastData[0] if (spC == .0) spC = lastData[1] if (tur == .0) tur = lastData[2] if (dO == .0) dO = lastData[3] if (ph == .0) ph = lastData[4] } lastData[0] = tmp lastData[1] = spC lastData[2] = tur lastData[3] = dO lastData[4] = ph val factorsList = mutableListOf<AirData>() @@ -83,6 +101,18 @@ factorData = ph physicalQuantity = 0.0 }) add(AirData().apply { factorId = "12" factorName = "LNG" factorData = lng physicalQuantity = 0.0 }) add(AirData().apply { factorId = "13" factorName = "LAT" factorData = lat physicalQuantity = 0.0 }) } val factors = JSONObject.toJSON(factorsList).toString() src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt
@@ -19,11 +19,11 @@ // è¿åç»æ val result = mutableListOf<ElectricDailyInfo>() // æ¯æ¥ç»è®¡ä¿¡æ¯ val dailyInfoMap = mutableMapOf<String, ElectricDailyInfo>() val dailyInfoMap = mutableMapOf<Int, ElectricDailyInfo>() // 1.æ°æ®åå¤ val deviceMap = mutableMapOf<String, CompanyDevice>() val dataMap = mutableMapOf<String, MutableMap<String, MutableList<ElectricMinuteValue>>>() val dataMap = mutableMapOf<String, MutableMap<Int, MutableList<ElectricMinuteValue>>>() deviceList.forEach { // çæµæ°æ® if (!dataMap.containsKey(it.cdDeviceCode)) { @@ -35,7 +35,8 @@ // 2.è½®è¯¢æ°æ®ï¼ç»è®¡æ¯æ¥çå项ç¹å¾ dataList.forEach { // è·åæ¥æ val day = DateUtil.instance.dateToString(it.mvDataTime, DateUtil.DateStyle.YYYY_MM_DD) ?: "" val date = DateUtil.instance.dateToString(it.mvDataTime, DateUtil.DateStyle.YYYYMMDD) ?: "" val day = date.toIntOrNull() ?: 0 // æ¯æ¥å¯¹åºä¸ç»æ°æ® if (dataMap[it.mvStatCode]?.containsKey(day) != true) dataMap[it.mvStatCode]?.put(day, mutableListOf()) val dayList = dataMap[it.mvStatCode]?.get(day)!! @@ -47,7 +48,8 @@ // 2.1 æ ¹æ®æ°æ®åæ¢å½å设å¤ç±»å if (!dailyInfoMap.containsKey(day)) dailyInfoMap[day] = ElectricDailyInfo() val dayResult = dailyInfoMap[day]!! dayResult.day = day dayResult.day = DateUtil.instance.dateToString(it.mvDataTime, DateUtil.DateStyle.YYYY_MM_DD) ?: "" dayResult.dayIndex = day dayResult.changeType(device) // 2.2 æ¯æ¥è·åçé¦ä¸ªæ°æ®ï¼å³ä¸ºå½æ¥è¯¥è®¾å¤å¼å¯æ¶é´ if (dayList.size == 1) dayResult.setStartTime(it.mvDataTime) @@ -58,18 +60,41 @@ // 2.5 ç»è®¡å½æ¥è®¾å¤è¿è¡æ¶æ®µï¼å°æ¶ï¼ val hour = LocalDateTime.ofInstant(it.mvDataTime.toInstant(), ZoneId.systemDefault()).hour dayResult.addRunPeriod(hour) // 2.6 累计ç¨çµé dayResult.addPower(it) // 2.7 设å¤é¦æ¬¡ä»è¿è¡åä¸ºå¾ æºæå ³éç¶ææ¶ï¼è®¤ä¸ºæ¯è®¾å¤çå ³éæ¶é´ dayResult.setEndTime(status, it) } // 2.6 ç»è®¡åå°è®¾å¤æ¯æ¥ç»ææ¶é´ååæç»æ // 2.6 ç»è®¡åå°è®¾å¤åæç»æ dataMap.forEach { (dCode, dayMap) -> dayMap.forEach { (day, list) -> dailyInfoMap[day]?.apply { changeType(deviceMap[dCode]) setEndTime(list.last().mvDataTime) setEndTime2(list.last().mvDataTime) getResult() } } } dailyInfoMap.forEach { (_,v)-> result += v } result.sortBy { it.dayIndex } for (i in result.indices) { if (i > 0) { val last = result[i - 1] val d = result[i] // é对两ç§è®¾å¤ï¼å½æ¨å¤©çè®¾å¤æªå ³éï¼ä¸ä»å¤©çå¼å¯æ¶é´ä¸º0ç¹0åå æ¶ï¼è®¤ä¸ºè®¾å¤è·¨æ¥è¿è¡ if (last.plETimeStr == null && d.plRTimeStr?.substring(11, 16) == "00:00") { d.plRTimeStr = null d.rTimeDiff = null d.sResult = true } if (last.pfETimeStr == null && d.pfRTimeStr?.substring(11, 16) == "00:00") { d.pfRTimeStr = null d.rTimeDiff = null d.sResult = true } } } return result } src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricDailyInfo.kt
@@ -1,11 +1,13 @@ package com.flightfeather.uav.lightshare.bean import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.dataprocess.ElectricDailyAnalysis import com.flightfeather.uav.domain.entity.CompanyDevice import com.flightfeather.uav.domain.entity.ElectricMinuteValue import com.flightfeather.uav.lightshare.eunm.ElectricityStatus import com.flightfeather.uav.lightshare.eunm.ElectricityType import java.util.* import kotlin.math.round /** * ç¨çµéæ¥åæç»æ @@ -13,26 +15,33 @@ * Created by feiyu */ class ElectricDailyInfo { var day: String = "" var day = "" var dayIndex = 0 /***********产线设å¤ProductionLine, pl************/ private var plDCode: String? = null // 设å¤ç¼å· var plDCode: String? = null // 设å¤ç¼å· private var plSTime: Date? = null // å¼å¯æ¶é´ private var plRTime: Date? = null // æ£å¼è¿è¡æ¶é´ private var plETime: Date? = null // å ³éæ¶é´ private var plRunTime: Int = 0 // è¿è¡æ¶é¿ï¼åéï¼ï¼ç¶æä¸ºè¿è¡ãé«è´è·çæ¶é¿ï¼ var plRunTime: Int = 0 // è¿è¡æ¶é¿ï¼åéï¼ï¼ç¶æä¸ºè¿è¡ãé«è´è·çæ¶é¿ï¼ private var plRunPeriod = mutableListOf<Int>()// è¿è¡æ¶æ®µï¼å°æ¶ï¼ var plPower = .0 // ç¨çµéï¼åç¦æ¶ï¼ /***********åå设å¤Purify, pf********************/ private var pfDCode: String? = null var pfDCode: String? = null private var pfSTime: Date? = null private var pfRTime: Date? = null private var pfETime: Date? = null private var pfRunTime: Int = 0 var pfRunTime: Int = 0 private var pfRunPeriod = mutableListOf<Int>() var pfPower = .0 var rTimeDiff:Int = 0 //æ£å¼è¿è¡æ¶é´å·® var plRTimeStr: String? = null var plETimeStr: String? = null var pfRTimeStr: String? = null var pfETimeStr: String? = null var rTimeDiff:Int? = 0 //æ£å¼è¿è¡æ¶é´å·® var sResult:Boolean = false //设å¤å¼å¯æ¯å¦åè§ var eTimeDiff: Int = 0 //å ³éæ¶é´å·® var eTimeDiff: Int? = 0 //å ³éæ¶é´å·® var eResult: Boolean = false //设å¤å ³éæ¯å¦åè§ var runningTimeDiff = 0 //è¿è¡æ¶é¿å·® var rResult:Boolean = false //è¿è¡è¿ç¨æ¯å¦åè§ @@ -63,10 +72,62 @@ } } fun setEndTime(date: Date) { private var lastPlStatus = -2 // ä¸ä¸ªæ¶é´ç¹ç产线设å¤ç¶æ private var plTag = false // trueï¼å½æ¥æåä¸åéçæ°æ®ä¾æ§æ¯è¿è¡ç¶æï¼æªå ³éäº§çº¿è®¾å¤ private var lastPfStatus = -2 // ä¸ä¸ªæ¶é´ç¹çåå设å¤ç¶æ private var pfTag = false fun setEndTime(s: Triple<String, String, Double>, e:ElectricMinuteValue?) { val hourMinute = DateUtil.instance.dateToString(e?.mvDataTime, DateUtil.DateStyle.HH_MM) when (deviceType) { ElectricityType.ProductionLine -> plETime = date ElectricityType.Purify -> pfETime = date ElectricityType.ProductionLine -> { if (lastPlStatus == -1) { return } else if (lastPlStatus <= ElectricityStatus.A.value) { lastPlStatus = s.first.toInt() } else if (lastPlStatus >= ElectricityStatus.B.value) { if (s.first.toInt() <= ElectricityStatus.A.value) { plETime = e?.mvDataTime lastPlStatus = -1 } else { if (hourMinute == "23:59") plTag = true lastPlStatus = s.first.toInt() } } } ElectricityType.Purify -> { if (lastPfStatus == -1) { return } else if (lastPfStatus <= ElectricityStatus.A.value) { lastPfStatus = s.first.toInt() } else if (lastPfStatus >= ElectricityStatus.B.value) { if (s.first.toInt() <= ElectricityStatus.A.value) { pfETime = e?.mvDataTime lastPfStatus = -1 } else { if (hourMinute == "23:59") pfTag = true lastPfStatus = s.first.toInt() } } } else -> Unit } } /** * å¦æè®¾å¤å ³éæ¶æ¯ç´æ¥ä»è¿è¡ç¶ææçµï¼å卿¤å¤å°æåä¸ä¸ªæ°æ®çæ¶é´è®°ä¸ºå ³éæ¶é´ */ fun setEndTime2(date: Date) { when (deviceType) { ElectricityType.ProductionLine -> { if (plETime == null && !plTag) { plETime = date } } ElectricityType.Purify -> { if (pfETime == null && !pfTag) { pfETime = date } } else -> Unit } } @@ -119,20 +180,49 @@ } /** * 累计ç¨çµé */ fun addPower(e: ElectricMinuteValue?) { e?.let { val avgElectric = (it.mvElectricityA + it.mvElectricityB + it.mvElectricityC) / 3 val power = avgElectric * 1 / 60 when (deviceType) { ElectricityType.ProductionLine -> plPower += power ElectricityType.Purify -> pfPower += power else -> Unit } } } /** * ç»è®¡å¾åºå½æ¥åæç»æ */ fun getResult() { // TODO: 2021/12/1 1. è®¾å¤æ£å¼è¿è¡æ¶é´å·® =ãå¼å¯æ¯å¦åè§ // ç¨çµé plPower = round(plPower * 100) / 100 pfPower = round(pfPower * 100) / 100 // å¼å ³æ¶é´æ ¼å¼å plRTimeStr = DateUtil.instance.dateToString(plRTime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS) plETimeStr = DateUtil.instance.dateToString(plETime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS) pfRTimeStr = DateUtil.instance.dateToString(pfRTime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS) pfETimeStr = DateUtil.instance.dateToString(pfETime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS) // 1. è®¾å¤æ£å¼è¿è¡æ¶é´å·® =ãå¼å¯æ¯å¦åè§ if (pfRTime != null && plRTime != null) { rTimeDiff = ((pfRTime!!.time - plRTime!!.time) / 1000 / 60).toInt() sResult = rTimeDiff < 0 sResult = rTimeDiff == null || rTimeDiff!! < 0 } // TODO: 2021/12/1 2ï¼è®¾å¤å ³éæ¶é´å·® =ãå ³éæ¯å¦åè§ // 2ï¼è®¾å¤å ³éæ¶é´å·® =ãå ³éæ¯å¦åè§ if (pfETime != null && plETime != null) { eTimeDiff = ((pfETime!!.time - plETime!!.time) / 1000 / 60).toInt() eResult = eTimeDiff > 0 eResult = eTimeDiff == null || eTimeDiff!! > 0 } else { // å½å ³éæ¶é´åå¨nullæ¶ï¼è¯´æå½æ¥å¹¶æ²¡æå ³é设å¤ï¼å ³éåè§ eTimeDiff = null eResult = true } // TODO: 2021/12/1 3. è¿è¡æ¶é¿å·® =ãè¿è¡è¿ç¨æ¯å¦åè§ // 3. è¿è¡æ¶é¿å·® =ãè¿è¡è¿ç¨æ¯å¦åè§ runningTimeDiff = pfRunTime - plRunTime rResult = runningTimeDiff > 0 src/main/kotlin/com/flightfeather/uav/lightshare/bean/QuadrantInfo.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,114 @@ package com.flightfeather.uav.lightshare.bean import com.flightfeather.uav.common.utils.MapUtil import kotlin.math.PI /** * ç½æ ¼åæéåæè±¡é对象 * ä»¥çæµç¹ä¸ºç½æ ¼çº¿çä¸å¿çåºç¡ä¸ï¼å夿©æ£çæ¯ä¸åç½æ ¼æç §åæ ç³»å为å个象é * æ¯ä¸ªè±¡éä¸çç½æ ¼æç §è§ä¸çç½æ ¼ä½ä¸ºåçï¼åæ3é¨åï¼å嫿ä¸åçå夿©æ£æºå¶ */ class QuadrantInfo{ val gridsHorizontal = mutableListOf<GridVo>() val gridsCorner = mutableListOf<GridVo>() val gridsVertical = mutableListOf<GridVo>() fun new(type: Quadrant, turns: Int, lng: Double, lat: Double, dx: Double, dy: Double) { var plusMinusX = 1 // ç»åº¦å¢å æåå° var plusMinusY = 1 // 纬度å¢å æåå° when (type) { Quadrant.First -> { plusMinusX = 1 plusMinusY = 1 } Quadrant.Second -> { plusMinusX = 1 plusMinusY = -1 } Quadrant.Third -> { plusMinusX = -1 plusMinusY = -1 } Quadrant.Fourth -> { plusMinusX = -1 plusMinusY = 1 } } // è§ gridsCorner.add(GridVo("$turns-${type.value}-c").apply { lb = Pair(lng + turns * dx * plusMinusX, lat + turns * dy * plusMinusY) rt = Pair(lb!!.first + dx, lb!!.second + dy) ciLongitude = (lb!!.first + dx / 2).toBigDecimal() ciLatitude = (lb!!.second + dy / 2).toBigDecimal() }) // æ°´å¹³æ¹å repeat(turns) { gridsHorizontal.add(GridVo("$turns-${type.value}-l-$it").apply { lb = Pair(lng + it * dx * plusMinusX, lat + turns * dy * plusMinusY) rt = Pair(lb!!.first + dx, lb!!.second + dy) ciLongitude = (lb!!.first + dx / 2).toBigDecimal() ciLatitude = (lb!!.second + dy / 2).toBigDecimal() }) } // åç´æ¹å repeat(turns) { gridsVertical.add(GridVo("$turns-${type.value}-l-$it").apply { lb = Pair(lng + turns * dx * plusMinusX, lat + it * dy * plusMinusY) rt = Pair(lb!!.first + dx, lb!!.second + dy) ciLongitude = (lb!!.first + dx / 2).toBigDecimal() ciLatitude = (lb!!.second + dy / 2).toBigDecimal() }) } } fun next() { } } enum class Quadrant(val des: String, val value:Int){ First("å³ä¸è±¡é", 1), Second("å³ä¸è±¡é", 2), Third("å·¦ä¸è±¡é", 3), Fourth("å·¦ä¸è±¡é", 4), } object GridFactory { // çæµç¹åæ private var lng = .0 private var lat = .0 private var dx = .0 private var dy = .0 /** * è®¾ç½®çæµç¹åæ */ fun setCenter(lng: Double, lat: Double): GridFactory { this.lng = lng this.lat = lat return this } /** * è®¾ç½®ç½æ ¼é¿åº¦ * @param len ç½æ ¼é¿åº¦ï¼ç±³ï¼ */ fun setGridLength(len: Double): GridFactory { val center = Pair(lng, lat) val p1 = MapUtil.getPointByLen(center, len, PI / 2)//æ£ä¸æ¹åï¼90°ï¼çåæ ç¹ val p2 = MapUtil.getPointByLen(center, len, PI)//æ£åæ¹åï¼180°ï¼çåæ ç¹ this.dx = p1.first - center.first this.dy = center.second - p2.second return this } /** * æ°å»ºä¸åç½æ ¼ * @param turns åæ°ï¼ä»0å¼å§ï¼ */ // fun newGridsByTurns(turns: Int): List<QuadrantInfo> { // // } } src/main/kotlin/com/flightfeather/uav/lightshare/service/EPWModelService.kt
@@ -7,10 +7,18 @@ interface EPWModelService { /** * ç½æ ¼åæåæ * ç½æ ¼åæ * æç §åºå®çæ»é¢ç§¯ï¼æ ¹æ®ç»å®çç½æ ¼è¾¹é¿ï¼å¨æçæå¯¹åºæ°éçç½æ ¼ * @param type æ°æ®æºç±»å @see [UWDeviceType], 0a,0b,0c,0d * @param len ç½æ ¼é¿åº¦ */ fun getEpwModelResult(deviceCode: String, startTime: String, endTime: String, len: Double): BaseResponse<List<GridVo>> /** * å¨æç½æ ¼åæ * ç®ååªé对å®ç¹çæµ * å¯èªå¨è®¡ç®åºææçé«é£é©åä¸é£é©åºå */ fun getEpwModelResultDynamic(deviceCode: String, startTime: String, endTime: String, len: Double): BaseResponse<List<GridVo>> } src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/EPWModelServiceImpl.kt
@@ -3,20 +3,22 @@ import com.flightfeather.uav.common.GridLat import com.flightfeather.uav.common.GridLng import com.flightfeather.uav.common.utils.MapUtil import com.flightfeather.uav.lightshare.bean.BaseResponse import com.flightfeather.uav.lightshare.bean.GridVo import com.flightfeather.uav.lightshare.bean.* import com.flightfeather.uav.lightshare.service.EPWModelService import com.flightfeather.uav.lightshare.service.RealTimeDataService import com.flightfeather.uav.model.epw.EPWGridModel import com.flightfeather.uav.model.epw.EPWModel import com.flightfeather.uav.socket.eunm.UWDeviceType import org.springframework.stereotype.Service import kotlin.math.PI import kotlin.math.* @Service class EPWModelServiceImpl( private val realTimeDataService: RealTimeDataService, ) : EPWModelService { companion object { private const val LEN = 3// æ ¹æ®é£åç½æ ¼å夿å±åæ° } val epwModel = EPWGridModel() @@ -34,6 +36,60 @@ if (gridType == 'f') return BaseResponse(false) val points = mutableListOf<GridVo>() // è·åå ¨é¨æ°æ®è®¡ç®å¹³åé£å val dataList = mutableListOf<DataVo>() var page = 1 var totalPage = -1 //é£åéç¨åä½ç¢éæ³æ±ååå¼ var u = .0//ä¸è¥¿æ¹ä½åéæ»å var v = .0//ååæ¹ä½åéæ»å var c = 0//é£åæ°æ®è®¡æ° var windDirection = .0 // å¹³åé£åè§åº¦ while (totalPage == -1 || page <= totalPage) { realTimeDataService.getSecondData(deviceCode, startTime, endTime, 0, page, 5000).apply { if (totalPage == -1) { totalPage = head?.totalPage ?: 0 } val list = data ?: emptyList() // FIXME: 2021/7/13 æ¤å¤ä¸ºäºæµè¯ææ¶å°ç«ç¹ç»çº¬åº¦åæ»ï¼åç»éè¿æ°æ®åºé ç½®è·å list.forEach { if (it.lng == 0.0 && it.lat == 0.0) { it.lng = GridLng it.lat = GridLat } val r = Math.toRadians(it.values?.get(16)?.factorData ?: .0) u += sin(r) v += cos(r) c++ } dataList.addAll(list) page++ } } 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 = a } // æ ¹æ®ä¸åç±»åï¼ç¡®å®ä¸åçç½æ ¼çææ¹å¼ï¼å¾åºç½æ ¼ä¸å¿ç¹éå(ç½æ ¼é»è®¤éç¨æ£æ¹å½¢) // èµ°èªçæµ if (gridType == '0') { @@ -42,26 +98,51 @@ // å®ç¹çæµ else if (gridType == '1') { // FIXME: 2021/12/6 æ¤å¤ä¸ºäºæµè¯ææ¶å°ç«ç¹ç»çº¬åº¦åæ»ï¼åç»éè¿æ°æ®åºé ç½®è·å val center = Pair(121.235813, 30.835898) val center = Pair(GridLng, GridLat) // a.ç¡®å®ç½æ ¼é¿åº¦å¯¹åºçåæ å·®å¼ // FIXME: 2021/12/16 æ¤å¤ç½æ ¼åæ çè®¡ç®æ¯è¾ç®åï¼è¿ä¼¼å°å ¶å½ä½å¹³é¢åæ æ¥åï¼åç»å¯æ¹è¿ val p1 = MapUtil.getPointByLen(center, len, PI / 2)//æ£ä¸æ¹åï¼90°ï¼çåæ ç¹ val p2 = MapUtil.getPointByLen(center, len, PI)//æ£åæ¹åï¼180°ï¼çåæ ç¹ val dx = p1.first - center.first val dy = center.second - p2.second // b.ç¡®å®åè¾¹æå¤å°ä¸ªç½æ ¼(è§å®çæµç¹å¨ä¸å¿ç½æ ¼çä¸ç¹ä¸ï¼å æ¤åè¾¹ç½æ ¼æ°ä¸å®ä¸ºå¥æ°) val totalLen = 2000 // ç½æ ¼èå´ï¼è¾¹é¿ä¸º20åç±³çæ£æ¹å½¢ val totalLen = 2000 // FIXME: 2021/12/16 ç½æ ¼èå´ï¼è¾¹é¿ä¸º20åç±³çæ£æ¹å½¢ val gridNum = ((totalLen / 2 / len).toInt() - 1) * 2 + 1 // c.ç¡®å®å·¦ä¸è§ç½æ ¼å·¦ä¸åå³ä¸ç两个对è§ç¹åæ var len1 = gridNum//æ°´å¹³æ¹åç½æ ¼æ° var width = gridNum//åç´æ¹åç½æ ¼æ° //ä¸å¿ç¹åæ val g1CenterLng = center.first - (gridNum - 1) / 2 * dx//ç»åº¦åå° val g1CenterLat = center.second + (gridNum - 1) / 2 * dy//纬度å¢å var g1CenterLng = center.first - (gridNum - 1) / 2 * dx//ç»åº¦åå° var g1CenterLat = center.second + (gridNum - 1) / 2 * dy//纬度å¢å when (windDirection) { in .0..90.0 -> { g1CenterLat += LEN * dy width += LEN len1 += LEN } in 90.0..180.0 -> { len1 += LEN width += LEN } in 180.0..270.0 -> { g1CenterLng -= LEN * dx len1 += LEN width += LEN } in 270.0..360.0 -> { g1CenterLng -= LEN * dx g1CenterLat += LEN * dy len1 += LEN width += LEN } } //å·¦ä¸åæ val g1LB = Pair(g1CenterLng - dx / 2, g1CenterLat - dy / 2) //å³ä¸åæ val g1RT = Pair(g1CenterLng + dx / 2, g1CenterLat + dy / 2) // d.å¾åºææç½æ ¼ç两个对è§ç¹åæ for (x in 0 until gridNum) { for (y in 0 until gridNum) { for (x in 0 until len1) { for (y in 0 until width) { points.add(GridVo("$x-$y").apply { this.lb = Pair(g1LB.first + dx * x, g1LB.second - dy * y) this.rt = Pair(g1RT.first + dx * x, g1RT.second - dy * y) @@ -72,27 +153,7 @@ } } // 计ç®åä¸å¿ç¹æ±¡æé£é©æéç»æå¹¶èµäºå¯¹åºå½±åç级 var page = 1 var totalPage = -1 while (totalPage == -1 || page <= totalPage) { realTimeDataService.getSecondData(deviceCode, startTime, endTime, 0, page, 5000).apply { if (totalPage == -1) { totalPage = head?.totalPage ?: 0 } val dataList = data ?: emptyList() // FIXME: 2021/7/13 æ¤å¤ä¸ºäºæµè¯ææ¶å°ç«ç¹ç»çº¬åº¦åæ»ï¼åç»éè¿æ°æ®åºé ç½®è·å dataList.forEach { if (it.lng == 0.0 && it.lat == 0.0) { it.lng = GridLng it.lat = GridLat } } epwModel.execute(dataList, points, true) page++ } } epwModel.execute(dataList, points, true) val r = epwModel.outputResult() val max = mutableMapOf<String, Double>()//è®°å½æ¯ç§çæµå åçæå¤§å¼ @@ -138,4 +199,62 @@ } return BaseResponse(true, data = points) } /** * ä»¥çæµç¹ä¸ºç½æ ¼çº¿ä¸çä¸å¿ï¼åå¤æç §æ£æ¹å½¢è¿è¡æ©æ£ã * é¦å é»è®¤å±ç¤ºçæµç¹å¨å´ä¸å16ä¸ªç½æ ¼ï¼ç¶åå以å¤å12ä¸ªç½æ ¼ä¸ºåºç¡å夿©æ£ï¼æ¯æ¬¡æå¤æ©æ£ä¸åï¼å¤ææéç»æï¼ä¿çææçé«é£é©åä¸é£é©ç½æ ¼ï¼å¹¶ä¿ç两åä½é£é©ç½æ ¼ * å ¶ä¸çé«ãä¸ãä½é£é©å¤æä¾æ®ä¸ºç½æ ¼æéå¼å¯¹åºå½åæå¤§å¼çæ¯ä¾ï¼åç为66.66%å33.33%ï¼ */ override fun getEpwModelResultDynamic(deviceCode: String, startTime: String, endTime: String, len: Double): BaseResponse<List<GridVo>> { // if (deviceCode.length < 2) return BaseResponse(false, "设å¤ç¼å·æ ¼å¼é误") // // ç¡®å®æ°æ®æºç±»åï¼åºå为âå®ç¹çæµæ°æ®âåâç§»å¨çæµæ°æ®ä¸¤ç§â // val gridType = when (deviceCode.substring(0, 2)) { // UWDeviceType.UAV.value -> '0' // UWDeviceType.VEHICLE.value -> '0' // UWDeviceType.GRID.value -> '1' // UWDeviceType.BOAT.value -> 'f' // else -> 'f' // } // if (gridType == 'f' || gridType == '0') return BaseResponse(false, "该设å¤ç±»å䏿¯æå¨æç½æ ¼é£é©è®¡ç®ï¼åªæå®ç¹ç½æ ¼å设å¤å¯è¡") // val points = mutableListOf<GridVo>() // // FIXME: 2021/12/6 æ¤å¤ä¸ºäºæµè¯ææ¶å°ç«ç¹ç»çº¬åº¦åæ»ï¼åç»éè¿æ°æ®åºé ç½®è·å // val center = Pair(GridLng, GridLat) // // // a.ç¡®å®ç½æ ¼é¿åº¦å¯¹åºçåæ å·®å¼ // // FIXME: 2021/12/16 æ¤å¤ç½æ ¼åæ çè®¡ç®æ¯è¾ç®åï¼è¿ä¼¼å°å ¶å½ä½å¹³é¢åæ æ¥åï¼åç»å¯æ¹è¿ // val p1 = MapUtil.getPointByLen(center, len, PI / 2)//æ£ä¸æ¹åï¼90°ï¼çåæ ç¹ // val p2 = MapUtil.getPointByLen(center, len, PI)//æ£åæ¹åï¼180°ï¼çåæ ç¹ // val dx = p1.first - center.first // val dy = center.second - p2.second // // val grids = mutableListOf<QuadrantInfo>()// ææç½æ ¼ // val outerMost = mutableMapOf<Quadrant, QuadrantInfo>()// å½åæå¤åçç½æ ¼ // // b.å 计ç®å é¨ä¸¤åçç»æ // grids.addAll(listOf( // // 第ä¸å // QuadrantInfo(Quadrant.First, 0), // QuadrantInfo(Quadrant.Second, 0), // QuadrantInfo(Quadrant.Third, 0), // QuadrantInfo(Quadrant.Fourth, 0), // // 第äºå // QuadrantInfo(Quadrant.First, 1), // QuadrantInfo(Quadrant.Second, 1), // QuadrantInfo(Quadrant.Third, 1), // QuadrantInfo(Quadrant.Fourth, 1), // )) // //å½åæå¤åï¼ç¬¬äºåï¼ // outerMost[Quadrant.First] = grids[4] // outerMost[Quadrant.Second] = grids[5] // outerMost[Quadrant.Third] = grids[6] // outerMost[Quadrant.Fourth] = grids[7] // //ä¸å¿ç¹åæ // val g1CenterLng = center.first - (gridNum - 1) / 2 * dx//ç»åº¦åå° // val g1CenterLat = center.second + (gridNum - 1) / 2 * dy//纬度å¢å // //å·¦ä¸åæ // val g1LB = Pair(g1CenterLng - dx / 2, g1CenterLat - dy / 2) // //å³ä¸åæ // val g1RT = Pair(g1CenterLng + dx / 2, g1CenterLat + dy / 2) return BaseResponse(true) } } src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt
@@ -189,26 +189,20 @@ // æ ¹æ®ä¸¤å°è®¾å¤çæé¿èµ·å§æ¶é´ï¼è®¡ç®å ¶ä¸æ¯ä¸åéç对åºåå¼ while (!lsT.isAfter(leT)) { // 两å°è®¾å¤çæ°æ®æ ¹æ®æ¶é´å并为ä¸ä¸ªç»æä½ val vo = ElectricVo(lsT.format(dateFormatter2)) // FIXME: 2021/11/22 æ¤å¤ç±äºå端设å¤çéæ ·æ¶é´ä¸æ å ï¼éæ ·å¨æå¹¶ä¸æ¯ä¸¥æ ¼ç1åéï¼å¯¼è´éæ ·æ¶é´ææ¶ä¼ç¼ºå°1åéçæ°æ® // FIXME: 2021/11/22 å æ¤ï¼å½æä¸åéè¯¥è®¾å¤æ°æ®è½®ç©ºæ¶ï¼éç¨åä¸ä¸ªæ°æ®ä½ä¸ºå¡«å if (dataList1.isNotEmpty()) { val d = dataList1[0] val t = LocalDateTime.ofInstant(d?.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0) if (lsT.isEqual(t)) { vo.apply { d1eA = d?.mvElectricityA ?: .0 d1eB = d?.mvElectricityB ?: .0 d1eC = d?.mvElectricityC ?: .0 val s = ElectricDailyAnalysis.getStatus(d, d1) d1Status = s.first d1StatusName = s.second d1Avg = s.third } dataList1.removeAt(0) } else { val data1 = if (dataList1.isNotEmpty()) dataList1[0] else null val t1 = data1?.let { LocalDateTime.ofInstant(it.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0) } val data2 = if (dataList2.isNotEmpty()) dataList2[0] else null val t2 = data2?.let { LocalDateTime.ofInstant(it.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0) } if ((data1 == null || !lsT.isEqual(t1)) && (data2 == null || !lsT.isEqual(t2)) ) { } else { // 两å°è®¾å¤çæ°æ®æ ¹æ®æ¶é´å并为ä¸ä¸ªç»æä½ val vo = ElectricVo(lsT.format(dateFormatter2)) if (data1 == null || !lsT.isEqual(t1)) { result.lastOrNull()?.let { vo.apply { d1eA = it.d1eA @@ -219,34 +213,20 @@ d1Avg = it.d1Avg } } } } else { result.lastOrNull()?.let { vo.apply { d1eA = it.d1eA d1eB = it.d1eB d1eC = it.d1eC d1Status = it.d1Status d1StatusName = it.d1StatusName d1Avg = it.d1Avg } } } if (dataList2.isNotEmpty()) { val d = dataList2[0] val t = LocalDateTime.ofInstant(d?.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0) if (lsT.isEqual(t)) { vo.apply { d2eA = d?.mvElectricityA ?: .0 d2eB = d?.mvElectricityB ?: .0 d2eC = d?.mvElectricityC ?: .0 val s = ElectricDailyAnalysis.getStatus(d, d2) d2Status = s.first d2StatusName = s.second d2Avg = s.third } dataList2.removeAt(0) } else { vo.apply { d1eA = data1.mvElectricityA ?: .0 d1eB = data1.mvElectricityB ?: .0 d1eC = data1.mvElectricityC ?: .0 val s = ElectricDailyAnalysis.getStatus(data1, d1) d1Status = s.first d1StatusName = s.second d1Avg = s.third } dataList1.removeAt(0) } if (data2 == null || !lsT.isEqual(t2)) { result.lastOrNull()?.let { vo.apply { d2eA = it.d2eA @@ -257,20 +237,97 @@ d2Avg = it.d2Avg } } } } else { result.lastOrNull()?.let { } else { vo.apply { d2eA = it.d2eA d2eB = it.d2eB d2eC = it.d2eC d2Status = it.d2Status d2StatusName = it.d2StatusName d2Avg = it.d2Avg d2eA = data2.mvElectricityA ?: .0 d2eB = data2.mvElectricityB ?: .0 d2eC = data2.mvElectricityC ?: .0 val s = ElectricDailyAnalysis.getStatus(data2, d2) d2Status = s.first d2StatusName = s.second d2Avg = s.third } dataList2.removeAt(0) } result.add(vo) } result.add(vo) // if (dataList1.isNotEmpty()) { // val d = dataList1[0] // val t = LocalDateTime.ofInstant(d?.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0) // if (lsT.isEqual(t)) { // vo.apply { // d1eA = d?.mvElectricityA ?: .0 // d1eB = d?.mvElectricityB ?: .0 // d1eC = d?.mvElectricityC ?: .0 // val s = ElectricDailyAnalysis.getStatus(d, d1) // d1Status = s.first // d1StatusName = s.second // d1Avg = s.third // } // dataList1.removeAt(0) // } else { // result.lastOrNull()?.let { // vo.apply { // d1eA = it.d1eA // d1eB = it.d1eB // d1eC = it.d1eC // d1Status = it.d1Status // d1StatusName = it.d1StatusName // d1Avg = it.d1Avg // } // } // } // } else { // result.lastOrNull()?.let { // vo.apply { // d1eA = it.d1eA // d1eB = it.d1eB // d1eC = it.d1eC // d1Status = it.d1Status // d1StatusName = it.d1StatusName // d1Avg = it.d1Avg // } // } // } // if (dataList2.isNotEmpty()) { // val d = dataList2[0] // val t = LocalDateTime.ofInstant(d?.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0) // if (lsT.isEqual(t)) { // vo.apply { // d2eA = d?.mvElectricityA ?: .0 // d2eB = d?.mvElectricityB ?: .0 // d2eC = d?.mvElectricityC ?: .0 // val s = ElectricDailyAnalysis.getStatus(d, d2) // d2Status = s.first // d2StatusName = s.second // d2Avg = s.third // } // dataList2.removeAt(0) // } else { // result.lastOrNull()?.let { // vo.apply { // d2eA = it.d2eA // d2eB = it.d2eB // d2eC = it.d2eC // d2Status = it.d2Status // d2StatusName = it.d2StatusName // d2Avg = it.d2Avg // } // } // } // } else { // result.lastOrNull()?.let { // vo.apply { // d2eA = it.d2eA // d2eB = it.d2eB // d2eC = it.d2eC // d2Status = it.d2Status // d2StatusName = it.d2StatusName // d2Avg = it.d2Avg // } // } // } lsT = lsT.plusMinutes(1) } @@ -301,10 +358,10 @@ // 彿å¼å§ç»ææ¶é´æ¶ï¼å¤ææ ¼å¼æ¯å¦æ£ç¡® else { try { st = LocalDateTime.parse(startTime, dateFormatter3).withHour(0).withMinute(0).withSecond(0) et = LocalDateTime.parse(endTime, dateFormatter3).withHour(23).withMinute(59).withSecond(59) st = LocalDateTime.parse("$startTime 00:00:00", dateFormatter3) et = LocalDateTime.parse("$endTime 23:59:59", dateFormatter3) } catch (e: DateTimeParseException) { return BaseResponse(false, "æ¶é´æ ¼å¼é误ï¼åºä¸ºyyyy-MM-dd hh:mm:dd") return BaseResponse(false, "æ¶é´æ ¼å¼é误ï¼åºä¸ºyyyy-MM-dd") } } src/main/kotlin/com/flightfeather/uav/model/epw/WindDirWeight.kt
@@ -39,6 +39,7 @@ x1 = abs(x2 - x1) if (x1 > 180) x1 = 360 - x1 // println("夹è§ï¼$x1") x1 = 180 - x1 return x1 } }