Flutter地图标记聚类插件markers_cluster_google_maps_flutter的使用

以下是关于 “Flutter 地图标记聚类插件 markers_cluster_google_maps_flutter 的使用” 的详细内容。该内容完全基于你提供的信息,并且提供了完整的示例代码。

markers_cluster_google_maps_flutter

Pub License GitHub code size in bytes

包用于在 Flutter 应用程序中的 Google 地图上聚类标记。

markers_cluster (1)

安装

要使用此插件,在 pubspec.yaml 文件中添加 markers_cluster_google_maps_flutter 作为依赖项。

使用

  1. 导入包:

    import 'package:markers_cluster_google_maps_flutter/markers_cluster_google_maps_flutter.dart';
    
  2. 初始化 MarkersClusterManager

    final clusterManager = MarkersClusterManager();
    
  3. 使用以下方法添加标记:

    clusterManager.addMarker();
    
  4. 在特定缩放级别更新集群:

    await clusterManager.updateClusters(zoomLevel: 12);
    
  5. 使用以下方法获取聚类标记:

    final clusteredMarkers = clusterManager.getClusteredMarkers();
    
  6. 在您的 GoogleMap 小部件中使用聚类标记:

    GoogleMap(
      mapType: MapType.normal,
      onMapCreated: (GoogleMapController controller) {
        // 完成控制器并更新集群
      },
      initialCameraPosition: CameraPosition(
        target: LatLng(33.6937, 73.0653),
        zoom: 10.0,
      ),
      onCameraMove: (CameraPosition position) {
        // 基于缩放级别更新集群
      },
      markers: Set<Marker>.of(clusteredMarkers),
    );
    

示例

class MarkersClusterExampleBasic extends StatefulWidget {
  const MarkersClusterExampleBasic({super.key});

  @override
  State<MarkersClusterExampleBasic> createState() => _MarkersClusterExampleBasicState();
}

class _MarkersClusterExampleBasicState extends State<MarkersClusterExampleBasic> {
  // 完成控制器以保存 GoogleMapController
  final Completer<GoogleMapController> _mapController = Completer<GoogleMapController>();
  // 自定义 MarkersClusterManager 的实例
  late MarkersClusterManager _clusterManager;
  // 地图的初始缩放级别
  double _currentZoom = 5.5;

  @override
  void initState() {
    super.initState();
    // 使用自定义设置初始化集群管理器
    _clusterManager = MarkersClusterManager(
      clusterMarkerSize: 35.0,
      clusterColor: Colors.blue,
      clusterBorderThickness: 4.0,
      clusterBorderColor: Colors.blue[900]!,
      clusterOpacity: 1.0,
      clusterTextStyle: TextStyle(fontSize: 15, color: Colors.white),
      onMarkerTap: (LatLng position) {
        _handleMarkerTap(position);
      },
    );
    // 向集群管理器添加初始标记
    _addMarkers();
  }

