当前位置:   article > 正文

Flutter Map:打造交互体验流畅的地图_flutter_map_marker_cluster

flutter_map_marker_cluster

一、什么是FlutterMap

FlutterMap是一个基于Flutter的在线地图插件,提供了丰富的地图数据源和交互方式,开发者可以轻松集成到自己的应用程序中。FlutterMap优秀的UI性能和地图渲染能力,为用户带来极致的滑动、缩放体验。

二、FlutterMap的使用

FlutterMap的使用十分简单,首先,在你的项目中加入flutter_map和相关依赖

  1. dependencies:
  2. flutter_map: ^0.12.0
  3. flutter_map_marker_cluster: ^0.3.0
  4. leaflet: ^1.2.0
  5. geolocator: ^6.0.0+1

接着,初始化leaflet插件并指定地图位置和视图:

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_map/flutter_map.dart';
  3. import 'package:latlong/latlong.dart';
  4. void main() {
  5. runApp(MaterialApp(
  6. home: Scaffold(
  7. body: FlutterMap(
  8. options: MapOptions(
  9. center: LatLng(51.5, -0.09),
  10. zoom: 13.0,
  11. ),
  12. layers: [
  13. TileLayerOptions(
  14. urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
  15. subdomains: ['a', 'b', 'c'],
  16. ),
  17. ],
  18. ),
  19. ),
  20. ));
  21. }

以上代码使用了OpenStreetMaps地图数据,可以切换为谷歌地图等其他在线地图数据源,在TileLayerOptions中设置即可。

三、FlutterMap的高级应用

1、地图标记

FlutterMap提供了多种标记的类型和自定义功能,支持在地图上添加自定义标记,实现定制化的描点效果。例如,我们可以通过FlutterMapMarkerCluster扩展插件实现聚合标记效果:

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_map/flutter_map.dart';
  3. import 'package:flutter_map_marker_cluster/flutter_map_marker_cluster.dart';
  4. import 'package:latlong/latlong.dart';
  5. void main() {
  6. var markers = [
  7. Marker(
  8. width: 80.0,
  9. height: 80.0,
  10. point: LatLng(51.5, -0.09),
  11. builder: (ctx) => FlutterLogo()),
  12. //...
  13. ];
  14. runApp(MaterialApp(
  15. home: Scaffold(
  16. body: FlutterMap(
  17. options: MapOptions(
  18. center: LatLng(51.5, -0.09),
  19. zoom: 13.0,
  20. ),
  21. layers: [
  22. TileLayerOptions(
  23. urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
  24. subdomains: ['a', 'b', 'c'],
  25. ),
  26. MarkerClusterLayerOptions(
  27. maxClusterRadius: 120,
  28. size: Size(40, 40),
  29. markers: markers,
  30. polygonOptions: PolygonOptions(
  31. borderColor: Colors.blueAccent,
  32. color: Colors.black12,
  33. borderStrokeWidth: 3),
  34. clusterBuilder: (BuildContext context, LatLng latLng,
  35. List markers) {
  36. return Container();
  37. },
  38. ),
  39. ],
  40. ),
  41. ),
  42. ));
  43. }

2、地图交互

FlutterMap提供了多种地图交互方式,包括拖拽、缩放、双击、长按等操作。其中,地图缩放的实现方式非常简单,只需要在MapOptions中设置minZoom和maxZoom即可实现地图缩放范围的限制,在此基础上加入手势检测来实现手势缩放效果:

  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_map/flutter_map.dart';
  3. import 'package:latlong/latlong.dart';
  4. void main() {
  5. var controller = MapController();
  6. var minZoom = 10.0;
  7. var maxZoom = 19.0;
  8. var initialZoom = 11.0;
  9. var center = LatLng(51.5, -0.09);
  10. void onChangedMapZoom() {
  11. if (controller.zoom <= minZoom) {
  12. controller.move(center, minZoom);
  13. } else if (controller.zoom >= maxZoom) {
  14. controller.move(center, maxZoom);
  15. }
  16. }
  17. runApp(MaterialApp(
  18. home: Scaffold(
  19. body: GestureDetector(
  20. child: FlutterMap(
  21. mapController: controller,
  22. options: MapOptions(
  23. center: center,
  24. zoom: initialZoom,
  25. onPositionChanged: (_) => onChangedMapZoom(),
  26. minZoom: minZoom,
  27. maxZoom: maxZoom,
  28. ),
  29. layers: [
  30. TileLayerOptions(
  31. urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
  32. subdomains: ['a', 'b', 'c'],
  33. ),
  34. ],
  35. ),
  36. onScaleStart: (_) {
  37. controller.drag(false);
  38. },
  39. onScaleUpdate: (ScaleUpdateDetails details) {
  40. var zoom = controller.zoom - details.scale + 1;
  41. controller.move(details.focal, zoom);
  42. },
  43. onScaleEnd: (_) {
  44. controller.drag(true);
  45. },
  46. ),
  47. ),
  48. ));
  49. }

3、实时导航

FlutterMap提供了路线规划和导航的功能,支持路径规划和实时导航的实现。下面展示了如何使用FlutterMap和geolocator插件实现实时导航:

  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_map/flutter_map.dart';
  4. import 'package:geolocator/geolocator.dart';
  5. import 'package:latlong/latlong.dart';
  6. void main() {
  7. runApp(MaterialApp(home: Scaffold(body: NavigationMap())));
  8. }
  9. class NavigationMap extends StatefulWidget {
  10. @override
  11. _NavigationMapState createState() => _NavigationMapState();
  12. }
  13. class _NavigationMapState extends State {
  14. var _positionStream = StreamController();
  15. @override
  16. void initState() {
  17. Geolocator.getPositionStream().listen((position) {
  18. _positionStream.add(LatLng(position.latitude, position.longitude));
  19. });
  20. super.initState();
  21. }
  22. @override
  23. dispose() {
  24. _positionStream.close();
  25. super.dispose();
  26. }
  27. @override
  28. Widget build(BuildContext context) {
  29. return FlutterMap(
  30. options: MapOptions(
  31. center: LatLng(51.5, -0.09),
  32. zoom: 13.0,
  33. ),
  34. layers: [
  35. TileLayerOptions(
  36. urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
  37. subdomains: ['a', 'b', 'c'],
  38. ),
  39. PolylineLayerOptions(
  40. polylines: [
  41. Polyline(
  42. points: _positionStream.stream,
  43. color: Colors.redAccent,
  44. ),
  45. ],
  46. ),
  47. MarkerLayerOptions(
  48. markers: [
  49. Marker(
  50. width: 80.0,
  51. height: 80.0,
  52. point: LatLng(51.5, -0.09),
  53. builder: (ctx) => Icon(Icons.location_on),
  54. ),
  55. ],
  56. ),
  57. ],
  58. );
  59. }
  60. }

四、总结

FlutterMap提供了对地图相关的一些丰富操作,使用FlutterMap可以帮助开发者轻松并高效地开发地图交互相关的应用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/383142
推荐阅读
相关标签
  

闽ICP备14008679号