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

发布于 1周前 作者 nodeper 来自 Flutter

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

简介

flutter_map_marker_cluster 是一个用于Flutter应用程序的Dart实现,它为地图上的标记提供聚类功能。该插件基于流行的Leaflet.markercluster,并且是flutter_map包的一个扩展插件。

使用方法

添加依赖项

首先,在您的 pubspec.yaml 文件中添加 flutter_mapflutter_map_marker_cluster 依赖项:

dependencies:
  flutter_map: any
  flutter_map_marker_cluster: any # 或者使用Pub上最新的版本

然后运行 flutter pub get 来安装这些包。

实现代码

在您的 Dart 文件中,通过以下方式来创建一个带有聚类功能的地图:

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_marker_cluster/flutter_map_marker_cluster.dart';
import 'package:latlong2/latlong.dart';

class ClusteringManyMarkersPage extends StatelessWidget {
  static const String route = '/clustering-many-markers-page';

  // 示例数据:这里我们创建一些随机位置的标记
  final List<Marker> markers = [
    Marker(
      point: LatLng(51.5, -0.09),
      builder: (ctx) => const Icon(Icons.location_on, color: Colors.red),
    ),
    Marker(
      point: LatLng(51.51, -0.08),
      builder: (ctx) => const Icon(Icons.location_on, color: Colors.red),
    ),
    Marker(
      point: LatLng(51.49, -0.1),
      builder: (ctx) => const Icon(Icons.location_on, color: Colors.red),
    ),
    // ...更多标记...
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Clustering Many Markers Page')),
      body: FlutterMap(
        options: MapOptions(
          center: LatLng((51.5 + 51.49) / 2, (-0.09 + -0.1) / 2), // 中心点计算
          zoom: 13,
          maxZoom: 15,
        ),
        children: <Widget>[
          TileLayer(
            urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
            subdomains: ['a', 'b', 'c'],
          ),
          MarkerClusterLayerWidget(
            options: MarkerClusterLayerOptions(
              maxClusterRadius: 120, // 聚类的最大半径
              size: const Size(40, 40), // 单个聚类项的大小
              padding: const EdgeInsets.all(10), // 内边距
              maxZoom: 15, // 最大缩放级别
              markers: markers, // 标记列表
              builder: (context, markers) {
                return Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(20),
                    color: Colors.blue,
                  ),
                  child: Center(
                    child: Text(
                      markers.length.toString(),
                      style: const TextStyle(color: Colors.white),
                    ),
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

上面的代码片段展示了如何设置一个包含多个标记的地图,并启用标记聚类功能。当用户缩放或平移地图时,靠近的标记会自动合并成一个聚类图标,显示附近有多少个标记。随着用户进一步放大地图,聚类将解散并展示单独的标记。

运行示例

为了更直观地了解这个插件的功能,您可以查看项目中的 example/ 文件夹,那里有一个完整的示例应用程序可以运行。克隆仓库后,只需导航到 example 目录并执行 flutter run 命令即可启动示例应用。


希望这份指南能够帮助您快速入门 flutter_map_marker_cluster 插件。如果您有任何问题或者需要更多的帮助,请随时查阅官方文档或访问GitHub页面获取更多信息。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用flutter_map_marker_cluster插件的示例代码。这个插件允许你在Flutter应用中的地图上实现标记的聚类功能。

首先,确保你已经在你的pubspec.yaml文件中添加了flutter_mapflutter_map_marker_cluster的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_map: ^0.x.x  # 请使用最新版本
  flutter_map_marker_cluster: ^0.x.x  # 请使用最新版本

然后,运行flutter pub get来安装这些依赖。

以下是一个完整的示例代码,展示了如何使用flutter_map_marker_cluster在地图上添加并聚类标记:

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:flutter_map_marker_cluster/flutter_map_marker_cluster.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Map Marker Cluster Example'),
        ),
        body: MapScreen(),
      ),
    );
  }
}

class MapScreen extends StatelessWidget {
  final List<LatLng> markers = [
    LatLng(51.5, -0.1),
    LatLng(51.501, -0.101),
    LatLng(51.502, -0.102),
    LatLng(51.499, -0.099),
    LatLng(51.4, -0.2),
    LatLng(51.6, -0.3),
    // 添加更多标记以查看聚类效果
  ];

  @override
  Widget build(BuildContext context) {
    return FlutterMap(
      options: MapOptions(
        center: LatLng(51.5, -0.1),
        zoom: 10.0,
      ),
      layers: [
        TileLayerOptions(
          urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
          subdomains: ['a', 'b', 'c'],
        ).build(),
        MarkerClusterLayerOptions(
          markers: markers.map((marker) => Marker(
            point: marker,
            builder: (ctx, marker) => Container(
              child: Icon(
                Icons.location_on,
                color: Colors.red,
              ),
            ),
          )).toList(),
          maxClusterRadius: 50,  // 最大聚类半径
          spiderfyDistanceMultiplier: 1.5,  // 蜘蛛网效果的距离倍数
          spiderfyOnMaxZoom: true,  // 在最大缩放级别上是否启用蜘蛛网效果
          popupOptions: PopupOptions(
            closeButton: true,
            offset: Offset(0, -10),
            builder: (ctx, marker) {
              return Container(
                padding: EdgeInsets.all(8.0),
                color: Colors.white,
                child: Text('Marker at ${marker.point.latitude}, ${marker.point.longitude}'),
              );
            },
          ),
        ).build(),
      ],
    );
  }
}

在这个示例中:

  1. 我们首先定义了markers列表,其中包含一些LatLng对象,这些对象表示地图上的标记位置。
  2. FlutterMap组件中,我们设置了地图的中心点和缩放级别。
  3. 我们添加了两个图层:一个是瓦片图层(TileLayer),用于显示地图背景;另一个是标记聚类图层(MarkerClusterLayer),用于显示和聚类标记。
  4. MarkerClusterLayerOptions中,我们设置了标记列表、最大聚类半径、蜘蛛网效果的距离倍数、是否在最大缩放级别上启用蜘蛛网效果以及弹出窗口选项。

运行这个示例,你将看到一个包含聚类标记的地图。当你缩放地图时,标记将根据它们的接近程度进行聚类或分散显示。

回到顶部