  // 添加不同城市的标记的函数
  void _addMarkers() {
    // 伊斯坦布尔的坐标
    List<LatLng> islamabadCoordinates = [
      LatLng(33.6844, 73.0479),
      LatLng(33.7070, 73.0551),
      LatLng(33.7215, 73.0433),
      LatLng(33.7398, 73.0372),
      LatLng(33.7380, 73.0845),
      LatLng(33.7029, 73.0591),
      LatLng(33.7297, 73.0735),
      LatLng(33.6826, 73.0606),
      LatLng(33.6913, 73.0383),
      LatLng(33.6786, 73.0320)
    ];

    // 拉合尔的坐标
    List<LatLng> lahoreCoordinates = [
      LatLng(31.5497, 74.3436),
      LatLng(31.5525, 74.3587),
      LatLng(31.5603, 74.3263),
      LatLng(31.5204, 74.3587),
      LatLng(31.5331, 74.3440),
      LatLng(31.5783, 74.3673),
      LatLng(31.5615, 74.3106),
      LatLng(31.5733, 74.3644),
      LatLng(31.5094, 74.3536),
      LatLng(31.5150, 74.3437)
    ];

    // 卡拉奇的坐标
    List<LatLng> karachiCoordinates = [
      LatLng(24.8607, 67.0011),
      LatLng(24.8701, 67.0234),
      LatLng(24.8472, 67.0322),
      LatLng(24.8952, 67.0280),
      LatLng(24.8615, 67.0099),
      LatLng(24.8846, 67.0681),
      LatLng(24.8595, 67.0425),
      LatLng(24.8731, 67.0212),
      LatLng(24.8683, 67.0301),
      LatLng(24.8865, 67.0512)
    ];

    // 白沙瓦的坐标
    List<LatLng> peshawarCoordinates = [
      LatLng(34.0124, 71.5785),
      LatLng(34.0125, 71.5786),
      LatLng(34.0126, 71.5787),
      LatLng(34.0167, 71.5249),
      LatLng(34.0222, 71.5760),
      LatLng(34.0059, 71.5374),
      LatLng(34.0077, 71.5718),
      LatLng(34.0161, 71.5357),
      LatLng(34.0033, 71.5444),
      LatLng(34.0195, 71.5651)
    ];

    // 奎达的坐标
    List<LatLng> quettaCoordinates = [
      LatLng(30.1798, 66.9750),
      LatLng(30.1916, 66.9904),
      LatLng(30.1738, 67.0040),
      LatLng(30.1623, 67.0098),
      LatLng(30.1425, 66.9978),
      LatLng(30.1964, 66.9466),
      LatLng(30.2092, 66.9212),
      LatLng(30.2189, 66.8999),
      LatLng(30.2362, 66.8741),
      LatLng(30.2523, 66.9112)
    ];

    // 为伊斯坦布尔添加标记
    for (var i = 0; i < islamabadCoordinates.length; i++) {
      _clusterManager.addMarker(Marker(
          markerId: MarkerId('islamabad_$i'),
          position: islamabadCoordinates[i],
          infoWindow: InfoWindow(title: '伊斯兰堡标记 $i')));
    }

    // 为拉合尔添加标记
    for (var i = 0; i < lahoreCoordinates.length; i++) {
      _clusterManager.addMarker(Marker(
          markerId: MarkerId('lahore_$i'),
          position: lahoreCoordinates[i],
          infoWindow: InfoWindow(title: '拉合尔标记 $i')));
    }

    // 为卡拉奇添加标记
    for (var i = 0; i < karachiCoordinates.length; i++) {
      _clusterManager.addMarker(Marker(
          markerId: MarkerId('karachi_$i'),
          position: karachiCoordinates[i],
          infoWindow: InfoWindow(title: '卡拉奇标记 $i')));
    }

    // 为白沙瓦添加标记
    for (var i = 0; i < peshawarCoordinates.length; i++) {
      _clusterManager.addMarker(Marker(
          markerId: MarkerId('peshawar_$i'),
          position: peshawarCoordinates[i],
          infoWindow: InfoWindow(title: '白沙瓦标记 $i')));
    }

    // 为奎达添加标记
    for (var i = 0; i < quettaCoordinates.length; i++) {
      _clusterManager.addMarker(Marker(
          markerId: MarkerId('quetta_$i'),
          position: quettaCoordinates[i],
          infoWindow: InfoWindow(title: '奎达标记 $i')));
    }
  }

  // 处理标记点击事件
  void _handleMarkerTap(LatLng position) async {
    // 添加你的标记点击处理代码
  }

