Paylaşılan havuz gezileri oluşturma

Bu belgede, paylaşımlı havuz gezisinin nasıl oluşturulacağı, doğru alanların nasıl ayarlanacağı ve bu gezinin yerine getirilmesi için bir araca nasıl atanacağı açıklanmaktadır. Fleet Engine'i ayarladığınız, araçlar oluşturduğunuz, çalışan bir sürücü uygulamanız ve isteğe bağlı olarak bir tüketici uygulamanız olduğu varsayılır. Ayrıca, isteğe bağlı geziler için kullanılabilen çeşitli gezi senaryolarını da bilmeniz gerekir. Bunun için aşağıdaki ilgili kılavuzlara bakın:

Gezi oluşturmayla ilgili temel bilgiler

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

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

Gezi Alanları

Fleet Engine'da gezi oluşturmak için aşağıdaki alanları kullanın. Farklı gezi türleri için farklı alanlar kullanabilirsiniz: tek veya birden fazla varış noktası olan, arka arkaya ya da paylaşımlı havuz gezileri. İsteğe bağlı alanları, geziyi oluştururken doldurabilir veya daha sonra geziyi güncellerken ayarlayabilirsiniz.

Gezi alanları
Ad Zorunlu mu? Açıklama
parent Evet Proje kimliğini içeren bir dize. Bu kimlik, aynı hizmet hesabı rolleriyle tüm Fleet Engine entegrasyonunuzda kullanılan kimlikle aynı olmalıdır.
trip_id Evet Bu geziyi benzersiz şekilde tanımlamak için oluşturduğunuz dize. Gezi kimlikleri, referansta belirtildiği gibi belirli kısıtlamalara tabidir.
trip_type Evet Oluşturduğunuz gezi türü için TripType'ı aşağıdaki değerlere ayarlayın:
  • Tek hedef: SHARED veya EXCLUSIVE olarak ayarlayın.
  • Çoklu hedef: EXCLUSIVE olarak ayarlayın.
  • Arka arkaya: EXCLUSIVE olarak ayarlayın.
  • Paylaşılan havuz: SHARED olarak ayarlanır.
pickup_point Evet Gezinin başlangıç noktası.
Ara hedefler Evet

Yalnızca birden fazla varış noktası olan geziler: Sürücünün teslim alma ve bırakma arasında ziyaret ettiği ara varış noktalarının listesi. dropoff_point gibi bu alan da daha sonra UpdateTrip çağrılarak ayarlanabilir ancak birden fazla varış noktası olan bir gezi, tanımı gereği ara varış noktaları içerir.

vehicle_waypoints Evet

Yalnızca paylaşımlı geziler: Bu alan, birden fazla gezideki ara noktaların birleştirilmesini destekler. Atanan araç için kalan tüm ara noktaların yanı sıra bu seyahatin teslim alma ve bırakma ara noktalarını içerir. Bu alanı CreateTrip veya UpdateTrip yöntemini çağırarak ayarlayabilirsiniz. Ayrıca, UpdateVehicle çağrısı yaparak waypoints alanı üzerinden araç yol noktalarını güncelleyebilirsiniz. Hizmet, gizlilik nedeniyle GetTrip çağrılarında bu bilgileri döndürmez.

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

Örnek: Paylaşımlı havuz gezisi oluşturma

Aşağıdaki arka uç entegrasyonu örneğinde, nasıl gezi oluşturulacağı ve bu gezinin bir araca paylaşımlı gezi olarak 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şımlı havuz gezilerini güncelleme

Fleet Engine'da oluşturulan tüm gezilerin, Fleet Engine'ın gezi TVS'lerini hesaplayabilmesi ve takip edebilmesi için bir araca atanması gerekir. Bu işlemi, gezi oluşturma sırasında veya daha sonra geziyi güncellerken yapabilirsiniz.

Paylaşımlı havuz gezileri için gezinin araç yol noktaları koleksiyonundaki (Trip.vehicle_waypoints) ziyaret edilmemiş yol noktalarına bir sıra belirtmeniz gerekir. Fleet Engine, paylaşımlı havuzdaki tüm gezilerin gezi yol noktalarını otomatik olarak güncellemek için bu listeyi kullanır.

Örneğin, A gezisi ve B gezisi olmak üzere iki paylaşımlı havuz gezisini ele alalım:

  • A gezisi, bırakma konumuna doğru ilerliyor.
  • Ardından B gezisi aynı araca eklenir.

B Gezisi için bir UpdateTripRequest içinde vehicleId değerini ve Trip.vehicle_waypoints değerini en uygun yol noktası sırasına göre ayarlarsınız: B Alım → A Bırakma → B Bırakma.

  • getVehicle() çağrıldığında şunları içeren remainingWaypoints döndürülür:
    B Teslim alma → A Bırakma → B Bırakma.
  • A gezisi için getTrip() veya onTripRemainingWaypointsUpdated geri çağırma işlevi, şunları içeren remainingWaypoints döndürür:
    B Alım → A Bırakma.
  • getTrip() veya B gezisi için onTripRemainingWaypointsUpdated geri çağırma işlevi, şunları içeren remainingWaypoints döndürür:
    B Alım → A Bırakma → B Bırakma.

Örnek

Aşağıdaki arka uç entegrasyonu örneğinde, bir gezinin araç kimliği ve iki paylaşımlı havuz gezisi için ara noktalarla 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?