In diesem Dokument wird beschrieben, wie Sie eine gemeinsame Pooling-Fahrt erstellen, die richtigen Felder festlegen und sie einem Fahrzeug zuweisen, um sie auszuführen. Es wird davon ausgegangen, dass Sie Fleet Engine eingerichtet, Fahrzeuge erstellt und eine funktionierende Fahrer-App und optional eine Verbraucher-App haben. Außerdem sollten Sie mit den verschiedenen Szenarien für On-Demand-Fahrten vertraut sein. Weitere Informationen finden Sie in den folgenden zugehörigen Leitfäden:
- Fleet Engine einrichten
- Fahrzeug erstellen
- Reiseszenarien in der Übersicht On-Demand-Reisen
Grundlagen der Reiseplanung
In diesem Abschnitt werden die für das Erstellen einer Fahrt in Fleet Engine erforderlichen Anfragedetails beschrieben. Sie senden eine Erstellungsanfrage entweder über gRPC oder REST.
Felder für Fahrten
Verwenden Sie die folgenden Felder, um eine Fahrt in Fleet Engine zu erstellen. Sie können für die verschiedenen Arten von Fahrten unterschiedliche Felder verwenden: Fahrten mit einem oder mehreren Zielen, aufeinanderfolgende Fahrten oder Fahrten mit Sammelpunkten. Sie können die optionalen Felder beim Erstellen der Fahrt angeben oder sie später beim Aktualisieren der Fahrt festlegen.
Name | Erforderlich? | Beschreibung |
---|---|---|
parent | Ja | Ein String, der die Projekt-ID enthält. Diese ID muss in Ihrer gesamten Fleet Engine-Integration mit denselben Dienstkontorollen verwendet werden. |
trip_id | Ja | Ein String, den Sie erstellen und der diese Fahrt eindeutig identifiziert. Für Fahrt-IDs gelten bestimmte Einschränkungen, die in der Referenz angegeben sind. |
trip_type | Ja | Legen Sie TripType auf die folgenden Werte für den zu erstellenden Reisetyp fest:
|
pickup_point | Ja | Der Ausgangspunkt der Reise. |
Zwischenziele | Ja | Nur Fahrten mit mehreren Zielen: Die Liste der Zwischenziele, die der Fahrer zwischen Abhol- und Zielort anfährt. Wie bei |
vehicle_waypoints | Ja | Nur Fahrten mit gemeinsamer Nutzung: In diesem Feld können die Wegpunkte mehrerer Fahrten verschachtelt werden.
Sie enthält alle verbleibenden Wegpunkte für das zugewiesene Fahrzeug sowie die Abhol- und Absetzwegpunkte für diese Fahrt. Sie können dieses Feld festlegen, indem Sie |
number_of_passengers | Nein | Die Anzahl der Passagiere auf der Reise. |
dropoff_point | Nein | Das Ziel der Reise. |
vehicle_id | Nein | Die ID des Fahrzeugs, das der Fahrt zugewiesen ist. |
Beispiel: Fahrt mit Sammelfahrten erstellen
Das folgende Beispiel für die Backend-Integration zeigt, wie Sie eine Fahrt erstellen und sie einem Fahrzeug als Sammelfahrt zuweisen.
// 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;
}
Fahrten mit Fahrgemeinschaften aktualisieren
Jede in Fleet Engine erstellte Fahrt muss einem Fahrzeug zugewiesen werden, damit Fleet Engine die voraussichtliche Ankunftszeit berechnen und die Fahrt verfolgen kann. Sie können dies entweder beim Erstellen der Reise oder später beim Aktualisieren der Reise tun.
Bei Fahrten mit gemeinsamer Nutzung müssen Sie eine Reihenfolge für die nicht besuchten Wegpunkte in der Sammlung der Fahrzeugwegpunkte (Trip.vehicle_waypoints
) der Fahrt angeben. Fleet Engine verwendet diese Liste, um die Fahrtwegpunkte für alle Fahrten im gemeinsamen Pool automatisch zu aktualisieren.
Angenommen, Sie haben zwei Fahrten mit Sammelpool, Fahrt A und Fahrt B:
- Fahrt A ist auf dem Weg zum Zielort.
- Fahrt B wird dann demselben Fahrzeug hinzugefügt.
In einem UpdateTripRequest
für Fahrt B legen Sie die vehicleId
fest und stellen Trip.vehicle_waypoints
auf die optimale Wegpunktreihenfolge ein: B Abholung → A Abgabeort → B Abgabeort.
- Der Aufruf von
getVehicle()
gibtremainingWaypoints
zurück, das Folgendes enthält:
B Abholung → A Abgabe → B Abgabe. - Entweder
getTrip()
oder deronTripRemainingWaypointsUpdated
-Callback für Fahrt A gibtremainingWaypoints
zurück,
die Folgendes enthalten:
B Abholung → A Zielort. - Entweder
getTrip()
oder deronTripRemainingWaypointsUpdated
-Callback für Fahrt B gibtremainingWaypoints
zurück, die Folgendes enthalten:
B Abholung → A Abgabeort → B Abgabeort.
Beispiel
Das folgende Beispiel für die Backend-Integration zeigt, wie eine Fahrt mit der Fahrzeug-ID und Wegpunkten für zwei Fahrten mit gemeinsam genutzten Pools aktualisiert wird.
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;
}