  // 根据当前缩放级别更新集群
  Future<void> _updateClusters() async {
    await _clusterManager.updateClusters(zoomLevel: _currentZoom);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("标记聚类")),
      body: Stack(children: [
        GoogleMap(
          mapType: MapType.normal,
          onMapCreated: (GoogleMapController controller) async {
            _mapController.complete(controller);
            // 当地图创建时更新集群
            await _updateClusters();
          },
          initialCameraPosition: CameraPosition(
            target: LatLng(30.3753, 69.3451),
            zoom: _currentZoom,
          ),
          onCameraMove: (CameraPosition position) async {
            _currentZoom = position.zoom;
            // 当相机移动时更新集群
            debugPrint("当前缩放级别: ${_currentZoom}");
            await _updateClusters();
          },
          myLocationEnabled: true,
          compassEnabled: true,
          myLocationButtonEnabled: false,
          zoomControlsEnabled: false,
          markers: Set<Marker>.of(_clusterManager.getClusteredMarkers()),
        ),
      ]),
    );
  }
}

支持和贡献

对于支持,请在 GitHub 存储库中点赞。欢迎贡献!请在 GitHub 存储库中提交问题和拉取请求。


更多关于Flutter地图标记聚类插件markers_cluster_google_maps_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图标记聚类插件markers_cluster_google_maps_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


markers_cluster_google_maps_flutter 是一个用于 Flutter 的插件,它允许你在 Google 地图上显示标记,并根据缩放级别自动将这些标记聚类。这对于在地图上显示大量标记时非常有用,可以避免标记重叠,提升用户体验。

安装插件

首先,你需要在 pubspec.yaml 文件中添加插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  markers_cluster_google_maps_flutter: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装插件。

基本用法

以下是一个简单的示例,展示如何使用 markers_cluster_google_maps_flutter 插件来显示带有聚类功能的标记。

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:markers_cluster_google_maps_flutter/markers_cluster_google_maps_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MapScreen(),
    );
  }
}

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  GoogleMapController? mapController;
  final Set<Marker> markers = {};
  final ClusterManager clusterManager = ClusterManager();

  @override
  void initState() {
    super.initState();
    _addMarkers();
  }

  void _addMarkers() {
    final List<ClusterItem> items = [
      ClusterItem(LatLng(37.7749, -122.4194), 'San Francisco'),
      ClusterItem(LatLng(34.0522, -118.2437), 'Los Angeles'),
      ClusterItem(LatLng(36.1699, -115.1398), 'Las Vegas'),
      // 添加更多标记...
    ];

    clusterManager.setItems(items);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Marker Clustering Example'),
      ),
      body: GoogleMap(
        initialCameraPosition: CameraPosition(
          target: LatLng(37.7749, -122.4194),
          zoom: 10,
        ),
        markers: markers,
        onMapCreated: (GoogleMapController controller) {
          mapController = controller;
          clusterManager.setMapController(controller);
          clusterManager.updateMarkers();
        },
        onCameraMove: (CameraPosition position) {
          clusterManager.onCameraMove(position);
        },
      ),
    );
  }
}

关键点解释

  1. ClusterManager: 这是插件的核心类,负责管理标记的聚类。你可以通过 ClusterManager 来添加、更新和删除标记。

  2. ClusterItem: 这是表示单个标记的类。它包含标记的位置(LatLng)和可选的标题或其他信息。

  3. GoogleMap: 这是 Google 地图的 Widget。你需要将 ClusterManagerGoogleMapController 关联起来,以便在地图创建和移动时更新标记。

  4. onMapCreated: 当地图创建完成后,你需要将 GoogleMapController 传递给 ClusterManager,并调用 updateMarkers() 来初始化标记。

  5. onCameraMove: 当用户移动地图时,ClusterManager 会根据当前的缩放级别自动更新标记的聚类状态。

自定义标记和聚类图标

你可以通过 ClusterManager 的方法来自定义标记和聚类图标。例如:

clusterManager.setMarkerBuilder((ClusterItem item) {
  return Marker(
    markerId: MarkerId(item.title),
    position: item.position,
    infoWindow: InfoWindow(title: item.title),
    icon: BitmapDescriptor.defaultMarker,
  );
});

clusterManager.setClusterBuilder((Cluster cluster) {
  return Marker(
    markerId: MarkerId(cluster.getId()),
    position: cluster.getPosition(),
    icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed),
    infoWindow: InfoWindow(title: 'Cluster ${cluster.getSize()}'),
  );
});
回到顶部