如何平滑 Google Directions API 中的路线?

问题描述 投票:0回答:1

我希望在地图上显示更平滑的折线。 See the screenshot of sharp polyline.

我发现“polylineQuality”:“HIGH_QUALITY”在路线首选API中可用,但我猜在Google Directions API中不可用。有什么想法可以提高折线的平滑度吗?

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

class Routing {
  Future<List<LatLng>> getPolylinePoints(
      LatLng source, LatLng destination) async {
    String apiKey = "API_KEY";
    String polylineQuality = "HIGH_QUALITY";
    String baseUrl = "https://maps.googleapis.com/maps/api/directions/json?";

    String url = "$baseUrl"
        "origin=${source.latitude},${source.longitude}&"
        "destination=${destination.latitude},${destination.longitude}&"
        "key=$apiKey&"
        "polylineQuality=$polylineQuality";

    var response = await http.get(Uri.parse(url));
    if (response.statusCode == 200) {
      var jsonData = jsonDecode(response.body);
      var points = jsonData['routes'][0]['overview_polyline']['points'];
      return decodePolyline(points);
    } else {
      throw Exception("Failed to load directions");
    }
  }

  List<LatLng> decodePolyline(String polyline) {
    List<LatLng> points = [];
    int index = 0;
    int len = polyline.length;
    int lat = 0;
    int lng = 0;

    while (index < len) {
      int b;
      int shift = 0;
      int result = 0;
      do {
        b = polyline.codeUnitAt(index++) - 63;
        result |= (b & 0x1f) << shift;
        shift += 5;
      } while (b >= 0x20);
      int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
      lat += dlat;

      shift = 0;
      result = 0;
      do {
        b = polyline.codeUnitAt(index++) - 63;
        result |= (b & 0x1f) << shift;
        shift += 5;
      } while (b >= 0x20);
      int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
      lng += dlng;

      LatLng p = LatLng((lat / 1E5).toDouble(), (lng / 1E5).toDouble());
      points.add(p);
    }

    return points;
  }
}
flutter google-directions-api google-polyline google-maps-flutter
1个回答
0
投票

使用路线 API 而不是方向 API

路由 API 的文档说明了为什么您应该迁移到路由 API。它说,

路由 API 提高了计算性能 方向、距离和旅行时间,值得更换 当前使用 Directions API 和 Distance Matrix API 的应用程序。最多 Routes API 的功能向后兼容 方向 API 和距离矩阵 API。

我假设您需要

polylineQuality
用于路线 API,因为首选路线仅适用于部分客户,并且您需要联系销售人员才能使用您想要的功能。

但是如果您查看 Routes API,它实际上具有相同的

polylineQuality
字段,您可以在其中将折线的质量指定为
HIGH_QUALITY
OVERVIEW
。参考:https://developers.google.com/maps/documentation/routes/config_trade_offs#example_setting_polyline_quality

您可以在使用路由 API 的

computeRoutes
方法时使用此字段。您可以在此处查看参考文档:https://developers.google.com/maps/documentation/routes/reference/rest/v2/TopLevel/computeRoutes#polylinequality

以下是有关如何使用

computeRoutes
获取路线的文档指南:https://developers.google.com/maps/documentation/routes/compute_route_directions

有了这个,我认为路由 API 应该足以满足您的用例。

© www.soinside.com 2019 - 2024. All rights reserved.