You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter中如何计算两个地理点之间的实际行驶路线距离

获取Flutter中两点间实际行驶路线距离的解决方案

嘿,我懂你现在的痛点——用geolocatorgeocode拿到的都是两点间的直线距离,完全没法反映实际开车的路线长度对吧?毕竟现实里得绕路、走主干道,不可能直接穿楼而过嘛。要解决这个问题,咱们得借助专门的地图路线规划API,它们能基于真实的道路网络算出准确的行驶距离。

核心逻辑

直线距离(欧氏距离)只算两点的空间直线长度,但实际行驶距离需要考虑道路走向、限行规则、转弯等现实因素,所以必须依赖第三方地图服务商的Directions API(路线规划API),这类API会返回包含行驶距离、预计耗时的完整路线数据。

具体实现(以Google Maps Directions API为例)

1. 先搞定API密钥

首先得去Google Cloud平台申请Directions API的密钥,记得要启用该API服务,同时设置好使用限制(避免超额收费或者被滥用)。

2. 添加HTTP请求依赖

pubspec.yaml里加入http包,用来发送API请求:

dependencies:
  flutter:
    sdk: flutter
  http: ^1.1.0
  geolocator: ^10.1.0 # 保留你已有的定位包

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

3. 编写请求函数

写一个专门的函数,传入起点和终点的经纬度,调用API获取行驶距离:

import 'package:http/http.dart' as http;
import 'dart:convert';

Future<double?> getDrivingDistance(double startLat, double startLng, double endLat, double endLng) async {
  const apiKey = '你的Google Directions API密钥';
  final requestUrl = Uri.parse(
    'https://maps.googleapis.com/maps/api/directions/json?'
    'origin=$startLat,$startLng&destination=$endLat,$endLng'
    '&mode=driving&key=$apiKey'
  );

  try {
    final response = await http.get(requestUrl);
    if (response.statusCode == 200) {
      final responseData = json.decode(response.body);
      if (responseData['status'] == 'OK') {
        // 提取行驶距离(单位是米)
        final distanceInMeters = responseData['routes'][0]['legs'][0]['distance']['value'];
        // 转换为公里(按需调整单位)
        final distanceInKm = distanceInMeters / 1000;
        return distanceInKm;
      } else {
        print('API返回错误: ${responseData['status']}');
        return null;
      }
    } else {
      print('请求失败,状态码: ${response.statusCode}');
      return null;
    }
  } catch (error) {
    print('请求出错: $error');
    return null;
  }
}

4. 调用函数并展示结果

在你的页面逻辑里调用这个函数,比如结合geolocator获取当前位置,或者用geocode转换地址得到经纬度:

void calculateRouteDistance() async {
  // 示例:起点和终点经纬度(实际可以用geolocator获取当前位置)
  final startLat = 37.7749;
  final startLng = -122.4194;
  final endLat = 34.0522;
  final endLng = -118.2437;

  final drivingDistance = await getDrivingDistance(startLat, startLng, endLat, endLng);
  if (drivingDistance != null) {
    print('实际行驶距离: ${drivingDistance.toStringAsFixed(2)} 公里');
    // 这里可以把距离渲染到UI组件上
  }
}

其他可选方案

如果不想用Google的服务,国内的地图API也完全可行:

  • 高德地图路线规划API:申请开发者密钥后,请求格式类似,返回结构略有差异
  • 百度地图路线规划API:支持驾车、步行、公交等多种出行模式,适配国内路况更精准

注意事项

  • 大部分API有免费额度,超出后会收费,记得提前查看服务商的定价规则
  • 一定要处理异常情况:网络错误、API返回失败、密钥失效等
  • 涉及位置数据时,要确保用户同意你的隐私政策,合规使用数据

内容的提问来源于stack exchange,提问作者Sabahat Hussain Qureshi

火山引擎 最新活动