Flutter地图路线规划插件flutter_map_directions的使用
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) => _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<OsrmRoute> routes) {
if (_coordinates.length < 2) return;
setState(() {
_message = routes.isNotEmpty ? 'Found route' : 'No route found';
});
}
}
更多关于Flutter地图路线规划插件flutter_map_directions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter地图路线规划插件flutter_map_directions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter地图路线规划插件flutter_map_directions
的示例代码。这个示例将展示如何在Flutter应用中集成flutter_map_directions
插件,并显示从一个地点到另一个地点的路线。
首先,确保你的Flutter项目已经添加了对flutter_map
和flutter_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,
),
],
),
],
),
);
}
}
在这个示例中,我们做了以下几件事:
- 在
pubspec.yaml
中添加了flutter_map
和flutter_map_directions
的依赖。 - 创建了一个Flutter应用,其中包含一个
MapScreen
页面。 - 在
MapScreen
页面的initState
方法中,初始化了MapController
,并定义了起点和终点。 - 使用
flutter_map_directions
插件的Directions
类来获取从起点到终点的路线。 - 如果成功获取到路线,将其坐标存储在
_routeCoordinates
列表中,并在地图上显示路线。
请注意,你需要替换YOUR_GOOGLE_MAPS_API_KEY
为你的实际Google Maps API Key。如果没有API Key,你可以从Google Cloud Platform获取一个。
这个示例应该能帮助你开始在Flutter应用中集成和使用flutter_map_directions
插件进行路线规划。