feiyu02
2025-09-30 94fee0b511279679b43e210878d3d36e5a14384b
src/main/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegment.kt
@@ -42,10 +42,15 @@
                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 ->
            Thread.sleep(400)
            val address = AMapService.reGeo(pair)
            segmentInfoList.add(SegmentInfo().apply {
                missionCode = mission.missionCode
@@ -62,6 +67,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)
    }
}