#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)