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

Flutter中如何从Google Distance API的JSON提取多点间距离与时长

解决Google Distance API多点间距离/时长提取问题

Google Distance Matrix API的返回结构里,rows数组对应每个起点,每个row下的elements数组则是该起点到所有终点的距离、时长数据。你之前只取了rows[0],自然只能拿到第一个起点的结果,要获取所有多点间的数据,得遍历整个rows数组,再逐个遍历每个row里的elements。

基础遍历示例(直接提取数据)

假设你已经将API响应解码为Map<String, dynamic>类型的jsonResponse:

// 取出所有起点对应的rows数组
List<dynamic> rows = jsonResponse['rows'];

// 遍历每个起点的row
for (var row in rows) {
  // 取出当前起点到所有终点的elements数组
  List<dynamic> elements = row['elements'];
  
  // 遍历每个终点对应的元素
  for (var element in elements) {
    // 先判断接口返回状态是否正常,避免空指针
    if (element['status'] == 'OK') {
      // 提取距离的文本(如"10 km")和数值(如10000,单位米)
      String distanceText = element['distance']['text'];
      int distanceMeters = element['distance']['value'];
      
      // 提取时长的文本(如"15 mins")和数值(如900,单位秒)
      String durationText = element['duration']['text'];
      int durationSeconds = element['duration']['value'];
      
      // 这里可以把数据存到列表、模型类,或者直接使用
      print('距离:$distanceText,时长:$durationText');
    } else {
      print('该点对无法获取数据:${element['status']}');
    }
  }
}

用模型类管理数据(更规范)

如果数据量大,建议用自定义模型类来封装数据,避免重复代码:

// 定义模型类
class RouteInfo {
  final String distanceText;
  final int distanceMeters;
  final String durationText;
  final int durationSeconds;

  RouteInfo({
    required this.distanceText,
    required this.distanceMeters,
    required this.durationText,
    required this.durationSeconds,
  });

  // 从JSON元素转成模型
  factory RouteInfo.fromJson(Map<String, dynamic> json) {
    return RouteInfo(
      distanceText: json['distance']['text'],
      distanceMeters: json['distance']['value'],
      durationText: json['duration']['text'],
      durationSeconds: json['duration']['value'],
    );
  }
}

然后用模型类批量处理数据:

List<List<RouteInfo>> allRouteData = [];
List<dynamic> rows = jsonResponse['rows'];

for (var row in rows) {
  List<dynamic> elements = row['elements'];
  // 把当前row的所有element转成模型,存入列表
  List<RouteInfo> singleStartPointData = elements
      .where((e) => e['status'] == 'OK') // 过滤异常数据
      .map((e) => RouteInfo.fromJson(e))
      .toList();
  allRouteData.add(singleStartPointData);
}

// 使用时,allRouteData[i][j] 表示第i个起点到第j个终点的路线数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:15:41