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

より現実的なサービス時間に合わせて、場所固有の駐車時間を設定する

HERE Tour Planning APIでは、場所固有の駐車と車両固有の駐車という2つの補完的なアプローチを使用して、駐車時間を割り当てることができます。これらの機能は、単独でも組み合わせても使用でき、実際の複雑な駐車シナリオをモデル化することもできます。

このアプローチでは、ジョブの場所ごとの駐車条件の違いと、車両やドライバーの特性の違いの両方を考慮に入れることができ、より正確な時間見積もりを柔軟に作成できます。

場所固有の要因

対象のジョブの場所またはその近辺での駐車時間に影響を与える可能性のある場所固有の要因には、以下のようなものがあります。

  • 駐車場の可用性:複数の駐車スペースがある場合、ドライバーが便利な場所を見つけるまでの時間は短くなる可能性があります。反対に、対象の場所の駐車スペースが限られている、または存在しない場合、駐車により長い時間を割り当てなければならなくなる可能性があります。
  • 駐車場のインフラ:さまざまな種類の駐車状のインフラが、駐車作業に必要な合計時間に影響を与える可能性があります。たとえば、配送トラックは、効率的に設計された商品・資材搬入口に駐車する場合、路上駐車に比べて短時間で駐車できる可能性があります。
  • 貨物積み下ろし機器の要件:対象の場所における貨物積み下ろし機器の有無や品質が、適切な駐車方法を見つけるために必要な時間に影響を与える可能性があります。たとえば、機器が不十分である、または整備不良である場合、車両が長時間駐車する、あるいは代替の駐車場所を探さなければならなくなることがあります。

車両固有の要因

対象のジョブの場所またはその近辺での駐車時間に影響を与える可能性のある車両固有の要因には、以下のようなものがあります。

  • 車両固有の特性:車両の種類によって、必要な駐車時間が異なる場合があります。たとえば、大型の配送トラックでは駐車と安全確保に180秒を要する一方で、同じ場所で小型バンは60秒で済む場合もあります。
  • 安全性または法規制への準拠:危険物を運搬する車両は、迅速かつ規制に準拠した駐車が行えるよう設計された、特別に指定されたエリアに駐車することが求められる場合があります。
  • ドライバーの経験:フリートのドライバーが今後の旅程エリアに精通している場合、適切な駐車場所をより迅速に見つけることができ、駐車時間を増やす必要性を低減できる可能性があります。
📘

これはアルファ機能 (新規またはテスト段階であり、現在開発中) です。アルファ機能は、テストおよびフィードバックの目的で提供されています。これらは大幅に変更されたり、一般に入手できなくなったりする可能性があります。 詳細については、「テスト段階の機能の詳細」を参照してください。

駐車時間の設定を理解する

駐車時間の機能は、次の主要なコンポーネントを使用します。

  • 共有駐車場の定義shared.parking配列内で利用可能な駐車時間のオプションを定義します。それぞれが固有のidplacesを持ち、駐車時間および任意で車両固有の割り当てを定義できます。
  • ジョブ固有の駐車場割り当てparkingIds配列を使用して、特定のジョブに対して利用可能な固有の駐車時間を持つ駐車場を指定して、ジョブの場所で駐車オプションを参照します。
📘

駐車時間は、駐車に関連する作業に必要な時間のみを表します (駐車場所の探索、車両の操作、車両の安全確保など)。これは、車両がその場所に滞在する合計時間を表すものではありません。停車の合計時間には、駐車時間と、その停車地点で行われるすべてのサービス作業が含まれます。

共有駐車場の設定

planオブジェクト内のshared.parking配列で駐車場所を定義します。各駐車場の定義には、次の項目を含める必要があります。

  • id (必須):駐車場所を識別する一意の識別子
  • places (必須):駐車の定義を含む配列 (最小:1、最大:1つの駐車IDあたり10)
    • duration (必須):駐車に関連する作業 (駐車場所の探索および安全確保) に要する時間 (秒)
    • vehicleTypeIds (任意):この特定の駐車時間を使用すべき車両タイプIDの配列。指定した場合、これらのIDに一致する車両のみがこの駐車場所を使用します。省略した場合、この駐車場所と対応する駐車時間がデフォルトとして機能し、特定の場所が定義されていないすべての車両に適用されます。

設定の制限

  • 各駐車場所には、異なる駐車時間を持つ最大10個の場所を設定できます。
  • ジョブの場所では、parkingIds配列を使用して1つの駐車IDのみを参照できます。

