如何从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
相关产品推荐
相关产品推荐

