如何解决Google Map Direction API中的0.0,0.0标记错误?
修复Google Maps Direction API折线解码出现大量(0.0,0.0)点的问题
你的问题根源在于折线解码函数的变量作用域错误,导致处理多个polyline编码字符串时,没有正确重置状态,进而生成大量无效的(0.0,0.0)点。下面是具体的问题分析和修复方案:
问题分析
你的decodePoly函数存在三个关键错误:
index变量未重置:index定义在函数全局作用域,处理第二个及以后的polyline字符串时,index还是上一个字符串处理后的位置,直接超出当前字符串长度,导致计算出的经纬度差值为0。lat和lng变量未重置:这两个变量同样是全局作用域,不同step的polyline点会基于上一个step的最后一个点累加差值,导致位置完全错误,甚至出现(0.0,0.0)。- 循环条件错误:
while (index < len -1)会漏掉最后一个字符,可能导致部分点解码不完整。
修复方案
方案1:修复自定义解码函数
将index、lat、lng移到每个polyline字符串的处理循环内部,确保每次解码都是独立的,同时修正循环条件:
private fun decodePoly(polylineArrayList: ArrayList<String>): List<LatLng> { val poly = ArrayList<LatLng>() // 遍历每个step的polyline编码字符串 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 }
方案2:使用官方工具类(更推荐)
Google Maps Android SDK提供了官方的折线解码工具PolyUtil,无需自己实现解码逻辑,避免出错。
- 先在
build.gradle中添加依赖:
implementation 'com.google.maps.android:maps-utils:2.2.0'
- 简化你的解码函数:
import com.google.maps.android.PolyUtil private fun decodePoly(polylineArrayList: ArrayList<String>): List<LatLng> { val poly = ArrayList<LatLng>() for (encoded in polylineArrayList) { // 直接使用官方工具解码每个polyline字符串 poly.addAll(PolyUtil.decode(encoded)) } return poly }
额外检查
在onSuccess方法中,确保caisse.wsg84的坐标顺序是纬度在前,经度在后(LatLng构造函数要求(latitude, longitude)),如果坐标顺序反了也会导致位置错误。
内容的提问来源于stack exchange,提问作者Antoine REY




