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

使用BingMapsRESTToolkit计算两地距离时缺少最终步骤求助

解决BingMapsRESTToolkit获取两地距离的问题

你离成功真的只差一步!核心误区在于:DistanceMatrixRequest.Execute()方法返回的是DistanceMatrixResponse响应对象,所有距离数据都存在这个返回值里,而非原请求对象dm中。另外你遇到的调试时await后莫名跳出方法的情况,大概率是请求过程中抛出了未被捕获的异常(比如密钥无效、网络问题、地址解析失败等)。

下面是修正后的完整代码,我会拆解关键要点:

async Task<double> CalculateDistanceWithBingAPI(string from, string to, DataRow row)
{
    double result = 0;
    try
    {
        var dm = new DistanceMatrixRequest();
        dm.BingMapsKey = Settings.BingKey;
        dm.TravelMode = TravelModeType.Truck;
        // 简化集合初始化写法
        dm.Origins = new List<SimpleWaypoint> { new SimpleWaypoint(from) };
        dm.Destinations = new List<SimpleWaypoint> { new SimpleWaypoint(to) };

        // 重点:接收Execute()返回的响应对象,这才是存储结果的地方
        var response = await dm.Execute();

        // 逐层验证响应的有效性,避免空引用异常
        if (response.StatusCode == System.Net.HttpStatusCode.OK 
            && response.ResourceSets != null 
            && response.ResourceSets.Any()
            && response.ResourceSets.First().Resources != null
            && response.ResourceSets.First().Resources.Any())
        {
            // 因为你只传了1个起点和1个终点,直接取第一个结果即可
            var distanceMatrix = response.ResourceSets.First().Resources.First() as DistanceMatrix;
            if (distanceMatrix != null && distanceMatrix.Rows.Any() && distanceMatrix.Rows.First().Elements.Any())
            {
                var distanceElement = distanceMatrix.Rows.First().Elements.First();
                // TravelDistance默认单位是公里,可根据需求转换(比如转英里)
                result = distanceElement.TravelDistance;
                row["Distance"] = result;
            }
        }
        else
        {
            // 处理请求失败场景,打印错误信息便于排查
            Console.WriteLine($"请求失败: {response.StatusDescription}");
        }
    }
    catch (Exception ex)
    {
        // 捕获异常,避免调试时莫名跳出方法,同时记录错误信息
        Console.WriteLine($"计算距离时出错: {ex.Message}");
        // 这里也可以添加日志记录逻辑
    }
    return result;
}

关键细节说明:

  • 响应层级结构:Bing Maps距离矩阵的响应是嵌套结构:ResourceSets → Resources(类型为DistanceMatrix) → Rows → Elements,每个Element包含TravelDistance(距离)、TravelDuration(行驶时长)等核心属性。
  • 异常处理:添加try-catch能捕获所有潜在异常(比如网络波动、密钥错误),调试时就不会再出现await后直接跳出方法的情况。
  • 空值校验:逐层做空值验证很重要,毕竟API响应可能因地址无法解析、配额不足等原因返回不完整数据。

另外调试小技巧:如果还是遇到异常未捕获的情况,可以在Visual Studio中按Ctrl+Alt+E打开异常设置,勾选「Common Language Runtime Exceptions」,这样就能捕获所有未处理的异常,快速定位问题根源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:54:51