次のスニペットは、shared.parkingの設定の例を示しています。

"shared": {
  "parking": [
    {
      "id": "parking_downtown",
      "places": [
        {
          "duration": 90,
          "vehicleTypeIds": ["small_van_experienced"]
        },
        {
          "duration": 180
        }
      ]
    },
    {
      "id": "parking_residential",
      "places": [
        {
          "duration": 45,
          "vehicleTypeIds": ["small_van_experienced"]
        },
        {
          "duration": 90
        }
      ]
    }
  ]
}

前の例の設定では、場所およびドライバーの経験に応じて駐車時間が異なることが示されています。

  • parking_downtown:経験のあるドライバー (small_van_experienced) の場合は90秒、標準ドライバー (その他の車両ID)は180秒
  • parking_residential:経験のあるドライバー (small_van_experienced) の場合は45秒、標準ドライバー (その他の車両ID) は90秒

車両がジョブの場所を訪れると、APIはそのジョブのparkingIds参照と車両のタイプIDを照合し、適切な駐車時間を決定します。一致するvehicleTypeIdsが見つからない場合、APIはvehicleTypeIdsが指定されていない最初の場所をデフォルトの駐車時間として使用します。これにより、特定の車両タイプに対して特定の駐車時間を定義しつつ、その他すべての車両に対してフォールバックを提供できます。

ジョブ固有の駐車場の割り当て

parkingIds配列を使用して、事前に定義した駐車場IDをジョブの場所で参照します。

"places": [
  {
    "location": {
      "lat": 52.5293,
      "lng": 13.3850
    },
    "duration": 300,
    "parkingIds": [
      "parking_downtown"
    ]
  }
]

駐車時間の計算

HERE Tour Planning APIは駐車時間を次のように計算します。

合算駐車時間:すべてのジョブの駐車時間を合計し、この合計値をソリューションのstatistic.duration.times.stoppingフィールドに含めます。

割り当て順序の依存関係:複数の割り当てがあるジョブで、一部のみがparkingIdsを参照している場合、サービスはシーケンス内の最初の割り当てに基づいて駐車の動作を決定します。

  • シーケンスの最初の割り当てがparkingIdsを参照していない場合、たとえ後続の割り当てで指定されていても、サービスはそのジョブにおけるすべての後続の割り当ての駐車時間を無視し、該当する停車地点の合計駐車時間は常にゼロになります。
  • シーケンスの最初の割り当てがparkingIdsを参照している場合、サービスは停車地点全体に対して、最初の割り当ての駐車時間を使用し、後続の割り当てで指定されている駐車時間は無視されます。
  • 同じ場所に複数のジョブが割り当てられている場合、その場所で最初のジョブの最初の割り当てに指定された駐車時間のみが、停車地点全体に適用され、後続のジョブに指定された駐車時間は無視されます。

これらの原則の実用的なデモについては、次のセクションのサンプルユースケースを参照してください。

例:経験に基づいた駐車効率を伴う都市部配送旅程

この例では、場所固有の駐車時間が、単純化された混合フリートの都市部配送シナリオでどのように機能するかを示します。この課題では、ベルリンのダウンタウンおよび住宅街にわたって荷物を配送する必要があり、駐車条件は場所によって異なり、またドライバーの経験が駐車効率に影響します。

課題の設定

この配送シナリオには以下が含まれます。

  • フリート:4個の荷物を積載可能な小型バン3台
    • small_van:標準的な配送バン2台 (2台利用可能)
    • small_van_experienced:経験豊富なドライバーが運転するバン1台 (1台利用可能)
  • ジョブの場所:2つのエリアにわたる8つの配送先
    • ダウンタウンエリア:ジョブ1〜4 (駐車スペースが狭く、より多くの時間が必要)
    • 住宅地:ジョブ5〜8 (駐車が簡単で、必要時間が短い)
  • ドライバーの経験に基づく駐車制約
    • ダウンタウン + 経験豊富なドライバー (small_van_experienced):90秒
    • ダウンタウン + 標準ドライバー (デフォルト):180秒
    • 住宅地 + 経験豊富なドライバー (small_van_experienced):45秒
    • 住宅地 + 標準ドライバー (デフォルト):90秒
  • サービス時間:各配送には300秒 (5分) を要します
  • ジョブの割り当て
    • ジョブ1~4はparking_downtownを参照
    • ジョブ5~8はparking_residentialを参照

次のセクションでは、問題全体のJSONについて説明します。

