如何在Flutter的Google Maps中基于LatLng点绘制路径Polyline(非直线)
在Flutter的Google Maps中基于LatLng点绘制导航路线Polyline
首先纠正你的误解:谷歌的Directions API其实支持直接传入LatLng坐标作为起点和终点,并非只能用城市、城镇名称这类字符串。你完全可以通过精确坐标请求短距离路线,再解析返回的Polyline数据来绘制符合道路规则的导航路径,而非简单直线。
下面是具体实现步骤:
1. 依赖准备
确保项目引入必要的包,在pubspec.yaml中添加:
dependencies: google_maps_flutter: ^2.5.0 http: ^1.1.0 polyline: ^0.2.0
google_maps_flutter:用于地图展示和Polyline绘制http:用于调用Directions APIpolyline:用于解码API返回的Polyline编码字符串
2. 调用Directions API获取路线坐标
构造请求时直接将LatLng的经纬度拼接为纬度,经度格式,作为origin和destination参数传入:
import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:polyline/polyline.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; Future<List<LatLng>> getRouteCoordinates(LatLng start, LatLng end) async { final apiKey = '你的谷歌API密钥'; // 替换为实际API密钥 final url = Uri.parse( 'https://maps.googleapis.com/maps/api/directions/json?origin=${start.latitude},${start.longitude}&destination=${end.latitude},${end.longitude}&key=$apiKey' ); final response = await http.get(url); if (response.statusCode == 200) { final data = json.decode(response.body); if (data['status'] == 'OK') { // 提取路线的Polyline编码 String encodedPolyline = data['routes'][0]['overview_polyline']['points']; // 解码为LatLng列表 Polyline polyline = Polyline(encodedString: encodedPolyline); return polyline.decodedCoords.map((coord) => LatLng(coord[0], coord[1])).toList(); } else { throw Exception('路线请求失败:${data['status']}'); } } else { throw Exception('网络请求失败'); } }
3. 在地图上绘制导航路线
将获取到的LatLng列表传入GoogleMap的polylines参数即可:
GoogleMap( initialCameraPosition: CameraPosition(target: start, zoom: 16), polylines: { Polyline( polylineId: const PolylineId('nav_route'), points: routeCoordinates, // 上一步获取的路线坐标列表 width: 6, color: Colors.blueAccent, startCap: Cap.roundCap, endCap: Cap.roundCap, ), }, markers: { Marker(markerId: const MarkerId('start'), position: start), Marker(markerId: const MarkerId('end'), position: end), }, )
注意事项
- 确保你的谷歌API密钥已启用Directions API,并配置了对应平台(Android/iOS)的访问限制,避免密钥滥用。
- 短距离路线同样可以被API识别,只要坐标精确,会返回符合实际道路的导航路径。
- 需处理API返回的异常情况,比如
ZERO_RESULTS(两点间无可行路线)、OVER_QUERY_LIMIT(请求超限)等。
内容的提问来源于stack exchange,提问作者Rehan
相关产品推荐
相关产品推荐

