request method

Future<OptimizationApiResponse> request({
  1. NavigationProfile? profile,
  2. List<List<double>> coordinates = const <List<double>>[],
  3. List<NavigationAnnotations> annotations = const <NavigationAnnotations>[],
  4. List<NavigationApproaches> approaches = const <NavigationApproaches>[],
  5. List<NavigationBearings> bearings = const <NavigationBearings>[],
  6. NavigationDestination destination = NavigationDestination.ANY,
  7. List<List<int>> distributions = const <List<int>>[],
  8. NavigationGeometries geometries = NavigationGeometries.POLYLINE,
  9. String language = 'en',
  10. NavigationOverview overview = NavigationOverview.SIMPLIFIED,
  11. List<double> radiuses = const <double>[],
  12. NavigationSource source = NavigationSource.ANY,
  13. bool steps = false,
  14. bool roundtrip = true,
})

A call to this endpoint retrieves a duration-optimized route between input coordinates.

Implementation

Future<OptimizationApiResponse> request({
  NavigationProfile? profile,
  List<List<double>> coordinates = const <List<double>>[],
  List<NavigationAnnotations> annotations = const <NavigationAnnotations>[],
  List<NavigationApproaches> approaches = const <NavigationApproaches>[],
  List<NavigationBearings> bearings = const <NavigationBearings>[],
  NavigationDestination destination = NavigationDestination.ANY,
  List<List<int>> distributions = const <List<int>>[],
  NavigationGeometries geometries = NavigationGeometries.POLYLINE,
  String language = 'en',
  NavigationOverview overview = NavigationOverview.SIMPLIFIED,
  List<double> radiuses = const <double>[],
  NavigationSource source = NavigationSource.ANY,
  bool steps = false,
  bool roundtrip = true,
}) async {
  var url = endpoint + '/' + version;

  if (profile != null) {
    switch (profile) {
      case NavigationProfile.DRIVING_TRAFFIC:
        url += '/mapbox/driving-traffic';
        break;
      case NavigationProfile.DRIVING:
        url += '/mapbox/driving';
        break;
      case NavigationProfile.CYCLING:
        url += '/mapbox/cycling';
        break;
      case NavigationProfile.WALKING:
        url += '/mapbox/walking';
        break;
    }
  }

  for (var i = 0; i < coordinates.length; i++) {
    if (i == 0) {
      url += '/';
    }

    url += coordinates[i][LONGITUDE].toString();
    url += ',';
    url += coordinates[i][LATITUDE].toString();

    if (i != coordinates.length - 1) {
      url += ';';
    }
  }

  url += '?access_token=' + api.accessToken!;

  if (language != 'en') {
    url += '&language=' + language;
  }
  if (steps) {
    url += '&steps=true';
  }
  if (!roundtrip) {
    url += '&roundtrip=false';
  }
  if (destination == NavigationDestination.LAST) {
    url += '&destination=last';
  }
  if (source == NavigationSource.FIRST) {
    url += '&source=first';
  }

  switch (geometries) {
    case NavigationGeometries.GEOJSON:
      url += '&geometries=geojson';
      break;
    case NavigationGeometries.POLYLINE6:
      url += '&geometries=polyline6';
      break;
    case NavigationGeometries.POLYLINE:
      break;
  }

  switch (overview) {
    case NavigationOverview.FULL:
      url += '&overview=full';
      break;
    case NavigationOverview.NONE:
      url += '&overview=false ';
      break;
    case NavigationOverview.SIMPLIFIED:
      break;
  }

  for (var i = 0; i < distributions.length; i++) {
    if (i == 0) {
      url += '&distributions=';
    }

    url += distributions[i][0].toString();
    url += ',';
    url += distributions[i][1].toString();

    if (i != coordinates.length - 1) {
      url += ';';
    }
  }

  for (var i = 0; i < radiuses.length; i++) {
    if (i == 0) {
      url += '&radiuses=';
    }

    if (radiuses[i] == double.infinity) {
      url += 'unlimited';
    } else {
      url += radiuses[i].toString();
    }

    if (i != radiuses.length - 1) {
      url += ',';
    }
  }

  for (var i = 0; i < annotations.length; i++) {
    if (i == 0) {
      url += '&annotations=';
    }

    switch (annotations[i]) {
      case NavigationAnnotations.DURATION:
        url += 'duration';
        break;
      case NavigationAnnotations.DISTANCE:
        url += 'distance';
        break;
      case NavigationAnnotations.SPEED:
        url += 'speed';
        break;
      case NavigationAnnotations.CONGESTION:
        // not supported
        break;
    }

    if (i != annotations.length - 1) {
      url += ',';
    }
  }

  for (var i = 0; i < bearings.length; i++) {
    if (i == 0) {
      url += '&bearings=';
    }

    url += bearings[i].angle.toString();
    url += ',';
    url += bearings[i].degree.toString();

    if (i != bearings.length - 1) {
      url += ';';
    }
  }

  for (var i = 0; i < approaches.length; i++) {
    if (i == 0) {
      url += '&approaches=';
    }

    switch (approaches[i]) {
      case NavigationApproaches.CURB:
        url += 'curb';
        break;
      case NavigationApproaches.UNRESTRICTED:
        url += 'unrestricted';
        break;
    }

    if (i != approaches.length - 1) {
      url += ';';
    }
  }

  try {
    final response = await get(Uri.parse(url));
    final json = jsonDecode(
      response.body,
    ) as Map<String, dynamic>;
    return OptimizationApiResponse.fromJson(json);
  } on Error catch (error) {
    return OptimizationApiResponse.withError(error);
  }
}