다중 목적지 경로 만들기

이 문서에서는 여러 목적지가 있는 경로를 만들고, 올바른 필드를 설정하고, 이를 차량에 할당하여 완료하는 방법을 설명합니다. Fleet Engine을 설정하고, 차량을 만들고, 작동하는 드라이버 앱과 선택적으로 소비자 앱이 있다고 가정합니다. 또한 주문형 경로에 사용할 수 있는 다양한 경로 시나리오를 잘 알고 있어야 합니다. 자세한 내용은 다음 관련 가이드를 참고하세요.

경로 생성 기본사항

이 섹션에서는 Fleet Engine에서 경로를 만드는 데 필요한 요청 세부정보를 설명합니다. gRPC 또는 REST를 사용하여 생성 요청을 실행합니다.

  • CreateTrip() 메서드: gRPC 또는 REST
  • CreateTripRequest 메시지: gRPC 전용

경로 필드

다음 필드를 사용하여 Fleet Engine에서 경로를 만듭니다. 단일 또는 여러 목적지, 연속, 공유 풀링 경로와 같은 다양한 유형의 경로에 서로 다른 필드를 사용할 수 있습니다. 경로를 만들 때 선택적 필드를 제공하거나 나중에 경로를 업데이트할 때 설정할 수 있습니다.

경로 필드
이름 필수 여부 설명
parent 프로젝트 ID가 포함된 문자열입니다. 이 ID는 동일한 서비스 계정 역할로 전체 Fleet Engine 통합에서 사용되는 동일한 ID여야 합니다.
trip_id 이 경로를 고유하게 식별하는 사용자가 만드는 문자열입니다. 경로 ID에는 특정 제한사항이 있습니다. 참조에 표시된 대로
trip_type 만드는 경로 유형에 따라 TripType을 다음 값으로 설정합니다.
  • 단일 목적지: SHARED 또는 EXCLUSIVE로 설정합니다.
  • 여러 목적지: EXCLUSIVE로 설정합니다.
  • 연속: EXCLUSIVE로 설정합니다.
  • 공유 풀링: SHARED로 설정합니다.
pickup_point 경로의 출발지입니다.
중간 목적지

여러 목적지 경로만 해당: 드라이버가 픽업과 하차 사이에 방문하는 중간 목적지 목록입니다. dropoff_point와 마찬가지로 이 필드는 나중에 UpdateTrip을 호출하여 설정할 수도 있지만 여러 목적지 경로는 정의상 중간 목적지를 포함합니다.

vehicle_waypoints

공유 풀링 경로만 해당: 이 필드는 여러 경로의 경유지를 인터리빙하는 것을 지원합니다. 할당된 차량의 나머지 모든 경유지와 이 경로의 픽업 및 하차 경유지가 포함되어 있습니다. `CreateTrip` 또는 `UpdateTrip`을 호출하여 이 필드를 설정할 수 있습니다. `UpdateVehicle`을 호출하여 `waypoints` 필드를 통해 차량 경유지를 업데이트할 수도 있습니다. 개인 정보 보호를 위해 서비스는 GetTrip 호출 에서 이 정보를 반환하지 않습니다.

number_of_passengers 아니요 경로의 승객 수입니다.
dropoff_point 아니요 경로의 목적지입니다.
vehicle_id 아니요 경로에 할당된 차량의 ID입니다.

예: 여러 목적지가 있는 경로 만들기

다음은 픽업 지점, 하차 지점, 중간 목적지 하나가 있는 독점적인 여러 목적지 경로를 만드는 방법을 보여줍니다.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip initial settings.
String parent = "providers/" + PROJECT_ID;

Trip trip = Trip.newBuilder()
    .setTripType(TripType.EXCLUSIVE)
    .setPickupPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder()
                .setLatitude(-6.195139).setLongitude(106.820826)))
    .setNumberOfPassengers(1)
    .setDropoffPoint(
        TerminalLocation.newBuilder().setPoint(
            LatLng.newBuilder()
                .setLatitude(-6.1275).setLongitude(106.6537)))
    // Add the list of intermediate destinations.
    .addAllIntermediateDestinations(
        ImmutableList.of(
            TerminalLocation.newBuilder().setPoint(
                LatLng.newBuilder()
                    .setLatitude(-6.195139).setLongitude(106.820826)).build()))
    .build();

