Android使用Google Maps Direction API出现(0.0,0.0)附近标记问题求助
解决Google Maps Direction API折线解码出现大量(0.0,0.0)标记的问题
我一眼就看出你折线解码函数里的几个关键问题,这些问题直接导致了解析出来大量无效的(0.0,0.0)坐标:
问题根源
index变量未在每个折线字符串解析前重置:你把index定义在整个函数的开头,处理完一个polyline字符串后,index已经指向该字符串的末尾,下一个字符串解析时会从这个错误位置开始读取,自然会算出无效坐标。lat和lng未在每个折线字符串解析前重置:每个step的polyline是基于自身起点的相对偏移量,不是全局累计值。你延续之前的lat/lng值,会让后续坐标计算完全偏离正确轨道。- 遍历polyline列表时跳过了最后一个元素:
0 until polylineArrayList.size-1这个范围会漏掉最后一个polyline字符串,同时写法也不够直观易读。
修复后的解码函数
private fun decodePoly(polylineArrayList: ArrayList<String>): List<LatLng> { val poly = ArrayList<LatLng>() // 直接遍历每个折线字符串,避免索引范围错误 for (encoded in polylineArrayList) { val len = encoded.length var index = 0 // 每个字符串解析前重置index var lat = 0 // 每个字符串解析前重置基准纬度 var lng = 0 // 每个字符串解析前重置基准经度 while (index < len) { var b: Int var shift = 0 var result = 0 do { b = encoded[index++].toInt() - 63 result = result or (b and 0x1f shl shift) shift += 5 } while (b >= 0x20) val dlat = if (result and 1 != 0) (result shr 1).inv() else result shr 1 lat += dlat shift = 0 result = 0 do { b = encoded[index++].toInt() - 63 result = result or (b and 0x1f shl shift) shift += 5 } while (b >= 0x20) val dlng = if (result and 1 != 0) (result shr 1).inv() else result shr 1 lng += dlng val p = LatLng(lat.toDouble() / 1E5, lng.toDouble() / 1E5) poly.add(p) } } return poly }
额外优化建议
在你的onSuccess方法里,收集polyline的代码可以简化成更简洁的写法,避免多层嵌套循环:
val polylineArrayList = googleDirectionData?.routes?.flatMap { route -> route.legs.flatMap { leg -> leg.steps.map { step -> step.polyline.points } } } ?: arrayListOf()
这样修改后,解码出来的坐标就不会出现大量(0.0,0.0)的无效点了,路线绘制应该能正常显示。
内容的提问来源于stack exchange,提问作者Antoine REY
相关产品推荐
相关产品推荐