Click to expand/collapse the sample JSON
{
  "fleet": {
    "types": [
      {
        "id": "small_van",
        "profile": "car",
        "costs": {
          "fixed": 10.0,
          "distance": 0.001,
          "time": 0.002
        },
        "shifts": [
          {
            "start": {
              "time": "2024-06-24T06:00:00Z",
              "location": {
                "lat": 52.53097,
                "lng": 13.38504
              }
            },
            "end": {
              "time": "2024-06-24T20:00:00Z",
              "location": {
                "lat": 52.53097,
                "lng": 13.38504
              }
            }
          }
        ],
        "capacity": [4],
        "amount": 2
      },
      {
        "id": "small_van_experienced",
        "profile": "car",
        "costs": {
          "fixed": 10.0,
          "distance": 0.001,
          "time": 0.002
        },
        "shifts": [
          {
            "start": {
              "time": "2024-06-24T06:00:00Z",
              "location": {
                "lat": 52.53097,
                "lng": 13.38504
              }
            },
            "end": {
              "time": "2024-06-24T20:00:00Z",
              "location": {
                "lat": 52.53097,
                "lng": 13.38504
              }
            }
          }
        ],
        "capacity": [4],
        "amount": 1
      }
    ],
    "profiles": [
      {
        "type": "car",
        "name": "car"
      }
    ]
  },
  "plan": {
    "jobs": [
      {
        "id": "Job_1",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.531757,
                    "lng": 13.384426
                  },
                  "duration": 300,
                  "parkingIds": ["parking_downtown"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      },
      {
        "id": "Job_2",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.532983,
                    "lng": 13.38787
                  },
                  "duration": 300,
                  "parkingIds": ["parking_downtown"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      },
      {
        "id": "Job_3",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.532065,
                    "lng": 13.389091
                  },
                  "duration": 300,
                  "parkingIds": ["parking_downtown"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      },
      {
        "id": "Job_4",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.530384,
                    "lng": 13.391224
                  },
                  "duration": 300,
                  "parkingIds": ["parking_downtown"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      },
      {
        "id": "Job_5",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.530008,
                    "lng": 13.389562
                  },
                  "duration": 300,
                  "parkingIds": ["parking_residential"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      },
      {
        "id": "Job_6",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.529496,
                    "lng": 13.385547
                  },
                  "duration": 300,
                  "parkingIds": ["parking_residential"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      },
      {
        "id": "Job_7",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.528909,
                    "lng": 13.385381
                  },
                  "duration": 300,
                  "parkingIds": ["parking_residential"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      },
      {
        "id": "Job_8",
        "tasks": {
          "deliveries": [
            {
              "places": [
                {
                  "location": {
                    "lat": 52.530533,
                    "lng": 13.383505
                  },
                  "duration": 300,
                  "parkingIds": ["parking_residential"]
                }
              ],
              "demand": [1]
            }
          ]
        }
      }
    ],
    "shared": {
      "parking": [
        {
          "id": "parking_downtown",
          "places": [
            {
              "duration": 90,
              "vehicleTypeIds": ["small_van_experienced"]
            },
            {
              "duration": 180
            }
          ]
        },
        {
          "id": "parking_residential",
          "places": [
            {
              "duration": 45,
              "vehicleTypeIds": ["small_van_experienced"]
            },
            {
              "duration": 90
            }
          ]
        }
      ]
    }
  },
  "configuration": {
    "experimentalFeatures": ["parkingIds"]
  }
}

ソリューションの分析

以下の一覧は、旅程に参加した各車両の駐車時間に対するソリューションの内訳を示しています。

経験豊富なドライバー (small_van_experienced_1) の旅程:

  • 担当:Job_8 (住宅地)、Job_3Job_2Job_1 (ダウンタウン)
  • 停止時間:315秒
    • 住宅地1件 x 45秒 = 45秒
    • ダウンタウン3件 x 90秒 = 270秒

標準ドライバー (small_van_2) の旅程:

  • 担当:Job_6Job_7Job_5 (住宅地)、Job_4 (ダウンタウン)
  • 停止時間:450秒
    • 住宅地3件 x 90秒 = 270秒
    • ダウンタウン1件 x 180秒= 180秒

合計停止時間:765秒 (315 + 450)。これは、場所固有 (ダウンタウンと住宅地) および車両固有 (経験豊富なドライバーと標準ドライバー) の駐車時間の組み合わせを反映しています。

