From 022af485fbd77bc3d6b01f9f779248b3c189dad2 Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期四, 04 七月 2024 17:35:33 +0800 Subject: [PATCH] 1. 新增走航报告自动道路识别模块 --- src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt | 93 +++++++++++++++++++++++++++++++++++++--------- 1 files changed, 74 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt b/src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt similarity index 60% rename from src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt rename to src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt index abd56ec..2b0ed10 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt +++ b/src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt @@ -1,9 +1,11 @@ -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 /** * 璧拌埅杞ㄨ抗鍒嗗壊鍒嗙被 @@ -13,10 +15,10 @@ 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 /** * 鎸夌収閬撹矾瀵硅蛋鑸建杩硅繘琛屽垎鍓� @@ -34,13 +36,13 @@ 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) @@ -57,6 +59,7 @@ // 濡傛灉宸茬粡鏈夎窛绂昏繃杩戠殑鐐归泦鍚堬紝鍒欒繕闇�瑕佸拰绗竴涓偣杩涜璺濈鍒ゆ柇锛� // 瑙e喅褰撹溅杈嗚椹堕�熷害杩囦綆鏃讹紝杩炵画鐐圭殑璺濈閮借繃杩戝鑷撮兘鍒ゅ畾涓哄悓涓�鐐圭殑闂 val firstCloseData = closeList[0] +// lastData = closeList.toList().avg() distance = CoordinateUtil.calculateDistance( firstCloseData.longitude!!.toDouble(), firstCloseData.latitude!!.toDouble(), d.longitude!!.toDouble(), d.latitude!!.toDouble()) @@ -69,27 +72,43 @@ ) isSame = if (lastDegList.isNotEmpty()) { var bool = true - // 鍑虹幇瑙掑害鎺ヨ繎鍨傜洿鐘舵�佺殑娆℃暟 - 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++ - } + + +// // 鍑虹幇瑙掑害鎺ヨ繎鍨傜洿鐘舵�佺殑娆℃暟 +// 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) + ) { + bool = false } - // 褰撴帴杩戝瀭鐩寸殑瑙掑害瓒呰繃涓婁竴缁勫钩琛岃搴︾殑涓�鍗婃椂锛岃涓轰粠璇ョ偣杞ㄨ抗杞集锛堟秷闄や釜鍒潗鏍囩偣鐢变簬瀹氫綅璇樊瀵艰嚧鐨勯敊璇奖鍝嶏級 - bool = unSameCount < (lastDegList.size / 3 + 1) + // 褰撳嚭鐜拌浆寮偣鏃讹紝娓呯┖鍘嗗彶瑙掑害锛屽苟涓旇垗寮冭浆寮偣鐩稿浜庡墠涓�涓偣鐨勮搴︼紙瑙e喅涓�绉嶆瀬绔儏鍐碉紝褰撹繛缁嚭鐜拌浆寮偣鏃讹紝褰撳墠鍧愭爣鐐逛細琚崟鐙垎鍓蹭负涓�娈碉級 - 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 @@ -110,4 +129,40 @@ 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: 鐪熷疄瑙掑害澶勪簬绗竴璞¢檺锛屼慨姝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 + } + + return a + } } \ No newline at end of file -- Gitblit v1.9.3