You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Google Maps API获取两点间全部可行路线?

嘿,我来帮你解决这个Google Maps API获取多条路线的问题!

问题分析与解决办法

1. 先确认API是否真的有备选路线返回

首先,你添加的provideRouteAlternatives=true参数是完全正确的,但Google Maps API不是一定会返回多条路线——如果两点之间的最优路径只有一条(比如两地之间只有一条主干道,或者没有其他合理的绕行路线),API就只会返回一条结果,这是正常行为。

你可以先打印完整的API响应,看看routes数组的长度:

// 在你的网络请求回调里添加这段代码,查看完整响应
if let data = data {
    do {
        let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .prettyPrinted)
        print(jsonResponse)
    } catch {
        print("解析错误:\(error.localizedDescription)")
    }
}

如果打印出来的routes数组长度就是1,那说明当前条件下确实没有备选路线,不用纠结啦。

2. 调整请求参数,触发更多备选路线

如果确实需要多条路线,可以尝试调整这些参数,让API生成更多路径选择:

  • 指定出行模式:默认是driving,你可以试试添加mode=walking或mode=transit,不同出行方式可能有更多路径;
  • 添加避障参数:比如avoid=tolls(避开收费道路)、avoid=highways(避开高速),强制API绕开某些道路,从而生成不同路线;
  • 考虑实时路况:如果是驾车路线,添加departure_time=now并搭配traffic_model=best_guess,实时交通状况可能会让API推荐不同的绕行路线。

调整后的请求URL示例:

https://maps.googleapis.com/maps/api/directions/json?origin=30.1124,31.4003&destination=29.9792,31.1342&provideRouteAlternatives=true&mode=driving&avoid=highways&key=xx

3. 检查API密钥的配置

还要确认你的API密钥在Google Cloud控制台里的状态:

  • 有没有启用Directions API;
  • 配额是否充足(如果配额用完,API可能会返回简化响应或错误);
  • 密钥有没有设置IP/地域限制,导致请求没有被正常处理。

4. 代码中正确遍历所有路线

如果API返回了多条路线,你的代码需要遍历routes数组,而不是只取第一个元素。修改后的代码示例:

func getRoutes(handler:@escaping (_ routes: [[String: Any]]?, _ error: String?) -> Void){
    // 完整的请求URL(替换成你的密钥)
    guard let requestUrl = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=30.1124,31.4003&destination=29.9792,31.1342&provideRouteAlternatives=true&key=xx") else {
        handler(nil, "无效的请求URL")
        return
    }
    
    let request = URLRequest(url: requestUrl)
    URLSession.shared.dataTask(with: request) { data, response, error in
        // 处理网络错误
        if let error = error {
            handler(nil, "网络请求失败:\(error.localizedDescription)")
            return
        }
        
        guard let responseData = data else {
            handler(nil, "未收到响应数据")
            return
        }
        
        do {
            // 解析JSON响应
            if let jsonDict = try JSONSerialization.jsonObject(with: responseData, options: .allowFragments) as? [String: Any] {
                // 提取所有路线
                if let routesArray = jsonDict["routes"] as? [[String: Any]] {
                    handler(routesArray, nil)
                } else {
                    handler(nil, "未找到路线数据")
                }
            }
        } catch {
            handler(nil, "JSON解析错误:\(error.localizedDescription)")
        }
    }.resume()
}

调用这个方法时,你就能拿到所有返回的路线数组,然后可以逐个处理每条路线的细节(比如步骤、距离、耗时等)。


内容的提问来源于stack exchange,提问作者basma mahmoud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:59:35