You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决Google Map Direction API中的0.0,0.0标记错误?

修复Google Maps Direction API折线解码出现大量(0.0,0.0)点的问题

你的问题根源在于折线解码函数的变量作用域错误,导致处理多个polyline编码字符串时,没有正确重置状态,进而生成大量无效的(0.0,0.0)点。下面是具体的问题分析和修复方案:

问题分析

你的decodePoly函数存在三个关键错误:

  1. index变量未重置index定义在函数全局作用域,处理第二个及以后的polyline字符串时,index还是上一个字符串处理后的位置,直接超出当前字符串长度,导致计算出的经纬度差值为0。
  2. latlng变量未重置:这两个变量同样是全局作用域,不同step的polyline点会基于上一个step的最后一个点累加差值,导致位置完全错误,甚至出现(0.0,0.0)。
  3. 循环条件错误while (index < len -1)会漏掉最后一个字符,可能导致部分点解码不完整。

修复方案

方案1:修复自定义解码函数

indexlatlng移到每个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,无需自己实现解码逻辑,避免出错。

  1. 先在build.gradle中添加依赖:
implementation 'com.google.maps.android:maps-utils:2.2.0'
  1. 简化你的解码函数:
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

火山引擎 最新活动