// Create the Trip request.
CreateTripRequest createTripRequest = CreateTripRequest.newBuilder()
    .setParent(parent)
    .setTripId(TRIP_ID)  // Trip ID assigned by the Provider server.
    .setTrip(trip)       // Initial state is NEW.
    .build();

// Error handling.
try {
  Trip createdTrip =
      tripService.createTrip(createTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case ALREADY_EXISTS:  // Trip already exists.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

여러 목적지가 있는 경로 업데이트

Fleet Engine이 경로를 따라 차량을 추적할 수 있도록 차량 ID로 경로를 구성해야 합니다. 경로 업데이트에 관한 자세한 내용은 경로 업데이트 및 상태 관리를 참고하세요.

경로를 만들 때 하차 또는 중간 목적지를 지정하지 않으면 언제든지 이 시점에서 지정할 수 있습니다.

경로 업데이트 예

다음은 중간 목적지 목록을 추가하고 차량 ID를 설정하도록 경로를 업데이트하는 방법을 보여줍니다.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to be updated.
Trip trip = Trip.newBuilder()
    // Add the list of intermediate destinations.
    .addAllIntermediateDestinations(
        ImmutableList.of(
            TerminalLocation.newBuilder().setPoint(
                LatLng.newBuilder()
                    .setLatitude(-6.195139).setLongitude(106.820826)).build()))
    .setVehicleId("8241890")
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(
        FieldMask.newBuilder()
            .addPaths("intermediate_destinations")
            .addPaths("vehicle_id")
            .build())
    .build();

// Error handling.
try {
  Trip updatedTrip =
      tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:            // The trip doesn't exist.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

여러 목적지가 있는 경로의 경로 상태 관리

`TripStatus` 열거형 값 중 하나를 사용하여 경로의 상태를 지정합니다.TripStatus 경로의 상태가 ENROUTE_TO_PICKUP에서 ARRIVED_AT_PICKUP으로 변경되는 경우와 같이 경로 상태를 Fleet Engine에서 업데이트해야 합니다. 경로 상태는 항상 NEW 값으로 시작하고 COMPLETE 또는 CANCELED 값으로 끝납니다.

여러 목적지가 있는 경로의 경우 단일 목적지 경로와 마찬가지로 경로 상태를 업데이트하는 것 외에도 차량이 중간 목적지에 도달할 때마다 다음을 업데이트해야 합니다.

  • intermediateDestinationIndex
  • intermediateDestinationsVersion

이렇게 하려면 TripStatus 열거형의 다음 값을 사용하세요.

  • ENROUTE_TO_PICKUP
  • ARRIVED_AT_PICKUP
  • ENROUTE_TO_INTERMEDIATE_DESTINATION
  • ARRIVED_AT_INTERMEDIATE_DESTINATION
  • ENROUTE_TO_DROPOFF
  • COMPLETE

중간 목적지가 있는 경로 예

다음은 픽업 지점을 지나 첫 번째 중간 목적지로 이동 중인 여러 목적지가 있는 경로를 만드는 방법을 보여줍니다.

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "multi-destination-trip-A";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

// Get the trip object from either the Fleet Engine or storage.
Trip trip = ;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to be updated.
Trip trip = Trip.newBuilder()
    // Trip status cannot return to a previous state once it has passed.
    .setTripStatus(TripStatus.ENROUTE_TO_INTERMEDIATE_DESTINATION)

    // Enroute to the first intermediate destination.
    .setIntermediateDestinationIndex(0)

    // You must provide an intermediate_destinations_version to ensure that you
    // have the same intermediate destinations list as the Fleet Engine.
    .setIntermediateDestinationsVersion(
         trip.getIntermediateDestinationsVersion())
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(
        FieldMask.newBuilder()
            .addPaths("trip_status")
            .addPaths("intermediate_destination_index")
            // intermediate_destinations_version must not be in the update mask.
            .build())
    .build();

// Error handling.
try {
  Trip updatedTrip =
      tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:            // The trip doesn't exist.
      break;
    case FAILED_PRECONDITION:  // Either the trip status is invalid, or the
                               // intermediate_destinations_version doesn't
                               // match Fleet Engine's.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

다음 단계