Flutter地图点聚合插件flutter_map_radius_cluster的使用

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

Flutter 地图点聚合插件 flutter_map_radius_cluster 的使用

简介

flutter_map_radius_cluster 是一个用于 flutter_map 的聚类插件,支持在定义的半径内进行异步标记/聚类搜索。这个插件可以帮助你在地图上有效地管理和显示大量标记点,避免标记点过于密集导致的地图混乱。

注意事项

该插件是新的,API 可能在未来频繁更改,请注意更新和兼容性问题。

使用方法

  1. 添加依赖

    pubspec.yaml 文件中添加 flutter_mapflutter_map_radius_cluster 依赖:

    dependencies:
      flutter_map: any
      flutter_map_radius_cluster: any  # 或者使用 Pub 上的最新版本
    
  2. 配置 FlutterMap

    FlutterMap 中添加 RadiusClusterLayerWidget 并配置 RadiusClusterLayerOptions。以下是一个完整的示例代码:

    import 'package:flutter/material.dart';
    import 'package:flutter_map/flutter_map.dart';
    import 'package:flutter_map_radius_cluster/flutter_map_radius_cluster.dart';
    import 'package:latlong2/latlong.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Clustering Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: RadiusClusterLayerPage(),
        );
      }
    }
    
    class RadiusClusterLayerPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Radius Cluster Example'),
          ),
          body: FlutterMap(
            options: MapOptions(
              center: LatLng(51.5, -0.09),  // 初始地图中心点
              zoom: 5,  // 初始缩放级别
              maxZoom: 15,  // 最大缩放级别
            ),
            children: <Widget>[
              TileLayerWidget(  // 添加地图瓦片层
                options: TileLayerOptions(
                  urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
                  subdomains: ['a', 'b', 'c'],
                ),
              ),
              RadiusClusterLayerWidget(  // 添加聚类层
                options: RadiusClusterLayerOptions(
                  radiusInKm: 100.0,  // 聚类半径(单位:公里)
                  search: (radius, center) async {
                    // 这里可以实现自定义的标记点搜索逻辑
                    // 返回一个 List<Marker>,表示在指定半径内的标记点
                    return [
                      Marker(
                        point: LatLng(center.latitude + 0.1, center.longitude),
                        builder: (ctx) => Container(
                          child: Icon(Icons.location_on, color: Colors.red),
                        ),
                      ),
                      Marker(
                        point: LatLng(center.latitude - 0.1, center.longitude),
                        builder: (ctx) => Container(
                          child: Icon(Icons.location_on, color: Colors.red),
                        ),
                      ),
                    ];
                  },
                  clusterWidgetSize: const Size(40, 40),  // 聚类图标大小
                  anchor: AnchorPos.align(AnchorAlign.center),  // 聚类图标锚点位置
                  builder: (context, clusterData) {
                    // 自定义聚类图标
                    return Container(
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(20.0),
                        color: Colors.blue,
                      ),
                      child: Center(
                        child: Text(
                          clusterData.markerCount.toString(),  // 显示聚类中的标记点数量
                          style: TextStyle(color: Colors.white),
                        ),
                      ),
                    );
                  },
                ),
              ),
            ],
          ),
        );
      }
    }
    

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_map_radius_cluster插件的一个示例代码案例。这个插件允许你在Flutter的地图上实现点聚合功能。

首先,确保你的Flutter项目已经创建,并且已经添加了flutter_mapflutter_map_radius_cluster依赖。

1. 添加依赖

在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_map: ^10.2.0  # 请检查最新版本
  flutter_map_radius_cluster: ^0.3.0  # 请检查最新版本

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

2. 导入必要的包

在你的Dart文件中,导入必要的包:

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

3. 创建地图和聚合点

接下来,创建一个Flutter组件来显示地图和聚合点。以下是一个完整的示例:

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

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

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

class _MapScreenState extends State<MapScreen> {
  // 示例数据点
  List<LatLng> points = [
    LatLng(51.5, -0.1),
    LatLng(51.501, -0.101),
    LatLng(51.502, -0.102),
    LatLng(51.499, -0.099),
    LatLng(52.5, 13.4),  // 柏林
    LatLng(48.8566, 2.3522),  // 巴黎
  ];

  @override
  Widget build(BuildContext context) {
    return FlutterMap(
      options: MapOptions(
        center: LatLng(51.5, -0.1),
        zoom: 6.0,
      ),
      layers: [
        TileLayerOptions(
          urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
          subdomains: ['a', 'b', 'c'],
        ).toTileLayer(),
        MarkerClusterLayerOptions(
          points: points.map((point) => MarkerClusterPoint(
            location: point,
            builder: (context, cluster) {
              return Marker(
                point: cluster.location,
                builder: (ctx) => Container(
                  child: Text(
                    cluster.pointCount.toString(),
                    style: TextStyle(color: Colors.white, fontSize: 16),
                  ),
                  decoration: BoxDecoration(
                    color: Colors.blue.withOpacity(0.8),
                    borderRadius: BorderRadius.circular(10),
                  ),
                  padding: EdgeInsets.all(4),
                ),
              );
            },
          )).toMarkerClusterLayer(),
      ],
    );
  }
}

4. 运行应用

确保你的开发环境已经设置好,然后运行flutter run来启动应用。你应该能够在地图上看到聚合的点,并且当你放大地图时,聚合的点会分散开来。

这个示例展示了如何使用flutter_map_radius_cluster插件在Flutter应用中实现点聚合功能。你可以根据自己的需求进一步自定义和扩展这个示例。

回到顶部