この結果は、経験豊富なドライバーが両方の場所タイプでより効率的に駐車できることを示しています。

場所/ドライバーの経験経験豊富なドライバー標準ドライバー
ダウンタウン1回あたり90秒1回あたり180秒 (デフォルト)
住宅地1回あたり45秒1回あたり90秒 (デフォルト)

駐車時間の実際の適用

前述の問題に対するソリューションに基づき、次の図ではJob_8およびJob_6におけるドライバーの経験に応じて、車両の到着とサービス開始の間にどのようにギャップが生じるかを示します。

さまざまな停車地における駐車時間を強調した旅程の概要

経験豊富なドライバーは、標準ドライバーと比べて住宅地の各停止で45秒の駐車時間を節約しています (45秒対90秒)。

次のセクションに完全なソリューションのJSONを示します。

Click to expand/collapse the sample JSON
{
  "statistic": {
    "cost": 30.481,
    "distance": 3003,
    "duration": 3739,
    "times": {
      "driving": 574,
      "serving": 2400,
      "waiting": 0,
      "stopping": 765,
      "break": 0
    }
  },
  "tours": [
    {
      "vehicleId": "small_van_experienced_1",
      "typeId": "small_van_experienced",
      "stops": [
        {
          "time": {
            "arrival": "2024-06-24T06:00:00Z",
            "departure": "2024-06-24T06:00:00Z"
          },
          "load": [4],
          "activities": [
            {
              "jobId": "departure",
              "type": "departure",
              "location": {
                "lat": 52.53097,
                "lng": 13.38504
              },
              "time": {
                "start": "2024-06-24T06:00:00Z",
                "end": "2024-06-24T06:00:00Z"
              }
            }
          ],
          "location": {
            "lat": 52.53097,
            "lng": 13.38504
          },
          "distance": 0
        },
        {
          "time": {
            "arrival": "2024-06-24T06:00:14Z",
            "departure": "2024-06-24T06:05:59Z"
          },
          "load": [3],
          "activities": [
            {
              "jobId": "Job_8",
              "type": "delivery",
              "location": {
                "lat": 52.530533,
                "lng": 13.383505
              },
              "time": {
                "start": "2024-06-24T06:00:59Z",
                "end": "2024-06-24T06:05:59Z"
              }
            }
          ],
          "location": {
            "lat": 52.530533,
            "lng": 13.383505
          },
          "distance": 117
        },
        {
          "time": {
            "arrival": "2024-06-24T06:07:14Z",
            "departure": "2024-06-24T06:13:44Z"
          },
          "load": [2],
          "activities": [
            {
              "jobId": "Job_3",
              "type": "delivery",
              "location": {
                "lat": 52.532065,
                "lng": 13.389091
              },
              "time": {
                "start": "2024-06-24T06:08:44Z",
                "end": "2024-06-24T06:13:44Z"
              }
            }
          ],
          "location": {
            "lat": 52.532065,
            "lng": 13.389091
          },
          "distance": 629
        },
        {
          "time": {
            "arrival": "2024-06-24T06:14:01Z",
            "departure": "2024-06-24T06:20:31Z"
          },
          "load": [1],
          "activities": [
            {
              "jobId": "Job_2",
              "type": "delivery",
              "location": {
                "lat": 52.532983,
                "lng": 13.38787
              },
              "time": {
                "start": "2024-06-24T06:15:31Z",
                "end": "2024-06-24T06:20:31Z"
              }
            }
          ],
          "location": {
            "lat": 52.532983,
            "lng": 13.38787
          },
          "distance": 761
        },
        {
          "time": {
            "arrival": "2024-06-24T06:21:57Z",
            "departure": "2024-06-24T06:28:27Z"
          },
          "load": [0],
          "activities": [
            {
              "jobId": "Job_1",
              "type": "delivery",
              "location": {
                "lat": 52.531757,
                "lng": 13.384426
              },
              "time": {
                "start": "2024-06-24T06:23:27Z",
                "end": "2024-06-24T06:28:27Z"
              }
            }
          ],
          "location": {
            "lat": 52.531757,
            "lng": 13.384426
          },
          "distance": 1120
        },
        {
          "time": {
            "arrival": "2024-06-24T06:28:49Z",
            "departure": "2024-06-24T06:28:49Z"
          },
          "load": [0],
          "activities": [
            {
              "jobId": "arrival",
              "type": "arrival",
              "location": {
                "lat": 52.53097,
                "lng": 13.38504
              },
              "time": {
                "start": "2024-06-24T06:28:49Z",
                "end": "2024-06-24T06:28:49Z"
              }
            }
          ],
          "location": {
            "lat": 52.53097,
            "lng": 13.38504
          },
          "distance": 1234
        }
      ],
      "statistic": {
        "cost": 14.692,
        "distance": 1234,
        "duration": 1729,
        "times": {
          "driving": 214,
          "serving": 1200,
          "waiting": 0,
          "stopping": 315,
          "break": 0
        }
      },
      "shiftIndex": 0
    },
    {
      "vehicleId": "small_van_2",
      "typeId": "small_van",
      "stops": [
        {
          "time": {
            "arrival": "2024-06-24T06:00:00Z",
            "departure": "2024-06-24T06:00:00Z"
          },
          "load": [4],
          "activities": [
            {
              "jobId": "departure",
              "type": "departure",
              "location": {
                "lat": 52.53097,
                "lng": 13.38504
              },
              "time": {
                "start": "2024-06-24T06:00:00Z",
                "end": "2024-06-24T06:00:00Z"
              }
            }
          ],
          "location": {
            "lat": 52.53097,
            "lng": 13.38504
          },
          "distance": 0
        },
        {
          "time": {
            "arrival": "2024-06-24T06:01:08Z",
            "departure": "2024-06-24T06:07:38Z"
          },
          "load": [3],
          "activities": [
            {
              "jobId": "Job_6",
              "type": "delivery",
              "location": {
                "lat": 52.529496,
                "lng": 13.385547
              },
              "time": {
                "start": "2024-06-24T06:02:38Z",
                "end": "2024-06-24T06:07:38Z"
              }
            }
          ],
          "location": {
            "lat": 52.529496,
            "lng": 13.385547
          },
          "distance": 422
        },
        {
          "time": {
            "arrival": "2024-06-24T06:08:14Z",
            "departure": "2024-06-24T06:14:44Z"
          },
          "load": [2],
          "activities": [
            {
              "jobId": "Job_7",
              "type": "delivery",
              "location": {
                "lat": 52.528909,
                "lng": 13.385381
              },
              "time": {
                "start": "2024-06-24T06:09:44Z",
                "end": "2024-06-24T06:14:44Z"
              }
            }
          ],
          "location": {
            "lat": 52.528909,
            "lng": 13.385381
          },
          "distance": 550
        },
        {
          "time": {
            "arrival": "2024-06-24T06:15:57Z",
            "departure": "2024-06-24T06:22:27Z"
          },
          "load": [1],
          "activities": [
            {
              "jobId": "Job_5",
              "type": "delivery",
              "location": {
                "lat": 52.530008,
                "lng": 13.389562
              },
              "time": {
                "start": "2024-06-24T06:17:27Z",
                "end": "2024-06-24T06:22:27Z"
              }
            }
          ],
          "location": {
            "lat": 52.530008,
            "lng": 13.389562
          },
          "distance": 897
        },
        {
          "time": {
            "arrival": "2024-06-24T06:23:21Z",
            "departure": "2024-06-24T06:31:21Z"
          },
          "load": [0],
          "activities": [
            {
              "jobId": "Job_4",
              "type": "delivery",
              "location": {
                "lat": 52.530384,
                "lng": 13.391224
              },
              "time": {
                "start": "2024-06-24T06:26:21Z",
                "end": "2024-06-24T06:31:21Z"
              }
            }
          ],
          "location": {
            "lat": 52.530384,
            "lng": 13.391224
          },
          "distance": 1107
        },
        {
          "time": {
            "arrival": "2024-06-24T06:32:58Z",
            "departure": "2024-06-24T06:32:58Z"
          },
          "load": [0],
          "activities": [
            {
              "jobId": "arrival",
              "type": "arrival",
              "location": {
                "lat": 52.53097,
                "lng": 13.38504
              },
              "time": {
                "start": "2024-06-24T06:32:58Z",
                "end": "2024-06-24T06:32:58Z"
              }
            }
          ],
          "location": {
            "lat": 52.53097,
            "lng": 13.38504
          },
          "distance": 1629
        }
      ],
      "statistic": {
        "cost": 15.585,
        "distance": 1629,
        "duration": 1978,
        "times": {
          "driving": 328,
          "serving": 1200,
          "waiting": 0,
          "stopping": 450,
          "break": 0
        }
      },
      "shiftIndex": 0
    }
  ]
}

次のステップ

詳細については、「HERE Tour Planning APIリファレンス」を参照してください。