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

如何从Firestore的Map结构中提取数据?——获取Lat与Lng字段的技术咨询

解决Firestore Map结构中提取Lat和Lng的问题

首先看你打印的info结果,这是一个外层以数字为键、以包含坐标的子Map为值的嵌套Map,要提取每个子Map里的Lat和Lng其实很直接,我先帮你修正代码里的问题,再一步步拆解逻辑:

先修正代码里的明显错误

你这段代码里的泛型声明写错了:

final Map<"String", "dynamic"> map = info.values.elementAt(i);

类型参数不需要加引号,正确写法是Map<String, dynamic>;而且用索引遍历values不是最简洁的方式,直接遍历info.values会更直观。

另外你当前调用getRouteBetweenCoordinates时,起点和终点用了同一个坐标,这应该是笔误——如果要生成连续路线,应该用相邻站点的坐标对吧?不过先聚焦提取坐标的核心问题。

修正后的核心提取代码

void _getPolyline(info, infoID) async {
  // 直接遍历info的所有value(每个value都是包含Lat、Lng的子Map)
  for (var stopMap in info.values) {
    // 直接从子Map中取出Lat和Lng,注意键的大小写要和Firestore文档完全一致
    double lat = stopMap['Lat'] as double;
    double lng = stopMap['Lng'] as double;
    
    // 这里注意:建议把起点改成上一个站点的坐标,终点用当前站点坐标
    PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
      googleAPiKey,
      PointLatLng(lat, lng), // 可替换为上一个站点的坐标
      PointLatLng(lat, lng), // 当前站点坐标
      travelMode: TravelMode.driving,
    );
    
    result.points.forEach((PointLatLng point) {
      polylineCoordinates.add(LatLng(point.latitude, point.longitude));
    });
    _addPolyline();
  }
}

关键提取逻辑说明

  • 你的info本质是Map<int, Map<String, dynamic>>类型:外层键是数字索引,值是包含站点信息的子Map。info.values会直接返回所有子Map的集合。
  • 遍历info.values时,每个元素stopMap就是包含Lat、Lng、BName的子Map,用stopMap['Lat']就能直接取出对应值——一定要保证键的大小写和Firestore文档里完全匹配(比如你这里是大写的Lat/Lng,就不能写成小写的lat/lng)。
  • Firestore返回的数字可能是num类型,显式转成double可以避免潜在的类型错误:double lat = stopMap['Lat'] as double;。

额外优化:生成连续站点路线

如果你的需求是生成多个站点之间的连续路线,需要把上一个站点的坐标存起来作为下一次请求的起点,比如:

void _getPolyline(info, infoID) async {
  List<Map<String, dynamic>> stops = info.values.toList();
  if (stops.length < 2) return; // 至少需要两个站点才能生成路线
  
  for (var i = 0; i < stops.length - 1; i++) {
    double startLat = stops[i]['Lat'] as double;
    double startLng = stops[i]['Lng'] as double;
    double endLat = stops[i+1]['Lat'] as double;
    double endLng = stops[i+1]['Lng'] as double;
    
    PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
      googleAPiKey,
      PointLatLng(startLat, startLng),
      PointLatLng(endLat, endLng),
      travelMode: TravelMode.driving,
    );
    
    result.points.forEach((PointLatLng point) {
      polylineCoordinates.add(LatLng(point.latitude, point.longitude));
    });
  }
  _addPolyline(); // 最后统一添加路线,不用每次循环都调用
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:19:05