getPolyline method

Future<List<LatLng>> getPolyline(
  1. List<LatLng> points
)

Get polyline points

Implementation

Future<List<LatLng>> getPolyline(List<LatLng> points) async {
  if (points.isEmpty) return [];

  // 1. Check local db
  try {
    final data = await _dbService.getPolyline(
      points.map((e) => {'lat': e.latitude, 'lng': e.longitude}).toList(),
    );
    if (data != null) {
      return data.map((e) => LatLng(e['lat'], e['lng'])).toList();
    }
  } catch (e, st) {
    _logService.logError(e, st);
  }

  // 2. Get polyline between two points
  final List<LatLng> polylinePoints = [];
  for (int i = 0; i < points.length - 1; i++) {
    final sLat = points[i].latitude;
    final sLng = points[i].longitude;
    final eLat = points[i + 1].latitude;
    final eLng = points[i + 1].longitude;

    // 2a. Wait for new request
    final success = await _waitForNewRequest(RequestType.routing);
    if (!success) return [];

    // 2b. Get polyline data
    final res = await _apiService.request(
      userAgent: _userAgent ?? _systemService.userAgent,
      url:
          '${_polylineURL.url}/$sLng,$sLat;$eLng,$eLat?overview=full&geometries=geojson',
    );

    // 2c. Parse response
    try {
      final points = res.data['routes'][0]['geometry']['coordinates'] as List;
      polylinePoints.addAll(points.map((e) => LatLng(e[1], e[0])));
    } catch (e, st) {
      _logService.logError(
        e,
        st,
        res: res.toString(),
        req:
            'points: ${points.map((e) => '(${e.latitude},${e.longitude})').join(' | ')}',
      );
      return [];
    }
  }

  if (polylinePoints.isEmpty) return [];

  // 3. Save to local db
  try {
    await _dbService.savePolyline(
      points.map((e) => {'lat': e.latitude, 'lng': e.longitude}).toList(),
      polylinePoints
          .map((e) => {'lat': e.latitude, 'lng': e.longitude})
          .toList(),
    );
  } catch (e, st) {
    _logService.logError(e, st);
  }

  return polylinePoints;
}