能否在Flutter应用中实现Google Maps离线路线,无需重复API请求?
Flutter集成Google Maps离线导航实现方案
核心问题解答
是可以实现单次请求路线后离线导航的,具体方案如下:
1. 单次请求并保存路线数据
使用Google Directions API发起仅一次请求,获取从location1到location2的完整路线数据(包括路线坐标polyline、转向步骤、距离时长等),然后将这些数据持久化存储在本地设备(比如用Hive、SQLite或SharedPreferences),避免后续重复请求产生额外成本。
示例代码片段(获取并保存路线):
import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:hive/hive.dart'; // 发起Directions API请求 Future<void> fetchAndSaveRoute(String origin, String destination) async { final apiKey = 'YOUR_API_KEY'; final url = Uri.parse( 'https://maps.googleapis.com/maps/api/directions/json?origin=$origin&destination=$destination&key=$apiKey' ); final response = await http.get(url); if (response.statusCode == 200) { final routeData = json.decode(response.body); // 提取关键路线信息:polyline、转向步骤等 final route = routeData['routes'][0]; final savedRoute = { 'polyline': route['overview_polyline']['points'], 'legs': route['legs'], 'summary': route['summary'] }; // 存储到本地Hive数据库 final box = await Hive.openBox('routes'); await box.put('saved_route', savedRoute); } }
2. 离线加载路线并实现基础导航
- 离线地图底图:提前引导用户下载目标区域的Google Maps离线瓦片包(通过Google Maps应用或插件相关设置),确保离线时能显示地图背景。
- 绘制预存路线:使用
google_maps_flutter插件,从本地读取保存的polyline数据,解码后绘制在地图上。 - 基础导航逻辑:监听设备的实时位置(通过
geolocator插件),对比预存的路线坐标,判断当前位置是否在路线上,并展示预存的转向指令。这种方式没有实时路况和自动重规划功能,但能满足无网络环境下的徒步导航需求。
示例代码片段(离线绘制路线):
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:hive/hive.dart'; import 'package:google_maps_polyline/google_maps_polyline.dart'; // 从本地加载并绘制路线 Future<void> loadOfflineRoute(GoogleMapController controller) async { final box = await Hive.openBox('routes'); final savedRoute = box.get('saved_route'); if (savedRoute != null) { // 解码polyline为坐标点 final polylinePoints = GoogleMapsPolyline().decodePolyline(savedRoute['polyline']); final LatLngBounds bounds = LatLngBounds( southwest: polylinePoints.first, northeast: polylinePoints.last, ); // 绘制路线 final Polyline routePolyline = Polyline( polylineId: const PolylineId('offline_route'), points: polylinePoints, width: 5, color: Colors.blue, ); await controller.addPolyline(routePolyline); // 移动地图到路线区域 await controller.animateCamera(CameraUpdate.newLatLngBounds(bounds, 50)); } }
3. 关键注意事项
- 成本控制:仅发起一次Directions API请求,后续完全使用本地数据,避免频繁请求产生的高额费用。
- 功能限制:离线状态下无法获取实时路况、交通事件,也不能自动重新规划路线,适合徒步等对路线变动要求低的场景。
- 合规要求:需遵守Google Maps Platform的服务条款,不得篡改或滥用获取的路线数据,离线使用范围需符合条款规定。
内容的提问来源于stack exchange,提问作者user20560231
相关产品推荐
相关产品推荐

