ガイドAPIリファレンス
ガイド

逸脱後に現在のルートを調整する

このチュートリアルでは、ドライバーがルートから外れた後にrerouting[mode]=returnToRouterouteHandleを使用してルートを調整する方法を説明します。

元のルート

このチュートリアルの出発点となるルートは、単純な乗用車のルートです。これには via 経由地が含まれています。これについては後で説明します。次のリクエストではそのルートを計算し、プロセスで、対応する routeHandle を返します。

curl -gX GET 'https://router.hereapi.com/v8/routes?'\
'origin=52.533670,13.404711&'\
'destination=52.60126,13.690847&'\
'via=52.53896,13.398679&'\
'return=polyline,routeHandle&'\
'transportMode=car&'\
'apiKey=YOUR_API_KEY'

ルートは以下のパスに従います。

経由地のあるルート

ルートの調整には routeHandle を使用するため、これを必ず抽出してください。

{
  "routes": [
    {
      ...,
      "routeHandle": "{ROUTE_HANDLE}"
    }
  ]
}

誤った方向転換によるルートの逸脱

この例では、ルートが右折を想定している場所でドライバーが左折したためにルートから逸脱しています。

originを指定してドライバーの新しい位置をサービスに通知する必要があります。さらに、方向転換の提案が早すぎないよう、course=100minCourseDistance = 50を使用する必要があります。rerouting[mode]を調整せずにこれを行うと、サービスからエラーが返されるので注意してください。

curl -gX GET 'https://router.hereapi.com/v8/routes/{ROUTE_HANDLE}?'\
'origin=52.532772,13.405133;course=100;minCourseDistance=50&'\
'return=polyline&'\
'transportMode=car&'\
'apiKey=YOUR_API_KEY'

以下はサービスからのエラーメッセージです。

{
  "notices": [
    {
      "title": "Route calculation failed: Couldn't match origin.",
      "code": "couldNotMatchOrigin",
      "severity": "critical"
    }
  ],
  "routes": []
}

以前計算したルート上に新しいoriginがないため、rerouting[mode]=returnToRouteを指定する必要があります。

curl -gX GET 'https://router.hereapi.com/v8/routes/{ROUTE_HANDLE}?'\
'origin=52.532772,13.405133;course=100;minCourseDistance=50&'\
'return=polyline&'\
'rerouting[mode]=returnToRoute&'\
'transportMode=car&'\
'apiKey=YOUR_API_KEY'

以下に紫色で示されている調整されたルートでは、ドライバーは引き返して元のルートに戻るよう指示されます。

新しい出発地でルートを調整する

次のレスポンススニペットに示すように、レスポンスにはサービスが実際に新しい出発地へのルートを調整したことを確認するinfo通知が含まれています。

{
  "notices": [
    {
      "title": "Current route position was not on the original route. New route was calculated from the current position to the destination. Old route may have been reused.",
      "code": "returnToRoute",
      "severity": "info"
    }
  ],
  ...
}

セクションインデックスを追跡する

予期せぬ方向転換をドライバーが行う前にvia経由地をすでに訪問している場合、ルート調整の際には、経由地を訪問しないルートに調整します。

最善のユーザーエクスペリエンスを実現するには、ユーザーがすでに訪れたvia経由地を追跡してください。これを実現するには、ユーザー エクスペリエンス フローに応じてさまざまな方法があります。

  • ユーザーが十分に近づくと、経由地を自動的に「訪問済み」としてマークできます。
  • さらに、ユーザーが近くでしばらく停止することを要求できます。
  • 経由地を「訪問済み」としてマークするために、ユーザーがユーザー インターフェースで明示的な操作を実行することを要求できます。

ルートに沿ったユーザーの進行状況を追跡する方法に関係なく、rerouting[lastTraveledSectionIndex] を使用して、逸脱前にユーザーが通過していたルートのセクションをサービスに通知します。

この例では、rerouting[lastTraveledSectionIndex]=1パラメーターを使用します。これにより、ルートを調整するときにvia経由地を訪問する必要がないことがルート検索サービスに伝えられます。

curl -gX GET 'https://router.hereapi.com/v8/routes/{ROUTE_HANDLE}?'\
'origin=52.532772,13.405133;course=100;minCourseDistance=50&'\
'return=polyline&'\
'rerouting[mode]=returnToRoute&'\
'rerouting[lastTraveledSectionIndex]=1&'\
'transportMode=car&'\
'apiKey=YOUR_API_KEY'

調整されたルートでは、ユーザーに引き返すのではなく、ルートの目的地に向かって進むように指示します。

経由地をスキップする調整済みルート

サービスが元のルートに戻す場所を制御する

ドライバーがすでにセクションに沿ってある程度の距離を移動している場合、またはサービスがドライバーを早期にルートに戻そうとするのを防ぎたい場合は、rerouting[traveledDistanceOnLastSection]を使用して、再計算の開始点として考慮されるルートセグメントについてルート検索サービスに通知できます。

次のユースケースを考慮します。

  • セクションの移動距離を記録してサービスに渡すと、ユーザーがすでに通過したルートの部分にサービスが戻そうとするのを防ぐことができます。
  • サービスが前のルートに戻すタイミングに満足できない場合は、次の例のように、サービスがルートの特定の部分のみを考慮するように、rerouting[traveledDistanceOnLastSection]を人為的に増やすことができます。

例:ドライバーがルートから逸脱し続けるため、traveledDistanceOnLastSectionを緩和する

この例では、提案されたルートをドライバーが受け入れず、提案されたルートに戻るようドライバーを誘導するルート更新を繰り返し実行したにもかかわらず、ドライバーが好みのルートに沿って運転を続けるという一般的なシナリオに対する解決策を示します。

ビジネスロジックを実装してこのシナリオを検出し、ドライバーの好みにより合ったルートを提供できます。この例では、次のアルゴリズムを使用します。

  • 最初の逸脱では、ルート上のドライバーの最後の位置に基づいて rerouting[traveledDistanceOnLastSection] パラメーターを設定します。
  • ドライバーが調整されたルートから繰り返し逸脱した場合は、rerouting[traveledDistanceOnLastSection]minCourseDistance を増やし、古いルートに戻るのではなく、現在の道路をたどることを優先します。

次の図は、この追加ロジックを使用する場合と使用しない場合の returnToRoute を比較したものです。

追加のロジックなしtraveledDistanceOnLastSection を緩和する
traveledDistanceOnLastSection調整なしtraveledDistanceOnLastSection調整あり

元のルートは次のリクエストを使用して計算されました。

curl -gX GET 'https://router.hereapi.com/v8/routes?'\
'origin=52.54421,13.42845&'\
'destination=52.617429,13.431091&'\
'return=polyline,routeHandle&'\
'transportMode=car&'\
'apiKey=YOUR_API_KEY'

右の図に示された 3 つの逸脱の計算では、次のリクエストが使用されました。

  • 紫:初回の逸脱、origin=52.555016,13.431892;course=10;minCourseDistance=50 および rerouting[traveledDistanceOnLastSection]=0
  • 赤:2 回目の逸脱、origin=52.558096,13.433329;course=10;minCourseDistance=500 および rerouting[traveledDistanceOnLastSection]=2000
  • オレンジ:3 回目の逸脱、origin=52.568772,13.441322;course=60;minCourseDistance=2000 および rerouting[traveledDistanceOnLastSection]=10000。この例では、これは完全に新しいルートを計算することと同じです。