Flutter Firebase clustering_google_maps

#google-maps #dart #flutter

#google-карты #dart #флаттер

Вопрос:

Цель состоит в том, чтобы создавать маркеры Google map с использованием кластеров из информации в памяти. В настоящее время я загружаю точки LATLNG из Firebase в локальную память. Затем цель состоит в том, чтобы отобразить эти коллекции точек на карте в приложении Flutter, используя функцию кластеризации Google Maps. Для достижения этой цели существует вызываемая зависимость clustering_google_maps 0.0.4 2 , которая обеспечивает доступ к данным из локальной базы данных (SQLite) или из локальной памяти.

Разработчик рекомендует использовать локальную базу данных (SQLite) с большими наборами маркеров в тысячах. В моем случае у меня всего 20-40 маркеров. Может кто-нибудь помочь предоставить решение, объясняющее, как можно использовать данные из локальной памяти для отображения на карте Google?

Краткий пример из репозитория

 class HomeScreen extends StatefulWidget {
  final List<LatLngAndGeohash> list;

  HomeScreen({Key key, this.list}) : super(key: key);

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  ClusteringHelper clusteringHelper;
  final CameraPosition initialCameraPosition =
      CameraPosition(target: LatLng(0.000000, 0.000000), zoom: 0.0);

  Set<Marker> markers = Set();

  void _onMapCreated(GoogleMapController mapController) async {
    print("onMapCreated");
    if (widget.list == null) {
      clusteringHelper.database = await AppDatabase.get().getDb();
    }
    clusteringHelper.updateMap();
  }

  updateMarkers(Set<Marker> markers) {
    setState(() {
      this.markers = markers;
    });
  }

  @override
  void initState() {
    if (widget.list != null) {
      initMemoryClustering();
    } else {
      initDatabaseClustering();
    }

    super.initState();
  }

  // For db solution
  initDatabaseClustering() {
    clusteringHelper = ClusteringHelper.forDB(
      dbGeohashColumn: FakePoint.dbGeohash,
      dbLatColumn: FakePoint.dbLat,
      dbLongColumn: FakePoint.dbLong,
      dbTable: FakePoint.tblFakePoints,
      updateMarkers: updateMarkers,
    );
  }

  // For memory solution
  initMemoryClustering() {
    clusteringHelper = ClusteringHelper.forMemory(
      list: widget.list,
      updateMarkers: updateMarkers,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Clustering Example"),
      ),
      body: GoogleMap(
        onMapCreated: _onMapCreated,
        initialCameraPosition: initialCameraPosition,
        markers: markers,
        onCameraMove: (newPosition) => clusteringHelper.onCameraMove(newPosition, forceUpdate: false),
        onCameraIdle: clusteringHelper.onMapIdle,
      ),
      floatingActionButton: FloatingActionButton(
        child:
            widget.list == null ? Icon(Icons.content_cut) : Icon(Icons.update),
        onPressed: () {
          if (widget.list == null) {
            clusteringHelper.whereClause = "WHERE ${FakePoint.dbLat} > 42.6";
            clusteringHelper.updateMap();
          } else {
            clusteringHelper.updateMap();
          }
        },
      ),
    );
  }
}
  

Комментарии:

1. Я представлю эту функцию в следующем выпуске следите за обновлениями!

Ответ №1:

Из документов

ДЛЯ правильной работы МЕТОДА ПАМЯТИ у вас должен быть список объектов LatLngAndGeohash. LatLngAndGeohash — это простой объект со свойством Location и Geohash, последнее генерируется автоматически; вам нужно только местоположение точки.

Для этого решения вы должны использовать конструктор ПАМЯТИ ClusteringHelper:

 ClusteringHelper.forMemory(...);
  

Чтобы протестировать эту функцию, вы можете клонировать репозиторий giandifra / clustering_google_maps. Затем измените файл splash.dart, используя следующий код. при вызове рабочего стола из splash.dart

   List<LatLngAndGeohash> markerList = new List<LatLngAndGeohash>();

  @override
  void initState() {
    super.initState();
    markerList.add(LatLngAndGeohash(LatLng(34.0522, -118.2437)));
    markerList.add(LatLngAndGeohash(LatLng(34.0522, -118.2647)));
    markerList.add(LatLngAndGeohash(LatLng(34.0522, -118.2467)));
    markerList.add(LatLngAndGeohash(LatLng(34.0522, -118.2487)));
    markerList.add(LatLngAndGeohash(LatLng(34.0522, -118.2707)));
  }

 @override
   Widget build(BuildContext context) {
     return Scaffold(
        ....
        HomeScreen(list: markerList)