如何从Firebase实时数据库提取LiveTracker内的经纬度数据?
Firebase实时数据库公交位置数据解析问题
Firebase实时数据库中,
LiveTracker节点下存储着公交路线ID(如2、8),每个路线ID下是Firebase自动生成的ID,其内部包含latitude(纬度)和longitude(经度)数据。当前已获取到如下格式的数据:
{-NCQE5NU7ajW2L57gt1o: {latitude: -122.07730612330596, longitude: 37.41749912586621}, -NCQF6O3vx2NYVdZKD0X: {latitude: -122.083922, longitude: 37.4214938}, -NCQF6kWJPOyLuymJeXz: {latitude: -122.07730453282453, longitude: 37.417496832888055}, -NCQF5afZXRqg1Heb9Oq: {latitude: -122.07730562660478, longitude: 37.417495975114676}, -NCQDoU67-ZjN4kNEyPr: {latitude: -122.07730474508638, longitude: 37.41749751091001}}
尝试以下代码获取经纬度但无法解析:
_dbReference?.child("LiveTracker").child(passedId.toString()).onValue.listen((event) { var data = event.snapshot.value; print("This is data $data"); /* _markers.add(Marker( markerId: MarkerId(DateTime.now().toIso8601String()), position: LatLng(double.parse(event.snapshot.value.toString()), double.parse(event.snapshot.value.toString()))));*/ });
问题原因
你直接把整个snapshot.value转成字符串解析,这显然不对——因为snapshot.value是一个嵌套的Map结构,每个自动生成ID对应一个包含经纬度的子Map。
修复代码
把snapshot.value转成Map<String, dynamic>,然后遍历每个子项提取经纬度:
_dbReference?.child("LiveTracker").child(passedId.toString()).onValue.listen((event) { var data = event.snapshot.value as Map<String, dynamic>?; if (data != null) { // 清空旧标记(可选,避免重复添加) _markers.clear(); // 遍历每个公交位置数据 data.forEach((key, value) { double lat = (value['latitude'] as num).toDouble(); double lng = (value['longitude'] as num).toDouble(); _markers.add(Marker( markerId: MarkerId(key), // 用Firebase自动生成的ID作为标记ID,避免重复 position: LatLng(lat, lng), )); }); // 如果是Flutter地图组件,需要调用setState更新UI setState(() {}); } });
关键说明
- 把
snapshot.value强转为Map<String, dynamic>才能正确遍历每个自动生成的ID节点 - 经纬度数据在Firebase中可能以
num类型存储,需要转成double - 用Firebase自动生成的
key作为MarkerId,比用时间戳更可靠,避免重复标记 - 每次获取新数据后清空旧标记,再添加新标记,避免地图上堆积大量无效标记
内容的提问来源于stack exchange,提问作者saurav
相关产品推荐
相关产品推荐

