feiyu02
2025-05-08 9a9a27f185bc0cf9dc0001cfc6839e6d13dbccd9
src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt
@@ -36,9 +36,6 @@
        val closeList = mutableListOf<BaseRealTimeData>()
        records.add(mutableListOf())
        data.forEachIndexed { i, d ->
//            if (records.size == 23) {
//                println(records.size)
//            }
            var isSame = false
            if (i > 0) {
                // 前一个有效监测点
@@ -66,28 +63,17 @@
                    }
                    if (distance >= MIN_DISTANCE) {
                        // 两点距离较大时,计算夹角
                        val deg = CoordinateUtil.getAngle(
                            lastData.longitude!!.toDouble(), lastData.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)
//                                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)
@@ -104,17 +90,19 @@
                            }
                            bool
                        } else {
                            // 当坐标点形成有效路径时,记录为上一个坐标点
                            // 当没有历史角度时,直接保存,并认为是同一路段
                            lastDegList.add(deg)
                            true
                        }
                        // 清空上一组距离接近的坐标点
                        closeList.clear()
                    } else {
                        // 两点距离接近时,添加记录
                        closeList.add(d)
                        isSame = true
                    }
                }
                // 否则认为同一路段
                // 两点坐标不合法,则认为同一路段
                else {
                    isSame = true
                }