如何在谷歌地图上添加多个标记

Posted

技术标签:

【中文标题】如何在谷歌地图上添加多个标记【英文标题】:How to add multiple markers on the google map 【发布时间】:2021-09-12 07:14:33 【问题描述】:

我正在尝试从从 firebase 读取的坐标中添加多个标记。它读取所有坐标并存储在列表中。我创建了 addMarker 函数来将标记添加到地图中。但它只打印一个标记,读取最后一个标记坐标。谁能帮我解决这个问题,因为我是新手。

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'dart:async';

class HomePage extends StatefulWidget 
  @override
  _HomePageState createState() => _HomePageState();


class _HomePageState extends State<HomePage> 
  final textcontroller = TextEditingController();
  final databaseRef = FirebaseDatabase.instance.reference();
  Completer<GoogleMapController> _controller = Completer();
  Map<MarkerId, Marker> markers = <MarkerId, Marker>;

  double latitude = 0;
  double longitude = 0;
  var myList = [];
  List<LatLng> list = [];

  void initState() 
    super.initState();
    setState(() 
      firebaseRead();
    );
  

  void firebaseRead() 
    databaseRef.child('Locations').onValue.listen((Event event) 
      myList = event.snapshot.value;

      setState(() 
        for (int x = 0; x < myList.length; x++) 
          double latitude = myList[x]['lat'];
          double longitude = myList[x]['long'];
          LatLng location = new LatLng(latitude, longitude);
          if (list.contains(location)) 
            list.clear();
            list.add(location);
           else 
            list.add(location);
          

          addMarker(list[x]);
        
      );

    );
    //print(list);
  

  void addMarker(loc) 
    final MarkerId markerId = MarkerId('Marker 1');

    final Marker marker = Marker(
      markerId: markerId,
      position: LatLng(loc.latitude, loc.longitude),
      infoWindow: InfoWindow(title: 'test'),
    );

    setState(() 
      // adding a new marker to map
      markers[markerId] = marker;
      //print(marker);
    );
  

  @override
  Widget build(BuildContext context) 
      return Scaffold(
      appBar: AppBar(
        title: Text("Firebase Demo"),
      ),
      body: GoogleMap(
        mapType: MapType.normal,
        markers: Set.of(markers.values),
        initialCameraPosition:
            CameraPosition(target: LatLng(6.9271, 79.8612), zoom: 15),
        onMapCreated: (GoogleMapController controller) 
          _controller.complete(controller);
        ,
      ),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: () 
          firebaseRead();
        ,
        label: const Text('Refresh'),
        icon: const Icon(Icons.refresh),
        backgroundColor: Colors.blueAccent,
      ),
    );
  


【问题讨论】:

这是因为您只有一个MarkerId,所以在调用markers[markerId] = marker; 后,地图markers 将始终只有一个项目 你能告诉我为所有坐标点添加markerId的方法吗? final MarkerId markerId = MarkerId(loc.toString()); 也许? (假设loc.toString() 返回有效的唯一String 谢谢。它有效。 【参考方案1】:

我正在使用google_maps_flutter: ^0.5.30这个版本你可以这样做this:-

List<Marker> _markers = <Marker>[];

for(var track in myList)
        if(track["latitude"] != "" && track["latitude"] != "null")
          _markers.add(Marker(markerId: MarkerId(myList.indexOf(track).toString()),
              position: LatLng(double.parse(track["latitude"]), double.parse(track["longitude"])),
              infoWindow: InfoWindow(title: track["Name"])));
        
      
      
      
      GoogleMap(
          initialCameraPosition: CameraPosition(
              target: latitude == null && longitude == null
                  ? LatLng(23.022505, 72.571365)
                  : LatLng(latitude, longitude)),
          mapType: MapType.normal,
          markers: Set<Marker>.of(_markers),
          onMapCreated: _onMapCreated,
          myLocationEnabled: true,
        )

【讨论】:

【参考方案2】:

您总是使用单个 markerId,这意味着您正在用下一个标记覆盖前一个标记,这就是为什么总是只有一个。

对于动态标记列表,您必须传递动态markerId。看,修改后的代码如下:

void firebaseRead() 
    databaseRef.child('Locations').onValue.listen((Event event) 
        myList = event.snapshot.value;
        setState(() 
            for (int x = 0; x < myList.length; x++) 
              double latitude = myList[x]['lat'];
              double longitude = myList[x]['long'];
              LatLng location = new LatLng(latitude, longitude);
              if (list.contains(location)) 
                 list.clear();
                  list.add(location);
               else 
                  list.add(location);
              

              //Passing a dynamic marker id as the index here.
              addMarker(list[x], x);
            
        );
    );
    //print(list);


//Adding Index here as an argument
void addMarker(loc, index) 
    //Making this markerId dynamic
    final MarkerId markerId = MarkerId('Marker $index');

    final Marker marker = Marker(
       markerId: markerId,
       position: LatLng(loc.latitude, loc.longitude),
       infoWindow: InfoWindow(title: 'test'),
    );

    setState(() 
      // adding a new marker to map
      markers[markerId] = marker;
      //print(marker);
    );

在这段代码中,index 的更改取自 for 循环并传递给 markerId,所以现在,markerId 对于从 firebaseRead() 传递的每个标记都将不同。

【讨论】:

以上是关于如何在谷歌地图上添加多个标记的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌地图android上设置多个标记?

我们如何在谷歌地图中添加带有点击事件的多个标记? [复制]

怎么在谷歌地图上做标记呀

如何在谷歌地图的标记中添加多个位图图标?

无法在谷歌地图中添加多个标记(颤振)

如何在谷歌地图上显示多个信息窗口?