Paylaşılan havuz gezileri oluşturma

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:

Gezi oluşturmayla ilgili temel bilgiler

Bu bölümde, Fleet Engine'da gezi oluşturmak için gerekli istek ayrıntıları açıklanmaktadır. gRPC ve REST'i kullanarak bir oluşturma isteği gönderirsiniz.

  • CreateTrip() yöntemi: gRPC veya REST
  • CreateTripRequest mesajı: Yalnızca gRPC

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.

Seyahat alanları
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ı rollerine sahip kimlikle aynı olmalıdır.
trip_id Evet Bu geziyi benzersiz bir şekilde tanımlayan, sizin oluşturduğunuz bir dize. Seyahat kimliklerinde, referans bölümünde belirtildiği gibi belirli kısıtlamalar vardır.
trip_type Evet Oluşturduğunuz seyahat türü için TripType parametresini aşağıdaki değerlere ayarlayın:
  • Tek hedef: SHARED veya EXCLUSIVE olarak ayarlayın.
  • Çok hedefli: EXCLUSIVE olarak ayarlayın.
  • Arka arkaya: EXCLUSIVE olarak ayarlayın.
  • Ortak havuz: SHARED olarak ayarlanır.
pickup_point Evet Seyahatin kalkış noktası.
Orta düzey hedefler Evet

Yalnızca çok hedefli seyahatler: Sürücünün, alma ve bırakma noktası arasında ziyaret ettiği ara hedeflerin listesi. dropoff_point ile olduğu gibi bu alan, UpdateTrip çağrılarak daha sonra da ayarlanabilir ancak çok hedefli seyahatler, tanımı gereği ara hedefler içerir.

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ı CreateTrip veya UpdateTrip numaralı telefonu arayarak ayarlayabilirsiniz. Araç yol işaretlerini UpdateVehicle çağrısı yaparak waypoints alanı üzerinden de güncelleyebilirsiniz. Hizmet, gizlilik nedeniyle GetTrip aramalarında bu bilgileri döndürmez.

number_of_passengers Hayır Gezideki yolcu sayısı.
dropoff_point Hayır Seyahatin varış noktası.
vehicle_id Hayır Geziye atanan aracın kimliği.

Örnek: Ortak havuz seyahati oluşturma

Aşağıdaki arka uç entegrasyon örneğinde, seyahatin nasıl oluşturulacağı ve paylaşılan toplu taşıma seyahati 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üncelleme

Fleet Engine'da oluşturulan tüm seyahatlerin, Fleet Engine'ın seyahat tahmini varış zamanlarını hesaplayabilmesi ve izleyebilmesi için bir araca atanması gerekir. Bu işlemi seyahat oluşturma sırasında veya daha sonra seyahati güncellerken yapabilirsiniz.

Ortak havuzdaki geziler için, gezideki araç yol noktası koleksiyonunda (Trip.vehicle_waypoints) ziyaret edilmeyen yol noktaları için bir sıra belirtmeniz gerekir. Fleet Engine, ortak havuzdaki tüm gezilerin yol noktalarını otomatik olarak güncellemek için bu listeyi kullanır.

Örneğin, A Seyahat ve B Seyahat adlı iki paylaşılan havuz seyahatini ele alalım:

  • A gezisi, yolcuyu bırakacağı konuma doğru yola çıkmıştır.
  • Ardından B gezisi aynı araca eklenir.

B Gezisi için bir UpdateTripRequest'te vehicleId'ı ve Trip.vehicle_waypoints'i optimum yol noktası sırasına ayarlarsınız: B BaşlangıçA BitişB Bitiş.

  • getVehicle() çağrısı, şunu içeren remainingWaypoints döndürür:
    B Teslim almaA Teslim etmeB Teslim etme.
  • getTrip() veya A Gezisi için onTripRemainingWaypointsUpdated geri çağırma işlevi, şunu içeren remainingWaypoints döndürür:
    B BaşlangıçA Bitiş.
  • getTrip() veya B Gezisi için onTripRemainingWaypointsUpdated geri çağırma işlevi,
    şunu içeren remainingWaypoints döndürür:
    B Araç AlmaA Araç BırakmaB Araç Bırakma.

Örnek

Aşağıdaki arka uç entegrasyon örneğinde, iki paylaşılan havuz gezisi için araç kimliği ve yol işaretleri içeren bir gezi nasıl güncelleneceği gösterilmektedir.

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

Sırada ne var?