You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 API
  • polyline:用于解码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:35:11