feiyu02
2024-07-05 b2e89ca1b11f33417f3e83223c4aa188186c8155
src/main/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegment.kt
@@ -42,7 +42,11 @@
                avgGPS.add(d.longitude!!.toDouble() to d.latitude!!.toDouble())
            }
        }
        val gdGPS = AMapService.coordinateConvert(avgGPS)
        val gdGPS = mutableListOf<Pair<Double, Double>>()
        val _avgGPS = prepareForConvert(avgGPS)
        _avgGPS.forEach {
            gdGPS.addAll(AMapService.coordinateConvert(it))
        }
        // 通过高德API查询坐标对应的路段
        val segmentInfoList = mutableListOf<SegmentInfo>()
        gdGPS.forEachIndexed { i, pair ->
@@ -62,6 +66,49 @@
            })
        }
        // 结果入库
        segmentInfoRep.insert(segmentInfoList)
        saveResult(segmentInfoList)
    }
    /**
     * 坐标转换分段准备
     * 高德API的坐标转换接口一次访问最多支持40对坐标
     */
    private fun prepareForConvert(gpsList: List<Pair<Double, Double>>): List<List<Pair<Double, Double>>> {
        val res = mutableListOf<List<Pair<Double, Double>>>()
        val maxLen = 40
        var start = 0
        var end = start + maxLen
        while (end < gpsList.size) {
            res.add(gpsList.subList(start, end))
            start += maxLen
            end += maxLen
        }
        if (start < gpsList.size) {
            res.add(gpsList.subList(start, gpsList.size))
        }
        return res
    }
    /**
     * 结果入库
     * 入库之前,将连续并属于同一道路的记录合并
     */
    private fun saveResult(segmentInfoList:List<SegmentInfo>) {
        val res = mutableListOf<SegmentInfo>()
        segmentInfoList.forEach { s ->
            // 判断当前记录和上个记录是否数据同一条道路
            if (res.isNotEmpty()) {
                val lastOne = res.last()
                // 若属于同一道路,合并
                if (lastOne.street == s.street) {
                    lastOne.endTime = s.endTime
                } else {
                    res.add(s)
                }
            } else {
                res.add(s)
            }
        }
        segmentInfoRep.insert(res)
    }
}