Flutter地图路线规划插件flutter_map_directions的使用

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

Flutter地图路线规划插件flutter_map_directions的使用

插件介绍

flutter_map_directions 是一个用于在Flutter应用中显示坐标之间路线的插件。它与 flutter_map 插件结合使用,可以动态地绘制从一个点到另一个点的路线。

安装插件

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

dependencies:
  flutter_map_directions: any // 或最新版本

使用示例代码

下面是一个完整的示例代码,展示了如何在Flutter应用中使用 flutter_map_directions 插件来显示路线。

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Map Directions Example'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  String _message = 'Finding route...';

  List<DirectionCoordinate> _coordinates = [];
  final MapController _mapController = MapController();
  final DirectionController _directionController = DirectionController();

  [@override](/user/override)
  void initState() {
    _loadNewRoute();
    super.initState();
  }

  void _loadNewRoute() async {
    await Future.delayed(const Duration(seconds: 5));
    _coordinates = [
      DirectionCoordinate(1, (lat, lng) => LatLng(lat, lng)),
    ];
    final bounds = LatLngBounds.fromPoints(
      _coordinates.map((location) {
        return LatLng(location.latitude, location.longitude);
      }).toList()
    );
    _mapController.fitCamera(CameraFit.bounds(bounds: bounds, padding: EdgeInsets.all(50)));
    _directionController.updateDirection(_coordinates);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          FlutterMap(
            mapController: _mapController,
            options: const MapOptions(
              initialCenter: LatLng(1, (lat, lng) => LatLng(lat, lng)),
            ),
            children: [
              TileLayer(
                urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
              ),
              MarkerLayer(
                markers: _coordinates.map((location) {
                  return Marker(
                    point: LatLng(location.latitude, location.longitude),
                    width: 35,
                    height: 35,
                    child: const Icon(
                      Icons.location_pin,
                    ),
                    alignment: Alignment.topCenter,
                  );
                }).toList()
              ),
              DirectionsLayer(
                coordinates: _coordinates,
                color: Colors.deepOrange,
                onCompleted: (routes) =&gt; _updateMessage(routes),
                controller: _directionController,
              ),
            ],
          ),
          Align(
            alignment: Alignment.bottomCenter,
            child: Container(
              padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 1),
              margin: const EdgeInsets.only(bottom: 20),
              decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.circular(40)
              ),
              child: Text(_message),
            ),
          ),
        ],
      )
    );
  }

  void _updateMessage(List&lt;OsrmRoute&gt; routes) {
    if (_coordinates.length &lt; 2) return;

    setState(() {
      _message = routes.isNotEmpty ? 'Found route' : 'No route found';
    });
  }
}

更多关于Flutter地图路线规划插件flutter_map_directions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图路线规划插件flutter_map_directions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter地图路线规划插件flutter_map_directions的示例代码。这个示例将展示如何在Flutter应用中集成flutter_map_directions插件,并显示从一个地点到另一个地点的路线。

首先,确保你的Flutter项目已经添加了对flutter_mapflutter_map_directions的依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_map: ^0.14.0 # 请检查最新版本
  flutter_map_directions: ^2.0.0 # 请检查最新版本
  latlong2: ^0.8.0 # flutter_map_directions 的依赖之一

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

接下来,创建一个Flutter页面来展示地图和路线规划。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_directions/flutter_map_directions.dart';
import 'package:latlong2/latlong2.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> {
  MapController _mapController;
  List<LatLng> _routeCoordinates;

  @override
  void initState() {
    super.initState();
    _mapController = MapController();
    _routeCoordinates = [];

    // 示例起点和终点
    LatLng start = LatLng(51.5074, 0.1278); // 伦敦的一个地点
    LatLng end = LatLng(52.5200, 13.4049); // 柏林的一个地点

    // 获取路线
    _getDirections(start, end);
  }

  Future<void> _getDirections(LatLng start, LatLng end) async {
    final directions = Directions(
      apiKey: 'YOUR_GOOGLE_MAPS_API_KEY', // 请替换为你的Google Maps API Key
      waypoints: [start, end],
      mode: TravelMode.driving,
    );

    try {
      final result = await directions.calculate();
      if (mounted) {
        setState(() {
          _routeCoordinates = result.routes.first.legs.first.steps
              .expand((step) => step.polyline.points)
              .toList();
        });
      }
    } catch (e) {
      print('Error getting directions: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Map Directions Example'),
      ),
      body: FlutterMap(
        mapController: _mapController,
        options: MapOptions(
          center: LatLng(51.5, 0.1), // 初始中心点
          zoom: 5.0,
        ),
        layers: [
          TileLayerOptions(
            urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
            subdomains: ['a', 'b', 'c'],
          ),
          if (_routeCoordinates.isNotEmpty)
            PolylineLayerOptions(
              polylines: [
                Polyline(
                  points: _routeCoordinates,
                  strokeWidth: 4.0,
                  color: Colors.blue,
                ),
              ],
            ),
        ],
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml中添加了flutter_mapflutter_map_directions的依赖。
  2. 创建了一个Flutter应用,其中包含一个MapScreen页面。
  3. MapScreen页面的initState方法中,初始化了MapController,并定义了起点和终点。
  4. 使用flutter_map_directions插件的Directions类来获取从起点到终点的路线。
  5. 如果成功获取到路线,将其坐标存储在_routeCoordinates列表中,并在地图上显示路线。

请注意,你需要替换YOUR_GOOGLE_MAPS_API_KEY为你的实际Google Maps API Key。如果没有API Key,你可以从Google Cloud Platform获取一个。

这个示例应该能帮助你开始在Flutter应用中集成和使用flutter_map_directions插件进行路线规划。

回到顶部