במסמך הזה מוסבר איך ליצור נסיעה משותפת בשירות 'נסיעות בקבוצה', להגדיר את השדות הנכונים ולהקצות אותה לרכב כדי לבצע אותה. ההנחה היא שהגדרתם את Fleet Engine, יצרתם כלי רכב, יש לכם אפליקציה שפועלת לנהגים ואפליקציה שפועלת לצרכנים (אופציונלי). בנוסף, אתם צריכים להכיר את התרחישים השונים של נסיעות שזמינות בנסיעות על פי דרישה. לקבלת מידע נוסף, תוכלו להיעזר במדריכים הקשורים הבאים:
- הגדרת Fleet Engine
- יצירת רכב
- תרחישי נסיעות בסקירה הכללית של נסיעות על פי דרישה
מידע בסיסי על יצירת נסיעה
בקטע הזה מתוארים פרטי הבקשה שדרושים ליצירת נסיעה ב-Fleet Engine. שולחים בקשת יצירה באמצעות gRPC ו-REST.
שדות של נסיעות
משתמשים בשדות הבאים כדי ליצור נסיעה ב-Fleet Engine. אפשר להשתמש בשדות שונים לסוגי הנסיעות השונים: נסיעות עם יעד אחד או עם כמה יעדים, נסיעות הלוך ושוב ונסיעות משותפות. אפשר למלא את השדות האופציונליים כשיוצרים את הנסיעה, או להגדיר אותם מאוחר יותר כשמעדכנים את הנסיעה.
שם | נדרש? | תיאור |
---|---|---|
הורה | כן | מחרוזת שכוללת את מזהה הפרויקט. המזהה הזה צריך להיות זהה למזהה שנמצא בשימוש בכל השילוב של Fleet Engine, עם אותם התפקידים בחשבון השירות. |
trip_id | כן | מחרוזת שיצרתם שמאפשרת לזהות את הנסיעה באופן ייחודי. למזהי נסיעות יש הגבלות מסוימות, כפי שמצוין במסמך העזרה. |
trip_type | כן | מגדירים את TripType לערכים הבאים לסוג הנסיעה שיוצרים:
|
pickup_point | כן | נקודת המוצא של הנסיעה. |
יעדים ביניים | כן | נסיעות במספר יעדים בלבד: רשימת יעדי הביניים שבהם הנהג מבקר בין
האיסוף לבין ההורדה. בדומה ל- |
vehicle_waypoints | כן | נסיעות במאגר משותף בלבד: השדה הזה תומך בשילוב של ציוני הדרך מכמה נסיעות.
הוא מכיל את כל נקודות העצירה שנותרו ברכב שהוקצה, וגם את נקודות העצירה של האיסוף וההחזרה בנסיעה הזו. אפשר להגדיר את השדה הזה על-ידי קריאה ל- |
number_of_passengers | לא | מספר הנוסעים בנסיעה. |
dropoff_point | לא | היעד של הנסיעה. |
vehicle_id | לא | המזהה של הרכב שהוקצה לנסיעה. |
דוגמה: יצירת נסיעה משותפת לאחסון נתונים
בדוגמה הבאה לשילוב בקצה העורפי מוסבר איך יוצרים נסיעה ומקצים אותה לרכב כנסיעה בשירות 'נסיעות משותפות'.
// 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;
}
עדכון של נסיעות בקבוצה
כדי שמערכת Fleet Engine תוכל לחשב את זמני ההגעה המשוער של הנסיעה ולעקוב אחריה, כל נסיעה שנוצרת ב-Fleet Engine צריכה להיות מוקצית לרכב. אפשר לעשות זאת במהלך יצירת הנסיעה או בשלב מאוחר יותר, כשמעדכנים את הנסיעה.
בנסיעות בשירות 'מעבר בין רכבים', צריך לציין את הסדר של נקודות העצירה שלא ביקרתם בהן באוסף של נקודות העצירה ברכב (Trip.vehicle_waypoints
). מערכת Fleet Engine משתמשת ברשימה הזו כדי לעדכן באופן אוטומטי את נקודות העצירה בנסיעות בכל הרכבים בשירות 'מעבר בין רכבים'.
לדוגמה, נניח שיש שתי נסיעות במאגר משותף, נסיעה א' ו-נסיעה ב':
- נסיעה א' נמצאת בדרך לנקודת המוצא שלה.
- לאחר מכן, נסיעה ב' מתווספת לאותו רכב.
בקובץ UpdateTripRequest
אחד של Trip B, מגדירים את vehicleId
, וגם מגדירים את Trip.vehicle_waypoints
לסדר האופטימלי של היעד: B pickup
← A Drop-off ←
B Drop-off.
- קריאה ל-
getVehicle()
מחזירה אתremainingWaypoints
שמכיל:
B Pickup → A Drop-off → B Drop-off. - הערך
getTrip()
או הקריאה החוזרתonTripRemainingWaypointsUpdated
של Trip A מחזירהremainingWaypoints
שמכיל:
B pickup ← A Drop-off. getTrip()
או הקריאה החוזרתonTripRemainingWaypointsUpdated
עבור נסיעה B מחזירה אתremainingWaypoints
שמכיל את:
B Pickup → A Drop-off → B Drop-off.
דוגמה
בדוגמה הבאה לשילוב בקצה העורפי מוסבר איך לעדכן נסיעה עם מזהה הרכב ונקודות ציון לשני נסיעות בפול של רכבים משותפים.
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;
}