request method

Future<MapMatchingApiResponse> request({
  1. NavigationProfile? profile,
  2. List<List<double>> coordinates = const <List<double>>[],
  3. List<NavigationAnnotations> annotations = const <NavigationAnnotations>[],
  4. NavigationApproaches approaches = NavigationApproaches.UNRESTRICTED,
  5. NavigationGeometries geometries = NavigationGeometries.POLYLINE,
  6. String language = 'en',
  7. NavigationOverview overview = NavigationOverview.SIMPLIFIED,
  8. List<double> radiuses = const <double>[],
  9. bool steps = false,
  10. bool tidy = false,
  11. List<int> timestamps = const <int>[],
  12. List<String> waypointNames = const <String>[],
  13. List<List<double>> waypoints = const <List<double>>[],
})

Return a path on the road and path network that is closest to the input traces.

Implementation

Future<MapMatchingApiResponse> request({
  NavigationProfile? profile,
  List<List<double>> coordinates = const <List<double>>[],
  List<NavigationAnnotations> annotations = const <NavigationAnnotations>[],
  NavigationApproaches approaches = NavigationApproaches.UNRESTRICTED,
  NavigationGeometries geometries = NavigationGeometries.POLYLINE,
  String language = 'en',
  NavigationOverview overview = NavigationOverview.SIMPLIFIED,
  List<double> radiuses = const <double>[],
  bool steps = false,
  bool tidy = false,
  List<int> timestamps = const <int>[],
  List<String> waypointNames = const <String>[],
  List<List<double>> waypoints = const <List<double>>[],
}) 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 += ';';
    } else {
      url += '.json';
    }
  }

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

  if (language != 'en') {
    url += '&language=' + language;
  }
  if (steps) {
    url += '&steps=true';
  }
  if (tidy) {
    url += '&tidy=true';
  }

  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;
  }

  switch (approaches) {
    case NavigationApproaches.CURB:
      url += '&approaches=curb';
      break;
    case NavigationApproaches.UNRESTRICTED:
      break;
  }

  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 < waypointNames.length; i++) {
    if (i == 0) {
      url += '&waypoint_names=';
    }

    url += waypointNames[i];

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

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

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

    if (i != waypoints.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:
        url += 'congestion';
        break;
    }

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

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