ÎļþÃû´Ó src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt ÐÞ¸Ä |
| | |
| | | package com.flightfeather.uav.biz.dataprocess |
| | | package com.flightfeather.uav.common.location |
| | | |
| | | import com.flightfeather.uav.common.location.CoordinateUtil |
| | | import com.flightfeather.uav.domain.entity.BaseRealTimeData |
| | | import java.math.BigDecimal |
| | | import kotlin.math.abs |
| | | import kotlin.math.atan |
| | | import kotlin.math.cos |
| | | import kotlin.math.sin |
| | | |
| | | /** |
| | | * èµ°èªè½¨è¿¹åå²åç±» |
| | |
| | | object TrackSegment { |
| | | |
| | | // åæ ç¹é´æå°è·ç¦»ï¼åä½ç±³ |
| | | private const val MIN_DISTANCE = 10 |
| | | private const val MIN_DISTANCE = 6 |
| | | |
| | | // 两æ¡ç´çº¿å¤¹è§ä¸º90度æ¶ï¼è®¤ä¸ºåç´ãå®é
æ
åµä¸ï¼è§åº¦å
许æä¸å®åå·®ï¼å
许åå·®è§åº¦ |
| | | private const val VERTICAL_OFFSET_DEG = 22.5 |
| | | private const val VERTICAL_OFFSET_DEG = 45 |
| | | |
| | | /** |
| | | * æç
§é路对走èªè½¨è¿¹è¿è¡åå² |
| | |
| | | val closeList = mutableListOf<BaseRealTimeData>() |
| | | records.add(mutableListOf()) |
| | | data.forEachIndexed { i, d -> |
| | | if (records.size == 33) { |
| | | if (records.size == 23) { |
| | | println(records.size) |
| | | } |
| | | var isSame = false |
| | | if (i > 0) { |
| | | // åä¸ä¸ªææçæµç¹ |
| | | val lastData = data[i - 1] |
| | | var lastData = data[i - 1] |
| | | // ç¡®ä¿ä¸¤ç¹åæ åæ³ |
| | | if ((lastData.longitude != null && lastData.longitude != BigDecimal.ZERO) |
| | | && (lastData.latitude != null && lastData.latitude != BigDecimal.ZERO) |
| | |
| | | // å¦æå·²ç»æè·ç¦»è¿è¿çç¹éåï¼åè¿éè¦å第ä¸ä¸ªç¹è¿è¡è·ç¦»å¤æï¼ |
| | | // è§£å³å½è½¦è¾è¡é©¶é度è¿ä½æ¶ï¼è¿ç»ç¹çè·ç¦»é½è¿è¿å¯¼è´é½å¤å®ä¸ºåä¸ç¹çé®é¢ |
| | | val firstCloseData = closeList[0] |
| | | // lastData = closeList.toList().avg() |
| | | distance = CoordinateUtil.calculateDistance( |
| | | firstCloseData.longitude!!.toDouble(), firstCloseData.latitude!!.toDouble(), |
| | | d.longitude!!.toDouble(), d.latitude!!.toDouble()) |
| | |
| | | ) |
| | | isSame = if (lastDegList.isNotEmpty()) { |
| | | var bool = true |
| | | // åºç°è§åº¦æ¥è¿åç´ç¶æçæ¬¡æ° |
| | | var unSameCount = 0 |
| | | // æ¯è¾å½åæ¹ä½è§åä¸ä¸ç»æ¯ä¸ªæ¹ä½è§ç差弿¯å¦é½å¤äºèå´å
|
| | | for (lastDeg in lastDegList) { |
| | | val diffDeg = abs(deg - lastDeg) |
| | | |
| | | |
| | | // // åºç°è§åº¦æ¥è¿åç´ç¶æçæ¬¡æ° |
| | | // var unSameCount = 0 |
| | | // // æ¯è¾å½åæ¹ä½è§åä¸ä¸ç»æ¯ä¸ªæ¹ä½è§ç差弿¯å¦é½å¤äºèå´å
|
| | | // for (lastDeg in lastDegList) { |
| | | // val diffDeg = abs(deg - lastDeg) |
| | | // if (diffDeg in (90.0 - VERTICAL_OFFSET_DEG)..(90.0 + VERTICAL_OFFSET_DEG) |
| | | // || diffDeg in (270.0 - VERTICAL_OFFSET_DEG)..(270.0 + VERTICAL_OFFSET_DEG) |
| | | // ) { |
| | | // unSameCount++ |
| | | // } |
| | | // } |
| | | // // 彿¥è¿åç´çè§åº¦è¶
è¿ä¸ä¸ç»å¹³è¡è§åº¦çä¸åæ¶ï¼è®¤ä¸ºä»è¯¥ç¹è½¨è¿¹è½¬å¼¯ï¼æ¶é¤ä¸ªå«åæ ç¹ç±äºå®ä½è¯¯å·®å¯¼è´çé误影åï¼ |
| | | // bool = unSameCount < (lastDegList.size / 3 + 1) |
| | | |
| | | val avgDeg = avgDegree(lastDegList) |
| | | val diffDeg = abs(deg - avgDeg) |
| | | if (diffDeg in (90.0 - VERTICAL_OFFSET_DEG)..(90.0 + VERTICAL_OFFSET_DEG) |
| | | || diffDeg in (270.0 - VERTICAL_OFFSET_DEG)..(270.0 + VERTICAL_OFFSET_DEG) |
| | | ) { |
| | | unSameCount++ |
| | | bool = false |
| | | } |
| | | } |
| | | // 彿¥è¿åç´çè§åº¦è¶
è¿ä¸ä¸ç»å¹³è¡è§åº¦çä¸åæ¶ï¼è®¤ä¸ºä»è¯¥ç¹è½¨è¿¹è½¬å¼¯ï¼æ¶é¤ä¸ªå«åæ ç¹ç±äºå®ä½è¯¯å·®å¯¼è´çé误影åï¼ |
| | | bool = unSameCount < (lastDegList.size / 3 + 1) |
| | | |
| | | // å½åºç°è½¬å¼¯ç¹æ¶ï¼æ¸
空åå²è§åº¦ï¼å¹¶ä¸èå¼è½¬å¼¯ç¹ç¸å¯¹äºåä¸ä¸ªç¹çè§åº¦ï¼è§£å³ä¸ç§æç«¯æ
åµï¼å½è¿ç»åºç°è½¬å¼¯ç¹æ¶ï¼å½ååæ ç¹ä¼è¢«åç¬åå²ä¸ºä¸æ®µï¼ |
| | | if (!bool) lastDegList.clear() |
| | | if (!bool) { |
| | | lastDegList.clear() |
| | | } else { |
| | | lastDegList.add(deg) |
| | | } |
| | | bool |
| | | } else { |
| | | // å½åæ ç¹å½¢æææè·¯å¾æ¶ï¼è®°å½ä¸ºä¸ä¸ä¸ªåæ ç¹ |
| | | lastDegList.add(deg) |
| | | true |
| | | } |
| | | closeList.clear() |
| | | } else { |
| | | closeList.add(d) |
| | | isSame = true |
| | |
| | | |
| | | return records |
| | | } |
| | | |
| | | /** |
| | | * æ±è½¬åè§åº¦çåå¼ |
| | | */ |
| | | private fun avgDegree(degList: List<Double>): Double { |
| | | if (degList.isEmpty()) return .0 |
| | | //éç¨åä½ç¢éæ³æ±ååå¼ |
| | | var u = .0//ä¸è¥¿æ¹ä½åéæ»å |
| | | var v = .0//ååæ¹ä½åéæ»å |
| | | var c = 0//æ°æ®è®¡æ° |
| | | |
| | | degList.forEach { |
| | | val r = Math.toRadians(it) |
| | | u += sin(r) |
| | | v += cos(r) |
| | | c++ |
| | | } |
| | | |
| | | 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 |
| | | } |
| | | |
| | | return a |
| | | } |
| | | } |