Créer des voyages de pooling partagés

Ce document explique comment créer un trajet de pooling partagé, et l'attribuer à un véhicule à remplir. Nous partons du principe que vous avez configuré Fleet vous avez créé des véhicules, vous avez une application de conducteur qui fonctionne et éventuellement une application grand public. Vous devez également être familiarisé avec les différents disponibles pour les trajets à la demande. Consultez les guides associés suivants pour que:

Principes de base de la création de voyages

Cette section décrit les détails de la demande nécessaire à la création d'un trajet dans Fleet Engine. Vous pouvez émettre une requête de création à l'aide de gRPC et REST.

  • Méthode CreateTrip(): gRPC ou REST
  • Message CreateTripRequest: gRPC uniquement

Champs de trajet

Utilisez les champs suivants pour créer un trajet dans Fleet Engine. Vous pouvez utiliser différentes pour les différents types de trajets: une seule ou plusieurs destinations, ou de pooling partagés. Toi vous pouvez renseigner les champs facultatifs lors de la création du voyage, ou vous pouvez les définir lorsque vous mettrez à jour le trajet.

Champs de trajet
Nom Obligatoire ? Description
parent Oui Chaîne incluant l'ID du projet. Cet ID doit être le même que celui utilisé sur l'ensemble de votre intégration Fleet Engine, avec le même compte de service de rôles.
trip_id Oui Chaîne que vous créez et identifie ce trajet de manière unique. Les ID de trajet comportent certaines restrictions, comme indiqué dans la référence.
trip_type Oui Définissez TripType sur les valeurs suivantes pour le type de voyage que vous créez:
  • Destination unique: définissez SHARED ou EXCLUSIVE.
  • Multidestination: définissez la valeur sur EXCLUSIVE.
  • Retour à dos: défini sur EXCLUSIVE.
  • Pooling partagé: définissez cette option sur SHARED.
pickup_point Oui Point de départ du trajet.
Destinations intermédiaires Oui

Multi-destination trips only (Trajets multidestinations uniquement) : liste des destinations intermédiaires visitées par le conducteur entre le trajet le retrait et le dépose. Comme pour dropoff_point, ce champ Vous pouvez également le définir ultérieurement en appelant UpdateTrip, mais une stratégie multidestination "trajet" contient par définition des destinations intermédiaires.

vehicle_waypoints Oui

Shared-pooling trips only (Trajets avec pooling partagé uniquement) : ce champ permet d'entrelacer les points de cheminement de plusieurs trajets. Il contient tous les points de cheminement restants pour le véhicule attribué, ainsi que comme points de cheminement de prise en charge et de dépose pour ce trajet. Vous pouvez définir ce champ en appelant CreateTrip ou UpdateTrip. Vous pouvez également modifiez les points de cheminement du véhicule dans le champ waypoints avec une à UpdateVehicle. Le service ne renvoie pas cette information lors des appels GetTrip. pour des raisons de confidentialité.

number_of_passengers Non Nombre de passagers du voyage.
dropoff_point Non Destination du voyage.
vehicle_id Non Identifiant du véhicule attribué au trajet.

Exemple: Créer un voyage de pooling partagé

L'exemple d'intégration du backend suivant montre comment créer un trajet et et l'attribuer à un véhicule en tant que trajet de pooling partagé.

// Vehicle with VEHICLE_ID ID is already created and it is assigned Trip A.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "shared-trip-A";
static final String VEHICLE_ID = "your-vehicle-id";
static final String TRIP_A_ID = "trip-a-id";
static final String TRIP_B_ID = "trip-b-id";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

String parent = "providers/" + PROJECT_ID;

LatLng tripBPickup =
    LatLng.newBuilder().setLatitude(-12.12314).setLongitude(88.142123).build();
LatLng tripBDropoff =
    LatLng.newBuilder().setLatitude(-14.12314).setLongitude(90.142123).build();

TerminalLocation tripBPickupTerminalLocation =
    TerminalLocation.newBuilder().setPoint(tripBPickup).build();
TerminalLocation tripBDropoffTerminalLocation =
    TerminalLocation.newBuilder().setPoint(tripBDropoff).build();

