Bu dokümanda, paylaşılan bir havuz gezisi oluşturma, doğru alanları ayarlama ve geziyi yerine getirecek bir araca atama işlemleri açıklanmaktadır. Bu eğitimde, Fleet Engine'ı kurduğunuz, araç oluşturduğunuz, çalışan uygulaması ve isteğe bağlı olarak tüketici uygulamasına sahip olduğunuz varsayılmaktadır. Ayrıca, isteğe bağlı seyahatler için kullanılabilen çeşitli seyahat senaryolarını da bilmeniz gerekir. Aşağıdaki ilgili kılavuzları inceleyin:
- Fleet Engine'i kurma
- Araç oluşturma
- Araç çağırma seyahatlerine genel bakıştaki seyahat senaryoları
Gezi oluşturmayla ilgili temel bilgiler
Bu bölümde, Fleet Engine'de seyahat oluşturmak için gereken istek ayrıntıları açıklanmaktadır. gRPC ve REST'i kullanarak bir oluşturma isteği gönderirsiniz.
Seyahat Alanları
Fleet Engine'da gezi oluşturmak için aşağıdaki alanları kullanın. Farklı seyahat türleri için farklı alanlar kullanabilirsiniz: tek veya çok hedefli, arka arkaya veya ortak havuz seyahatleri. İsteğe bağlı alanları geziyi oluştururken sağlayabilir veya geziyi güncellerken daha sonra ayarlayabilirsiniz.
Ad | Zorunlu mu? | Açıklama |
---|---|---|
parent | Evet | Proje kimliğini içeren bir dize. Bu kimlik, Fleet Engine entegrasyonunuzun tamamında kullanılan ve aynı hizmet hesabı rolleriyle aynı kimlik olmalıdır. |
trip_id | Evet | Sizin oluşturduğunuz ve bu seyahati benzersiz şekilde tanımlayan bir dize. Gezi kimlikleri, referansta belirtildiği gibi belirli kısıtlamalara sahiptir. |
trip_type | Evet | TripType'ı, oluşturduğunuz gezi türü için aşağıdaki değerlere ayarlayın:
|
pickup_point | Evet | Seyahatin kalkış noktası. |
Orta seviye hedefler | Evet | Yalnızca çok hedefli seyahatler: Sürücün alma ve bırakma arasında ziyaret ettiği ara hedeflerin listesi. |
vehicle_waypoints | Evet | Yalnızca ortak havuzdaki seyahatler: Bu alan, birden fazla seyahatteki yol noktalarının birbirine karıştırılmasını destekler.
Atanmış araç için kalan tüm yol noktalarının yanı sıra bu seyahatin teslim alma ve bırakma yol noktalarını içerir. Bu alanı, |
number_of_passengers | Hayır | Seyahatteki yolcu sayısı. |
dropoff_point | Hayır | Seyahatin varış noktası. |
vehicle_id | Hayır | Geziye atanan aracın kimliği. |
Örnek: paylaşılan havuz gezisi oluşturma
Aşağıdaki arka uç entegrasyon örneğinde, seyahatin nasıl oluşturulacağı ve paylaşılan havuz gezisi olarak bir araca nasıl atanacağı gösterilmektedir.
// 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;
}
Paylaşılan havuz gezilerini güncelle
Fleet Engine'in seyahat tahmini varış sürelerini hesaplayıp takip edebilmesi için Fleet Engine'de oluşturulan tüm yolculuklar bir araca atanmalıdır. Bu işlemi seyahat oluşturma sırasında veya daha sonra seyahati güncellerken yapabilirsiniz.
Paylaşılan havuz gezileri için gezinin araç ara noktaları koleksiyonunda (Trip.vehicle_waypoints
) ziyaret edilmemiş ara noktalara bir sipariş belirtmeniz gerekir (Trip.vehicle_waypoints
). Filo Motoru, paylaşılan havuzdaki tüm seyahatlerin seyahat ara noktalarını otomatik olarak güncellemek için bu listeyi kullanır.
Örneğin, A Seyahati ve B Gezisi adlı iki ortak havuz seyahatini ele alalım:
- A seyahati, yolcuyu bırakacağı konuma doğru yola çıkmıştır.
- Ardından B gezisi aynı araca eklenir.
B Seyahati için bir UpdateTripRequest
içinde vehicleId
ve Trip.vehicle_waypoints
öğesini de optimum ara nokta sırasına ayarlarsınız: B Teslim alma
→ A Ayrılma →
B Ayrılma.
getVehicle()
çağrısı, şunu içerenremainingWaypoints
döndürür:
B Teslim alma → A Teslim etme → B Teslim etme.getTrip()
veya A Seyahati içinonTripRemainingWaypointsUpdated
geri çağırmasıremainingWaypoints
şunları döndürür:
B Teslim alma → A Ayrılma.getTrip()
veya B Gezisi içinonTripRemainingWaypointsUpdated
geri çağırmasıremainingWaypoints
şunları döndürür:
B Teslim alma → A Ayrılma → B Ayrılma.
Örnek
Aşağıdaki arka uç entegrasyon örneği, iki ortak havuz gezisinde araç kimliği ve ara noktalarla seyahatin nasıl güncelleneceğini gösterir.
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;
}