| | |
| | | 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 |
| | |
| | | }) |
| | | } |
| | | // 结果入库 |
| | | 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) |
| | | } |
| | | } |