// TripA already exists and it's assigned to a vehicle with VEHICLE_ID ID.
Trip tripB = Trip.newBuilder()
    .setTripType(TripType.SHARED)
    .setVehicleId(VEHICLE_ID)
    .setPickupPoint(tripBPickupTerminalLocation)
    .setDropoffPoint(tripBDropoffTerminalLocation)
    .addAllVehicleWaypoints(
        // This is where you define the arrival order for unvisited waypoints.
        // If you don't specify an order, then the Fleet Engine adds Trip B's
        // waypoints to the end of Trip A's.
        ImmutableList.of(
            // Trip B's pickup point.
            TripWaypoint.newBuilder()
                .setLocation(tripBPickupTerminalLocation)
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
                .build(),
            // Trip A's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripA.getDropoffPoint())
                .setTripId(TRIP_A_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build(),
            // Trip B's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripBDropoffTerminalLocation)
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build()))
    .build();

// Create Trip request
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
    .setParent(parent)
    .setTripId(TRIP_B_ID)
    .setTrip(tripB)
    .build();

try {
  // createdTrip.remainingWaypoints will contain shared-pool waypoints.
  // [tripB.pickup, tripA.dropoff, tripB.dropoff]
  Trip createdTrip = tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

Mettre à jour les trajets de pooling partagés

Tout trajet créé dans Fleet Engine doit être attribué à un véhicule pour que Fleet Engine pour calculer l'heure d'arrivée prévue des trajets et en effectuer le suivi. Vous pouvez le faire pendant création d'un voyage ou ultérieurement lorsque vous le mettrez à jour.

Pour les trajets avec pooling partagé, vous devez indiquer l'ordre des points de cheminement non visités dans la collection de points de cheminement du véhicule (Trip.vehicle_waypoints). Parc Le moteur utilise cette liste pour mettre à jour automatiquement les points de cheminement pour tous les trajets dans le pool partagé.

Prenons l'exemple de deux trajets avec piscine partagée, Trajet A et Trajet B:

  • Le trajet A est en route vers son lieu de dépose.
  • Le trajet B est ensuite ajouté au même véhicule.

Dans une UpdateTripRequest pour le trajet B, vous définissez vehicleId, ainsi que Trip.vehicle_waypoints sur la valeur optimale Ordre des points de cheminement: B PickupUn abandonB Abandon.

  • Appeler getVehicle() renvoie remainingWaypoints contenant:
    B RetraitUn abandonB Abandon.
  • getTrip() ou la Rappel onTripRemainingWaypointsUpdated pour Le trajet A renvoie remainingWaypoints contenant:
    B RetraitUn abandon.
  • getTrip() ou la Rappel onTripRemainingWaypointsUpdated pour Le trajet B renvoie remainingWaypoints contenant:
    B RetraitUn abandonB Abandon :

Exemple

L'exemple d'intégration du backend suivant montre comment mettre à jour un trajet avec l'identifiant du véhicule et les points de cheminement pour deux trajets avec piscine partagée.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_A_ID = "share-trip-A";
static final String TRIP_B_ID = "share-trip-B";
static final String VEHICLE_ID = "Vehicle";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_B_ID;

// Get Trip A and Trip B objects from either the Fleet Engine or storage.
Trip tripA = …;
Trip tripB = …;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId(VEHICLE_ID)
    .addAllVehicleWaypoints(
        // This is where you define the arrival order for unvisited waypoints.
        // If you don't specify an order, then the Fleet Engine adds Trip B's
        // waypoints to the end of Trip A's.
        ImmutableList.of(
            // Trip B's pickup point.
            TripWaypoint.newBuilder()
                .setLocation(tripB.getPickupPoint())
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.PICKUP_WAYPOINT_TYPE)
                .build(),
            // Trip A's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripA.getDropoffPoint())
                .setTripId(TRIP_A_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build(),
            // Trip B's drop-off point.
            TripWaypoint.newBuilder()
                .setLocation(tripB.getDropoffPoint())
                .setTripId(TRIP_B_ID)
                .setWaypointType(WaypointType.DROP_OFF_WAYPOINT_TYPE)
                .build()))
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder()
        .addPaths("vehicle_id")
        .addPaths("vehicle_waypoints"))
    .build();

// Error handling. If Fleet Engine has both a trip and vehicle with the IDs,
// and if the credentials validate, and if the given vehicle_waypoints list
// is valid, then the service updates the trip.
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:          // Either the trip or vehicle does not exist.
      break;
    case PERMISSION_DENIED:
      break;
    case INVALID_REQUEST:    // vehicle_waypoints is invalid.
      break;
  }
  return;
}

Étape suivante