다중 목적지 경로 만들기

이 문서에서는 여러 목적지를 만들고 올바른 경로를 설정하는 방법을 설명합니다. 필드를 사용하여 처리할 차량에 할당합니다. Fleet를 설정했다고 가정합니다. 차량을 만들었고 실제로 작동하는 운전자 앱이 있는지 소비자 앱(선택사항) 또한 Google Cloud Platform이라는 시나리오에 적용할 수 있습니다 다음 관련 가이드를 참고하세요. 다음과 같습니다.

경로 만들기 기본사항

이 섹션에서는 이동을 만드는 데 필요한 요청 세부정보를 설명합니다. 사용할 수 있습니다 gRPC 및 REST를 사용하여 생성 요청을 실행합니다.

  • CreateTrip() 메서드: gRPC 또는 REST
  • CreateTripRequest 메시지: gRPC만 해당

이동 필드

다음 필드를 사용하여 Fleet Engine에서 이동을 만듭니다. 다른 여러 종류의 이동: 단일 목적지 또는 다중 목적지, 풀링 여행을 공유하는 모델입니다. 나 은 이동을 만들 때 선택적 필드를 제공할 수 있습니다. 또는 경로를 업데이트할 수 있습니다

이동 필드
이름 필수 여부 설명
parent 프로젝트 ID가 포함된 문자열입니다. 이 ID는 사용된 ID와 동일해야 합니다. 전체 Fleet Engine 통합에서 동일한 서비스 계정으로 역할을 수행합니다
trip_id 이 이동을 고유하게 식별하는 문자열로, 이동 ID에 다음이 포함됩니다. 특정 제한사항이 적용될 수 있습니다
trip_type 만들려는 이동 유형에 대해 TripType을 다음 값으로 설정합니다.
  • 단일 대상 유형: SHARED 또는 EXCLUSIVE로 설정합니다.
  • 다중 대상: EXCLUSIVE로 설정합니다.
  • Back-to-back: EXCLUSIVE로 설정합니다.
  • 공유 풀링: SHARED로 설정합니다.
pickup_point 여정의 출발지입니다.
중급 대상

여러 목적지 이동만: 운전자가 중간에 방문하는 중간 목적지의 목록입니다. 승차 및 하차입니다. dropoff_point와 마찬가지로 이 필드는 나중에 UpdateTrip를 호출하여 설정할 수도 있지만 여정에는 중간 목적지가 포함됩니다.

vehicle_waypoints

공동 풀링 여정만 해당: 이 입력란은 여러 이동의 경유지를 인터리브 처리하는 것을 지원합니다. 여기에는 할당된 차량의 나머지 경유지도 모두 포함됩니다. 을 이 이동의 승차 및 하차 경유지로 지정합니다. 이 필드는 CreateTrip 또는 UpdateTrip 호출 그 외에 waypoints 필드를 통해 차량 경유지를 UpdateVehicle 호출 서비스는 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 열거형 중 하나를 사용하여 이동 상태를 지정합니다. 값으로 사용됩니다. 이동 상태가 변경될 때(예: 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;
}

다음 단계