道順

HERE SDK は RoutingEngine 、 A から B までの最適なルート方向を計算するための本格的な機能を提供します。これには、複数の経由地と、各ターンのローカライズ可能な操作手順が含まれます。 目的のルートタイプ(最速または最短)およびさまざまなルートオプション(速度プロファイル、ルート制限、ビネットオプションなど)を設定して、設定を指定することもできます。

機能の概要 :

  • ルートの計算: さまざまなトランスポートモードで複数の経由地を使用してルートを計算します。
  • 等値線 (Isoline) ルーティング: 時間、距離、または燃料消費量に基づいて、特定のポイントからの到達範囲を表す 等値線 (Isoline) ポリゴンを計算します。
  • ルートに沿って検索: ルート全体に沿って場所を検索 します(この機能については、「検索」セクションで説明します)。
  • ルートのインポート / ルートの一致: 他の API からルートをインポートできます。

ルートを取得します

HERE SDK では、次のルートタイプがサポートされています。

  • オンラインの車ルート案内。
  • オンラインのタクシールート案内。
  • オンラインの徒歩ルート案内。
  • 自転車のルート案内がオンラインで利用できる。
  • カスタマイズ性の高いトラックオプションを備えた、オンライントラックルート案内。
  • スクーターのルート案内をオンラインで利用できる。
  • オンラインバスのルート案内所。
  • 電気自動車が最寄りの充電ステーションを見つけるためのオンラインルート(計算されたエネルギー消費量およびバッテリー仕様に基づく)。
  • 高度にカスタマイズ可能な交通手段を備えたオンラインの公共交通機関ルート TransitRoutingEngine(専門の専門家がオンラインでのみ利用可能)。

各ルートタイプは CarOptions 、またはなどの利用可能なルートオプションのいずれかによって決定さ TruckOptionsれます。 サポートされている各トランスポートモードで利用可能なすべてのルートオプションを検索します。 HERE これらのオプションは、ルートエンジン calculateRoute() のメソッドで使用可能な過負荷に設定できます。

ルートエンジンを次のように作成して、旅程を開始します。

do {
    try routingEngine = RoutingEngine()
} catch let engineInstantiationError {
    fatalError("Failed to initialize routing engine. Cause: \(engineInstantiationError)")
}

新しい RoutingEngine インスタンスを作成すると、上の図のように処理する必要があるエラーがスローされることがあります。 このようなエラーは、たとえば、 HERE SDK の初期化が事前に失敗した場合に発生することがあります。

次のステップでは、2 つの経由地(開始位置と宛先)(GeoCoordinatesインスタンスを保持するタイプWaypointの両方)に基づいてルートを計算できます。 以下では、車両に最適化されたルートを計算するために CarOptions のデフォルトを設定します。

let carOptions = CarOptions()
routingEngine.calculateRoute(with: [Waypoint(coordinates: startGeoCoordinates!),
                                    Waypoint(coordinates: destinationGeoCoordinates!)],
                             carOptions: carOptions) { (routingError, routes) in

        if let error = routingError {
            self.showDialog(title: "Error while calculating a route:", message: "\(error)")
            return
        }

        let route = routes!.first
        self.showRouteDetails(route: route!)
        self.showRouteOnMap(route: route!)
        self.logRouteViolations(route: route!)
}

複数の calculateRoute() をコールすることができます。たとえば、異なるルーティングオプションを持つルートを並行して計算するために、このルートを呼び出すことができます。

メモ

ヒント : ドライバーが走行している場合、方位値はルート計算の改善に役立つことがあります。startingWaypoint?.headingInDegrees = location.bearingInDegrees

各ルート計算は非同期で実行されます。 完了すると、エラーの可能性があるリストRouteまたはRoutingErrorが表示されます。 すべてうまく行けば、それは nil である。 エラーが発生した場合、ルートリストは nil です。 たとえば、指定した輸送モードでルートが実行できない場合、エンジンはルートを計算できません。

メモ

エラーがない場合 、ルートリストには 1 つの結果のみが含まれます。 ルートオプションを使用して代替ルートの数を指定することで 、追加 のルートバリアントを要求できます。 デフォルトでは、代替ルートなしでルートが計算されます。

上記のコード スニペットの showRouteDetails() メソッドを使用して、操縦指示を含むルートの詳細を表示します。 すべてのソースコードは、付属のサンプルアプリに記載されています。 操作手順については、以下で詳しく説明します。 showRouteOnMap() メソッドには、マップ上でルートをレンダリングする方法の例が含まれています。 この点については、後述のセクションで簡単に説明します。

注 : 重要です

ルートには 、ルートの計算後に発生する可能性のある問題を説明するNoticeCode値のリストが含まれている場合があります。 たとえば、ルートがトンネルを回避する必要があり、可能な唯一のルートがトンネルを通過する必要がある場合、Route には、要求されたトンネル回避の違反があったことを示す通知が含まれます。

  • 違反の可能性がないか、常に計算済みの Route を確認することをお勧めします。
  • NoticeCodeNoticeオブジェクトの一部です。 可能な Notice オブジェクトのリストには、RouteSection ごとにアクセスでき ます。
  • 違反が発生しなかった場合、リストは空になります。
  • 違反の可能性 がある場合は、少なくとも 1 つの違反を含むルートをスキップすることをお勧めします。

ただし、要求されたルートオプションおよび実際の NoticeCode 値のリストによって、実装はケースバイケースに判断します。 ルートオプションの詳細については、次のセクションを参照してください。 重要 : わかりやすいよう に、このガイドのコードスニペットでは、通知の 列挙型 (enum) 値を評価しません

次の方法で、可能性のあるルート通知を検出できます。

// A route may contain several warnings, for example, when a certain route option could not be fulfilled.
// An implementation may decide to reject a route if one or more violations are detected.
private func logRouteViolations(route: Route) {
    let sections = route.sections
    for section in sections {
        for notice in section.sectionNotices {
            print("This route contains the following warning: \(notice.code)")
        }
    }
}

メモ

ヒント : すべてのルートにルート沿いの高度値が含まれています。 たとえば、予定されている自転車旅行の高度プロファイルを作成します。

各輸送モードにルートオプションを使用します

上の例では、自動車ルートを計算する新しいCarOptionsインスタンスを設定しました。 各トランスポートモードに専用のルートオプションを使用すると、他のトランスポートモードのルートを計算できます。 次のルートオプションがあります。

  • CarOptions 車両ルートを計算するには、次の手順 route.getRequestedTransportMode() を返します TransportMode.CAR
  • TruckOptions トラックルートを計算するには : route.getRequestedTransportMode() を返します TransportMode.TRUCK
  • PedestrianOptions 歩行者のルートを計算するには: route.getRequestedTransportMode() を返します TransportMode.PEDESTRIAN
  • EVCarOptions EVTruckOptions 電気自動車のルートを計算するには、次の手順に従います。 route.getRequestedTransportMode() TransportMode.CAR またはを返します TransportMode.TRUCK
  • ScooterOptions スクーターのルートを計算するには: route.getRequestedTransportMode() を返します TransportMode.SCOOTER
  • BicycleOptions 自転車のルートを計算するには: route.getRequestedTransportMode() を返します TransportMode.BICYCLE
  • TaxiOptions タクシーのルートを計算するには : route.getRequestedTransportMode() を返します TransportMode.TAXI
  • BusOptions バスのルートを計算するには : route.getRequestedTransportMode() を返します TransportMode.BUS
  • TransitRouteOptions 公共交通機関のルートを計算 TransitRoutingEngineするには ( 経由でのみ利用可能 ) 、次の手順に従います。 route.getRequestedTransportMode() を返します TransportMode.PUBLIC_TRANSIT

TransportModeは 、ルートの計算が完了した後、ルーティングエンジンによって設定されます。getRequestedTransportMode()は 、ルートオプションからトランスポートモードを決定しますが 、RouteSectionは異なるトランスポートモードを持つことができます。 route.getSectionTransportMode() 特定のセクションで使用する必要がある実際のSectionTransportModeを提供 します。上記のトランスポートモードに加えて、FERRYCAR_SHUTTLE_TRAINなどのトランスポートモードも一覧表示されます。

デフォルト Sectionでは、始点と終点の経由地 のみを通過する場合、結果のルートには 1 つのルートのみが含まれます。 各 route オブジェクトには、設定されている経由地 モードおよびトランスポートモードの数に応じて、より多くのルートセクションを含めることができます。 セクションは ルートを複数の論理パーツに分割するルートレッグとして機能します。 この HERE の詳細情報を参照できます。

ルートを計算する前に、メイントランスポートモードがユーザーによって指定されますが、最終的なトランスポートモードは、ごとにルーティングエンジンによって設定 Sectionされます。

メモ

Route は複数のを含める SectionTransportModeことができます。 このような場合 Section 、ルートは別のルートに分割され、トランスポートモードの変更を示します。 基本 的に、交通手段を変更するには、フェリーに乗るために車を出発する場合など、目的地までの移動に経由地を用意する必要があります。 ただし、完全 なマルチモーダルルーティング はサポートされていません。 駐車場の観光スポットとして目的地までの車ルートが含まれている場合、最後の経由地 が、車で到達可能な駐車場の前の最後の場所にマップマッチングされます。

このようなギャップは 、RoutePlaceオブジェクトのoriginalCoordinatesmapMatchedCoordinatesを比較することで検出できます。 フォールバックとして、適切なトランスポートモードを使用して、これら 2 つの座標間の距離を新しいルート計算で埋めることをアプリケーションで決定できます。このようなモーダルルートは、を利用する代わりにタクシーまたは公共交通機関を利用することをユーザーが好む場合があるため、さまざまなオプションで構成できます 徒歩。 HERE SDK は、このようなモーダルルートを個別の要求としてのみサポートするため、アプリケーションはフォールバックロジックを実装する必要があります。

利用可能なすべてのルートオプションを使用して、必要に応じてルート計算を最適化するための複数のパラメータをさらに指定できます。

上記の各オプションには、共通 RouteOptions のオブジェクトを保持するフィールドが含まれています。 このオプションを使用すると、代替ルートの数などの一般的なオプションを指定できます。また、OptimizationModeで移動時間とルートの長さに基づいて最適なルートを検索することもできます。

メモ

デフォルトでは、ルートは fastest ルートモードを使用して計算されます。

または、アルゴリズムを変更することもできます。 たとえば、目的地にすばやく到達したい場合に、ルートの長さが自分にとってそれほど重要ではない場合は、RouteOptions経由地のfastestルートモードを選択します。 shortest ルートを短くして、時間がそれほど重要でない場合に選択します。

最適なルートを見つけるために、ルーティングアルゴリズムでは多数の異なるパラメータが考慮されます。 これは、アルゴリズムが常に 最短 ルートまたは最速ルートを提供することを意味するものではありません。 たとえば、次の道路ネットワークについて考えてみます。

図 : どのルートを選択しますか?

A から B への旅程を計画する場合 、 4 つの異なる道路から選択できます。 緑のルートが高速道路を表しているとし ます。このルートは最速のルートですが、都市を案内する他のルートよりも長くなっています。

代わりに最短 ルートを使用する場合は、黄色と赤色のルートが短くなりますが、ルートアルゴリズムによって青色のルートが優先されることがあります。 その理由をお聞かせください。 黄色の道路は最短ルートですが、フェリーが発着する川を渡る必要があります。 このアルゴリズムでは、時間のかかるものと見なすことができます。 そのため、赤色または青色のルートを黄色のルートよりも優先することができますが、どちらも若干長くなります。

他の 2 つのオプションを確認してみましょう。 青と赤のルートを比較する場合、ルーティングアルゴリズムは青のルートを最短ルートとして推奨することがありますが、赤のルートよりもわずかに長くなります。通常、複数のターンは運転者にとって有益ではありません。 この場合、赤色のルートには青色のルートよりも多くのルートが含まれていますが、青色のルートはわずかに長いため、推奨ルートとなる場合があります。 ルート探索アルゴリズムは、ターンおよび交通灯やドライバーの減速を引き起こす可能性のある鉄道交差点など、他の多くの道路特性をペナルティで固定します。

メモ

HERE SDK では、一般的なルーティングオプションに加えて、トラックルーティングなど、サポートされているさまざまなトランスポートモードに特化したオプションを提供しています。このオプションでは、次のように指定できます。 トラックの寸法。道路幅やトンネルの高さなど、トラックが適したルートのみを検索できます。

結果のルートは特定の条件に基づいて最適化されますが、信頼したくない状況が生じることがあります。 ベルリン市内を巡る旅を想像してみてください。ベルリンの観光名所を巡りたい場合は、最短ルートまたは最短ルートを見つけることはできません。 このような場合は、追加の経由地を設定することをお勧めします。 以下の例を参照してください。

トラックルートを取得します

HERE SDK は、ルート計算のためにさまざまなトランスポートモード(上記を参照)をサポートしています。 車両に最適化されたルートの計算方法を示す上記の例と同様に、トラックなどの他の輸送タイプのルートを計算することもできます。

既定のオプションを設定することで、トラック用に最適化されたルートをすでに取得できますが、トラックに最適なルートを検索するためのオプションが数多く用意されています。

たとえば、TruckOptions には、トラックの寸法を指定する TruckSpecifications などの追加のフィールドが含まれています。これらのフィールドは、オプションで車両重量およびその他のパラメータを考慮に入れるように適用できます。

公共交通機関のルートを取得します

TransitRoutingEngine を使用して、 A から B への公共交通機関のルートを計算します。その間には複数の経由地があります。 GitHubPublicTransit のサンプルアプリを探し て、その方法を確認できます。

追加の経由地を使用してルートを形成します

デフォルト Sectionでは、始点と終点の経由地のみを通過する場合、結果のルートには 1 つのルートのみが含まれます。 各ルートオブジェクトには、設定されている経由地の数に応じて、より多くのルートセクションを含めることができます。 セクションは ルートを複数の論理パーツに分割するルートレッグとして機能します。

経由地は、より多くのセクションまたはルートの形状を決定するためにユーザーが設定できる座標です ( フェリーで川を横断する場合などに便利です ) 。

経由地には、次の 2 つのタイプがあります。

  • stopover: デフォルトの経由地タイプ。 このポイントが通過することが保証されているため、操作指示のリストに表示され、ルートが別々のルートセクションに分割されます。
  • passThrough: 操作指示リストに表示されない場合があり、タッチ入力の結果など、ルートを形成するヒントとして扱われます。 このタイプ では、ルートは別々のセクションに分割されません

新しい Waypoint オブジェクトを作成する場合、stopover タイプはデフォルトで設定されます。このタイプは、最初と最後の経由地で使用されるタイプである必要があります。 2 つの経由地のみが始点および終点として機能する場合、ルートは次のようになります。

図 : 出発地点と目的地の間に 1 つのルートセクションがあります。

RoutingEngine 複数の経由地を処理できます。 基盤と WaypointTypeなるアルゴリズムは、提供された配列の順序およびの順序を遵守しながら、すべての経由地を接続する最適なパスを探しようとします。 各 stopover経由地が、開始位置と宛先の間で渡されます。宛先は、それぞれ経由地リストの最初の項目と最後の項目です。

let waypoint1GeoCoordinates = createRandomGeoCoordinatesInViewport()
let waypoint2GeoCoordinates = createRandomGeoCoordinatesInViewport()
let waypoints = [Waypoint(coordinates: startGeoCoordinates),
                 Waypoint(coordinates: waypoint1GeoCoordinates),
                 Waypoint(coordinates: waypoint2GeoCoordinates),
                 Waypoint(coordinates: destinationGeoCoordinates)]

let carOptions = CarOptions()
routingEngine.calculateRoute(with: waypoints,
                             carOptions: carOptions) { (routingError, routes) in

        if let error = routingError {
            self.showDialog(title: "Error while calculating a route:", message: "\(error)")
            return
        }

        let route = routes!.first
        self.showRouteDetails(route: route!)
        self.showRouteOnMap(route: route!)
        self.logRouteViolations(route: route!)
}

上の図に示すように、コード スニペットを使用してルートに 2 つの stopover ルート経由地を追加することで、出発地と目的地の間に 3 つのルートセクションが作成されました。

メモ

経由地リストの順序は、ルートに沿って渡される順序を定義します。

図 : 2 つの経由地を追加しています。

目的地までの移動にかかる推定時間やルートの全長(メートル単位)など、ルートに関する追加情報は、以下のように Route オブジェクトから取得できます。

let estimatedTravelTimeInSeconds = route.duration
let lengthInMeters = route.lengthInMeters

移動時間と移動距離は、それぞれの Section で利用でき ます。 追加の stopover 経由地がない場合、ルートには 1 つのルートだけが含まれます Section。 追加の stopover 経由地が指定されている場合、ルートは各経由地間、出発地から最初のウェイポイントまで、最後のウェイポイントから目的地までのルートを複数のルート区間に分けて表示します。

メモ

デフォルトでは、追加の経由地がルートを別々のセクションに分割し、ルートがこのポイントを通過して、そのポイントの操作指示を生成するように強制します。

Section は、ルートのシェイプが GeoPolyline で表されています。この配列では、最初の座標が出発点を示し、最後の座標が目的地を示します。

これは、たとえば、マップポリラインを Section ごと異なる色で使用して、マップ上のルートを表示する場合に役立ち ます。 ただし、ポリラインを Route オブジェクトから直接取得することもできます。 MapPolylineLite 以下のコード スニペットは、各経由地の間に描画されたを使用して、開始ポイントと宛先を含めて、この機能を実装する方法を示しています。

let routeGeoPolyline = route.geometry
let mapPolylineStyle = MapPolylineStyleLite()
mapPolylineStyle.setColor(0x00908AA0, encoding: .rgba8888)
mapPolylineStyle.setWidthInPixels(inPixels: 10)
let routeMapPolyline = MapPolylineLite(geometry: routeGeoPolyline, style: mapPolylineStyle)
mapView.mapScene.addMapPolyline(routeMapPolyline)

以下の最初のスクリーンショットは、追加の経由地がないルートを示しています。そのため、ルートセクションは 1 つだけです。 出発地点と目的地は、緑で囲まれた地図のマーカーで示されます。 円で囲まれたオブジェクトを描画するコードは HERE ではありませんが、必要に応じてサンプルのソースコードから参照できます。

スクリーンショット: 地図にルートを表示しています。

2 つ目のスクリーンショットには、上記と同じルートが表示 stopoverされますが、 2 つの経由地が追加され、赤い丸で囲まれたマップマーカーで示されます。 このため、ルートには 3 つのルートセクションが含まれています。

スクリーンショット: 2 つの経由地が追加されたルートを表示しています。

ルートを拡大表示します

一部の使用例では、計算されたルートをズームすると便利です。 Camera クラスを使用すると、ルートが収まるようにビューポイントを簡単に調整できます。

let cameraUpdate = mapView.camera.calculateEnclosingCameraUpdate(
   forRect: route.boundingBox,
   padding: PaddingLite(left: 10, right: 10, top: 10, bottom: 10))
mapView.camera.updateCamera(cameraUpdate: cameraUpdate)

HERE ルートオブジェクトの外側にあるバウンディング ボックスを使用 CameraUpdateLite して、新しいインスタンスを計算します。 これを使用すると、カメラを即座に更新できます。 ズーム レベルとカメラのターゲットポイントが変更され、指定された境界矩形がビューポイントに正確に収まるようになります。 また、左、右、上、下の各辺にパディングを設定することで、矩形の外側のエッジとビューポイントのエッジの間のスペースを指定できます。

呼び出しによって updateCamera() ビューが即座に変更されます。 これを使用すると、例えば、現在のズーム レベルと目的のズーム レベルの間で、任意のアニメーションスタイルを使用して補間できます。

操作手順を取得します

各に Section は、目的地に到着するためにユーザーが従う必要がある操作手順が含まれています。 1 つの Maneuver オブジェクトには、曲がるたびに操作と操作が必要な場所が含まれています。 このアクションは、「出発」や「左折」などの道順を示す場合があります。

let sections = route.sections
for section in sections {
    logManeuverInstructions(section: section)
}

HERE は、セクションごとの操作指示にアクセスするためのコードです。

private func logManeuverInstructions(section: Section) {
    print("Log maneuver instructions per route section:")
    let maneuverInstructions = section.maneuvers
    for maneuverInstruction in maneuverInstructions {
        let maneuverAction = maneuverInstruction.action
        let maneuverLocation = maneuverInstruction.coordinates
        let maneuverInfo = "\(maneuverInstruction.text)"
            + ", Action: \(maneuverAction)"
            + ", Location: \(maneuverLocation)"
        print(maneuverInfo)
    }
}

これは、経路全体を記述する操作指示リストを書面で簡単に作成する場合に役立ちます。 たとえば ManeuverAction 、 列挙型 (enum) を使用して独自のルーティングエクスペリエンスを構築できます。

メモ

属性 maneuverInstruction.roadTextsmaneuverInstruction.nextRoadTexts および maneuverInstruction.exitSignTexts は、ナビゲーション中にターンバイターン操作の一部として表示されることを意図しているため、Navigate Edition などのエディションのユーザーのみが使用できます。 Route インスタンスから取得した場合、これらの属性は常に空になります。

ルート沿いの交通状況を検索します

渋滞に巻き込まれた場合の総時間を取得するには、次のいずれかの操作を行います。

let estimatedTotalTrafficDelay = route.trafficDelayInSeconds

ルートの個々のセクションでは、交通状況に関するより詳細な情報を利用できます。 操作に加えて(上記を参照)、各SectionRouteには、ルートが計算された時点のトラフィックフローの状況に関する情報が含まれています。

各インスタンス Section には、さまざまな量 TrafficSpeed のインスタンスを含めることができます。 これらの値は Span 、次のまでの間有効 Spanです。 各 Span ジオメトリは、フルルートのポリライン 形状の一部であるポリライン で表されます。

次のコード スニペットは Section の最初の SpanTrafficSpeed 要素を取得する方法を示しています。

let firstSection = route.sections.first
let firstTrafficSpeed = firstSection?.spans.first?.trafficSpeed

TrafficSpeedbaseSpeedInMetersPerSecondはが含まれています。これは、予想されるデフォルトの走行速度です。 これは、道路の現在の制限速度とは異なる場合があります。道路状況が悪いと、走行速度が遅くなる可能性があります。 さらに、での現在の交通状況に基づいて、推定実際の走行速度を取得できます trafficSpeedInMetersPerSecond

トラフィックフローレイヤで使用されるカラーエンコーディングと同様 に、 0 (トラフィックなし) ~ 10 (道路がブロックされている)の範囲のjamFactorを使用して、ルートに沿ったトラフィックを指定できます。 HERE SDK のトラフィック機能の詳細については、「トラフィック」セクションを参照してください。

この値を適切な色にマップする方法の例を次に示します。

図 : 交通渋滞の要因。

通常、 jamFactor は次のように解釈されます。

  • 0 <=<4 jamFactor : 渋滞なし、または渋滞なし。
  • 4 <= jamFactor <8 : 中程度または低速のトラフィック。
  • 8 <=<10 jamFactor : 渋滞しています。
  • jamFactor = 10 : 交通渋滞はなく、道路が渋滞しています。

jamFactorは 必ずしもtrafficSpeedInMetersPerSecond baseSpeedInMetersPerSecondの比率から計算された線形の結果ではありません。これは、道路タイプおよびその他の条件も考慮に入れるためです。

  • さらに、を使用 TrafficEngineして、ルートに沿った交通事故を照会できます。 このためには、Route の座標から GeoCorridor を作成する必要があります。 また、を設定して、廊下の半径も指定してください halfWidthInMeters。 の GeoCorridor 長さと幅には制限があります。 Traffic Example アプリ を確認TrafficEngineして、の使用方法を確認してください。 このガイドの 交通状況のセクションも確認してください。

  • ルート上の基本的な交通事故情報のみに関心がある場合は、Section.getTrafficIncidents()を呼び出して、Route インスタンスから Section ごとに交通状況の概要を直接取得できます。 結果 TrafficIncidentOnRoute のオブジェクトには、で使用できるデータの小さなサブセットが含ま TrafficEngineれていますが、概要を最初に示すと便利です。

ルートを更新することで、ルートの交通情報を更新できます。 以下のセクションを参照してください。

ルート沿いのトールコストを取得します

ルートの個々のセクションに沿って、トールのコストを計算できます。

メモ

これはこの機能のベータ版です。このため、いくつかのバグや予期しない動作が発生する可能性があります。 関連する API は、非推奨プロセスなしで新しいリリースで変更されることがあります。

RouteOptions.enableTolls トールのコストを取得するには、フラグを設定する必要があります。 false デフォルトでは、に設定されています。 このフラグを有効にすると 、 API リファレンス で定義されているように、トールの該当するトランスポートモードのトールデータが要求されます。

トールコストは、Section.tollsを使い、PaymentMethodTollFareおよびTollの情報を取得します。

道路を避ける機能

AvoidanceOptions トンネル、高速道路、放出帯、地域、フェリー、 トール の費用および粗い回転のような他の道の特徴。 RoadFeaturesエレメント、 ZoneCategory、、 GeoBoxCountryCode などのリストを渡すことができます。

RoadFeatures トンネルやトール 道路などの道路固有の機能が含まれています。 たとえば、すべての高速道路を走行から除外 controlledAccessHighway するには、機能のリストにを追加します。

AvoidanceOptions ローカリゼーションや単位オプションなど、他のルートオプションと組み合わせて、目的の輸送モードのオプションに設定できます。 たとえば、車、中古車 CarOptions、トラックなど TruckOptions です。 これらのオプションは、ルートの計算時に読み取られ、の場合 AvoidanceOptions、エンジンは一覧表示されている機能を回避しようとします。

ルートを更新します

Route オブジェクトに含まれているトラフィックフロー情報は、ルートが計算された時間帯に有効です。上記を参照してください。 この情報を後で更新する場合 は、ルートを更新できます。

ルートのルートオプションを更新することもできます。

let refreshRouteOptions = RefreshRouteOptions(taxiOptions)

// Update the route options and set a new start point on the route.
// The new starting point must be on or very close to the original route, preferrably, use a map-matched waypoint if possible.
// Note: A routeHandle is only available, when RouteOptions.enableRouteHandle was set to true when the original route was calculated.
routingEngine.refreshRoute(routeHandle: route.routeHandle!,
                           startingPoint: Waypoint(coordinates: GeoCoordinates(latitude: 13.45, longitude: 53.56)),
                           refreshRouteOptions: refreshRouteOptions) { (routingError, routes) in
    if (routingError == nil) {
        let newRoute = routes?.first
        // ...
    } else {
        // Handle error.
    }
}

このためには、ルートが計算される前にRouteOptions.enableRouteHandle経由で要求されるRouteHandleを把握しておく必要があります。

また、ルートの更新は、ルートオプションをあるトランスポートタイプから別のトランスポートタイプに変換したり、特定のオプションを更新したりする場合に役立ちます。 たとえば、徒歩ルートがトラックルートに変換されたなど、変換ができない場合、 routingError はこれを示します。

新しい出発地点を指定して、ルートを短縮することもできます。 新しいルートは計算されないため、新しい出発地点は元のルートに非常に近い位置にある必要があります。 新しい出発地点が遠すぎると、routingErrorが発生します。

進行中のターン・バイ・ターンナビ (矢印ナビ)中にドライバーがルートから逸脱した場合、迂回路の計算を新たに行う必要があるため、ルートを更新するだけでは不十分です。 このような場合 returnToRoute() は、新しい出発地点を設定してルート全体を再計算するか、または元の代替ルートを保持できる方法を使用すると便利です。

ルートに戻る

RoutingEngineは、現在の交通状況に基づいて既存のルート(上記を参照)を更新できます。 結果として、前のルートよりも高速な新しいルートが作成されることがあります。 ただし、新しい startingPoint ルートは元のルートに非常に近いものにする必要があります。

startingPointがルートから離れている場合に対処する必要がある場合は、RoutingEnginereturnToRoute()機能を使用することを検討してください。 たとえば、ローカルの交通状況により、ドライバーが迂回路を選択する場合があります。 また、コール returnToRoute() によって新しいルートが作成されますが、可能であれば、コストのかかるルートの再計算を行わずに、元のルートからできるだけ類似したルートが試行されます。

  • ストップオーバーの経由地の通過が保証されています。
  • パススルー経由地は、ルートの形成のみを目的としているため、新しいルートがそれらのルートを受け入れるか、または廃棄するかは保証されません。
  • 現在の交通状況が考慮され、ルートが再形成される可能性があります。

ターン・バイ・ターンナビ (矢印ナビ)は Navigate Edition でのみ使用できます。

他のサービスからルートをインポートします

さまざまな多重定義 routingEngine.importRoute() されたメソッドのいずれかを使用して、他の API やベンダーからルートをインポートできます。 これは 1 対 1 のインポート機能ではなく 、再構築であることに注意してください。

次の場所から新しいRouteオブジェクトを作成できます。

  • GeoCoordinates および RouteOptions のリスト。 これは、ルートを別のベンダーからインポートする必要がある場合に役立ちます。
  • RouteHandle は、他の HERE サービスからルートをインポートする場合に役立ちます。 ユースケース では 、 HERE Wego Web サイトまたは HERE REST API を使用する別の Web ページにルートを作成し、それをモバイル機器 に転送して旅程を開始できます。 バックエンド側でのマップの更新、または実世界でのその他の変更によって、無効なハンドルが生じる可能性があります。 そのため、数時間のみハンドルを使用することをお勧めします。 RouteHandle は特定の情報をエンコードしますが、バックエンドから完全なルートデータを取得するには、オンライン接続が必要です。

AvoidanceOptions 適用されたものはすべて廃棄され、ルートを経由して違反として報告 Section.sectionNoticesされます。 たとえば、高速道路の回避を要求しても、指定された座標が高速道路と一致する場合、結果のルートは引き続き高速道路と一致しますが、目的の回避オプションに違反していることを示す通知が追加されます。

一般 的に、ルートをインポートすると、元のルートとまったく同じルートが再現されない場合があります。 詳細については、以下を参照してください。

地理座標のリストからルートをインポートします

RouteOptionsGeoCoordinates のリストからルートをインポートする には、ルートシェイプを定義するGeoCoordinatesのリストが必要です。 このような座標は互いに非常に近い値にする必要があります。そうしないと、計算に失敗します。 このような座標のリストは、別のベンダーによって計算されたルートから抽出することも、 GPX トレースから抽出することもできます。

// Import a route from list of Location instances.
// Note that the geographic coordinates need to be close to each other,
// ideally taken from an existing route.
let routeLocations = [
    Location(coordinates: GeoCoordinates(latitude: 52.518032, longitude: 13.420632)),
    Location(coordinates: GeoCoordinates(latitude: 52.51772, longitude: 13.42038)),
    Location(coordinates: GeoCoordinates(latitude: 52.51764, longitude: 13.42062)),
    Location(coordinates: GeoCoordinates(latitude: 52.51754, longitude: 13.42093)),
    Location(coordinates: GeoCoordinates(latitude: 52.51735, longitude: 13.42155)),
    Location(coordinates: GeoCoordinates(latitude: 52.51719, longitude: 13.42209)),
    Location(coordinates: GeoCoordinates(latitude: 52.51707, longitude: 13.42248)),
    Location(coordinates: GeoCoordinates(latitude: 52.51695, longitude: 13.42285)),
    Location(coordinates: GeoCoordinates(latitude: 52.5168, longitude: 13.42331)),
    Location(coordinates: GeoCoordinates(latitude: 52.51661, longitude: 13.42387)),
    Location(coordinates: GeoCoordinates(latitude: 52.51648, longitude: 13.42429)),
    Location(coordinates: GeoCoordinates(latitude: 52.51618, longitude: 13.42513)),
    Location(coordinates: GeoCoordinates(latitude: 52.5161, longitude: 13.42537)),
    Location(coordinates: GeoCoordinates(latitude: 52.51543, longitude: 13.42475)),
    Location(coordinates: GeoCoordinates(latitude: 52.51514, longitude: 13.42449)),
    Location(coordinates: GeoCoordinates(latitude: 52.515001, longitude: 13.424374))]

routingEngine.importRoute(with: routeLocations, carOptions: CarOptions()) { (routingError, routes) in
    if (routingError == nil) {
        let newRoute = routes?.first
        // ...
    } else {
        // Handle error.
    }
}

このオプションで importRoute() は、目的の転送タイプに一致するメソッドの過負荷を選択できます。

GeoCoordinatesRouteOptionsのリストからルートをインポートすると 、RoutingEngineは 提供された地理座標からできるだけ近いルートシェイプを作成します。

最適な結果を得るには、 1Hz の GPS データ、または数メートルの間隔を持つポイントを使用します。 データが極端に希薄な場合、エラーが発生する可能性があります。

注 : これはこの機能のベータ版です。

RouteHandle からルートをインポートします

以下 RouteHandle のオプションを参照してください。 RouteHandle​(String handle) コンストラクタを使用 RouteHandle すると、指定した文字列ハンドルからを作成できます。 このような文字列は、利用可能な HERE REST API の 1 つなど、他のバックエンドソースから提供できます。 文字列は数時間のみ有効です。

ルートハンドル文字列を使用してルートを作成する REST API コールの例を次に示します。

https://router.hereapi.com/v8/routes?apikey=-YOUR_API_KEY&origin=52.524465%2C13.382334&destination=52.525301%2C13.399844&return=polyline%2Csummary%2Cactions%2Cinstructions%2CrouteHandle&transportMode=car

JSON 応答からルートハンドル文字列をコピーし、次のように HERE SDK で使用できます。

routingEngine.importRoute(routeHandle: RouteHandle(handle: "routeHandleStringFromBackend"), refreshRouteOptions: RefreshRouteOptions(CarOptions())) { (routingError, routes) in
    if (routingError == nil) {
        let newRoute = routes?.first
        // ...
    } else {
        // Handle error.
    }
}

RouteHandle この文字列は、すでに計算されたルートを示します。 正常にインポートされると、 CalculateRouteCallback 新しいオブジェクトが作成され、Routeの一部として提供され、 HERE SDK でさらに使用できます。

注 : これはこの機能のベータ版です。

到達可能領域を表示します

等値線 (Isoline) ルーティングを使用すると、時間、距離、またはエネルギー消費量に基づいて、特定のポイントからの到達範囲を表すポリゴンを生成できます。 ポリゴンには、特定の時間、最長走行距離、電気自動車で利用できる充電レベルで到達できるすべての目的地が含まれます。

メモ

等値線 (Isoline) ルーティング では、リアルタイムおよび履歴のトラフィックが計算で考慮されます。

これがどのように役立つかの例を次に示します。

  • 徒歩 2 キロメートル以内にレストランが軒を連ねている。
  • ユーザーは、観光地までの距離に基づいてホテルを検索 できます。たとえば、ディズニーワールドユニバーサルスタジオなど、アメリカのオーランドにある主なアトラクションまで車で 20 分以内の距離にあるホテルを検索できます。

以下に Isoline 、電気自動車シナリオの消費量ベースの例を示します。この例では、ドライバーが指定された制限値 400 Wh 以内に到達可能なポイントを確認したいと考えています。 そのため、目標は 400 Wh 以下を消費することです。問題は次のとおりです。 このエネルギー制限の範囲内で、ドライバーは何に達することができますか?

メモ

電気自動車は、現在のバッテリー充電量と、道路の勾配や補助電源の使用状況などのエネルギー消費量に影響を与える要因に基づいて、到達可能範囲に限りがあります。 そのため、適切な範囲を視覚化して、充電ポイントに到達する前にエネルギー不足を避けることができます。 車両には固有の燃費パラメータがあるため、正確な走行距離を計算するために、要求に応じてパラメータを指定する必要があります。 詳細については 、以下の電気自動車のセクションを参照してください。

結果は GeoPolygon 地図に表示できる図形になり、ドライバーに視覚的な向きを提供します。

let calculationOptions = IsolineOptions.Calculation(rangeType: .consumptionInWattHours, rangeValues: [400])
let isolineOptions = IsolineOptions(calculationOptions: calculationOptions,
                                    evCarOptions: getEVCarOptions())

routingEngine.calculateIsoline(center: Waypoint(coordinates: startGeoCoordinates),
                               isolineOptions: isolineOptions) { (routingError, isolines) in

    if let error = routingError {
        self.showDialog(title: "Error while calculating reachable area:", message: "\(error)")
        return
    }

    // When routingError is nil, the isolines list is guaranteed to contain at least one isoline.
    // The number of isolines matches the number of requested range values. Here we have used one range value,
    // so only one isoline object is expected.
    let isoline = isolines!.first!

    // If there is more than one polygon, the other polygons indicate separate areas, for example, islands, that
    // can only be reached by a ferry.
    for geoPolygon in isoline.polygons {
        // Show polygon on map.
        let fillColor = UIColor(red: 0, green: 0.56, blue: 0.54, alpha: 0.5)
        let mapPolygon = MapPolygon(geometry: geoPolygon, color: fillColor)
        self.mapView.mapScene.addMapPolygon(mapPolygon)
        self.mapPolygonList.append(mapPolygon)
    }
}

これにより、電気自動車が 400Wh 以下の電力を消費して到達できるエリアが見つかります。その一方で、最短ルートを開始から任意の直進方向に走行しようとします。

最速の理由 これは、ルートの最適化モードによって異なります(前述のセクションで説明しました)。もちろん、任意のモードを指定できます。 各 等値線 (Isoline) には、出発地点からちょうど 1 つのセンターポイントが必要です。

エネルギー消費に関心 EVCarOptionsがあるので、こちらも提供しました。 これらのオプションには 、以下の電気自動車の取り回しのセクションに示されているバッテリーの仕様が含まれている必要があります。 範囲タイプとして時間または距離の制限を指定する場合は、前述のように通常のルートオプションを指定できます。

IsolineRangeType 、提供範囲値のタイプを定義します。 ここでは、400を使用しています。 複数の値を指定できます。その結果、指定された範囲の値ごとに、複数の Isoline オブジェクトが取得されます。

一方 Isoline 、各オブジェクトには、到達範囲に島が含まれている場合など、特殊なケースで複数のポリゴンを含めることができます。 このような領域は、個別のポリゴンとして提供されます。

結果の多角形のシェイプは maxPoints 、パラメーターで定義できます。 GeoPolygon の頂点の数を指定します。 このパラメータは、ポリゴンの実際の計算には影響を与えず、その外観にのみ影響します。

スクリーンショット: 指定した制限の到達範囲を表示します。

スクリーンショットには、大きな緑色の円で示された多角形の中心位置が表示されます。 また、このエリアを超える可能性のあるルートが表示され、ルートに沿って 2 つの追加の充電ステーションが見つかります。 次のセクションでは、電気自動車のルートを計算する方法について説明します。

メモ

上記のコードスニペットは、 GitHub にある EVRouting のサンプルアプリとして見つけることができます。

電気自動車のルートを取得します

電気自動車( EV )の使用量と販売量は世界中で増加し続けています。 HERE は電気自動車に最適なルートを提供するのにどのように役立ちますか?

  • HERE EV ルーティングは、 EV が A から B に到達できるように最適化されたルートを提供し、充電の停止回数を最小限に抑え、バッテリー充電時間を最適化します(車両の消費モデルに基づきます)。 また、地形、道路のジオメトリ、リアルタイムの交通情報、交通パターンなど、旅程を計画する際にもいくつかの要因が考慮されます。

  • HERE は、ルート沿いの充電ステーションを検索する代わりに、可能なすべてのステーションの充電時間を分析し、最短の運転時間と充電時間を提供する最適な組み合わせを選択します。

EV ルートの取得は簡単です。 自動車やトラックのルートを取得する場合と同様 に、電気自動車に固有のルートオプションを追加するだけで、 EV のルートを取得できます。 このようにして、電気自動車のルートを他の輸送モードと同じように取得できます。 EVRouteOptions を指定して calculateRoute() メソッドに追加するだけです。

routingEngine.calculateRoute(with: [Waypoint(coordinates: startGeoCoordinates!),
                                    Waypoint(coordinates: destinationGeoCoordinates!)],
                             evCarOptions: getEVCarOptions()) { (routingError, routes) in

    if let error = routingError {
        self.showDialog(title: "Error while calculating a route:", message: "\(error)")
        return
    }

    // Use routes from list.
}

デフォルトでは、EVRouteOptionsは、エネルギー不足なしで目的地に到達できるようにするために必要なパラメータを含めません

これを確実 に行うには、ルートにチャージステーションを追加するために必要なパラメータを設定する必要があります。また、全体的な移動時間の結果を最適化する必要があります。

以下に、このようなオプションの作成例を示します。

private func getEVCarOptions() -> EVCarOptions {
    var evCarOptions = EVCarOptions()

    // The below three options are the minimum you must specify or routing will result in an error.
    evCarOptions.consumptionModel.ascentConsumptionInWattHoursPerMeter = 9
    evCarOptions.consumptionModel.descentRecoveryInWattHoursPerMeter = 4.3
    evCarOptions.consumptionModel.freeFlowSpeedTable = [0: 0.239,
                                                        27: 0.239,
                                                        60: 0.196,
                                                        90: 0.238]

    // Must be 0 for isoline calculation.   
    evCarOptions.routeOptions.alternatives = 0;

    // Ensure that the vehicle does not run out of energy along the way
    // and charging stations are added as additional waypoints.
    evCarOptions.ensureReachability = true

    // The below options are required when setting the ensureReachability option to true
    // (AvoidanceOptions need to be empty).
    evCarOptions.avoidanceOptions = AvoidanceOptions()
    evCarOptions.routeOptions.speedCapInMetersPerSecond = nil
    evCarOptions.routeOptions.optimizationMode = .fastest
    evCarOptions.batterySpecifications.connectorTypes = [.tesla, .iec62196Type1Combo, .iec62196Type2Combo]
    evCarOptions.batterySpecifications.totalCapacityInKilowattHours = 80.0
    evCarOptions.batterySpecifications.initialChargeInKilowattHours = 10.0
    evCarOptions.batterySpecifications.targetChargeInKilowattHours = 72.0
    evCarOptions.batterySpecifications.chargingCurve = [0: 239.0,
                                                        64: 111.0,
                                                        72: 1.0]

    // Note: More EV options are available, the above shows only the minimum viable options.

    return evCarOptions
}

HERE では、 EVConsumptionModel 電気自動車のエネルギー消費モデルを指定するようにを定義します。 また、BatterySpecifications を追加します 。 これらのオプションを使用すると、追加のストップオーバーとして追加のチャージステーションをルートに挿入できます。つまり、挿入されたチャージステーションの数に応じて、ルートがより多くのセクションに分割されます。

メモ

このような必要な充電ステーションを含める場合は、必ずを使用 OptimizationMode.fastestしてください。 ensureReachability また、 true に設定する必要があります。 ensureReachability がアクティブ化 されている場合、必要な充電ステーションが結果の経路に沿って移動し、必要な充電ステーションがrouteWayPointアイテムとして追加されるようにルートを調整できます。

すべてのオプションが、電気自動車のルートの計算にかかる時間に影響を与える可能性があります。 最も重要なのは、に設定されている大容量のバッテリー totalCapacityInKilowattHours では、充電の停止や、旅程開始時のフル装備のバッテリーの必要性が低減されることです。詳細について initialChargeInKilowattHoursは、以下を参照してください。 比較的低い値は、ルートの先頭付近に充電ステーションが含まれている必要があることを意味します。 そうしないと、ルートの計算に失敗する可能性があります。

現在、エンジンには 使用中の充電ステーションのみが含まれています。 アウトオブサービスまたはメンテナンス中のチャージステーションは考慮されません。 ただし、チャージステーションでの動的な状況のため、エンジンは、ステーションが現在使用中または予約済みであるかどうかを判断しません。 最悪の場合、駅に到着したときに、別の車を充電するために現在使用されている可能性があります。

また、利用可能なバッテリーコネクタタイプも指定しているため、車両を充電するための互換性のあるコネクタを提供していない充電ステーションは除外されます。

メモ

通常、車自体から消費量および電池の情報を取るか、またはマニュアルかあなたの車の製造業者に直接相談できる。 すべての情報が利用できるわけではありません。また、一部の情報はメーカーのみが把握している場合があります。 いずれの場合も、ルート計算プロセスでは指定された仕様が考慮され、不足している値に適切なデフォルト値が入力されます。

特に電気自動車を使用した長距離ドライブの場合は、途中で充電の停止を計画することが重要です。 結局のところ、チャージステーションはガソリンスタンドよりもはるかに一般的ではありません。 上記のオプションを使用する と、RoutingEngine最速のルート(すなわち、目的地に到達するために消費された全体的な時間が最も短いルート)を探し、その間に車両のエネルギーが不足しないようにします。

この計算結果は、「 ルートに沿った検索 」セクションに示されているように、電気自動車向けに最適化されたルートです。経路に沿って見つかった充電ステーションを追加するだけではありません。

route が計算されると、より有用な情報を収集できます。 以下のコード スニペットには、Sectionごとの推定エネルギー消費量が記録され、 必要に応じてバッテリーを充電するために必要な処置が一覧表示されます。

// Find inserted charging stations that are required for this route.
// Note that this example assumes only one start waypoint and one destination waypoint.
// By default, each route has one section.
let additionalSectionCount = route.sections.count - 1
if (additionalSectionCount > 0) {
    // Each additional waypoint splits the route into two sections.
    print("Number of required stops at charging stations: \(additionalSectionCount)")
} else {
    print("Based on the provided options, the destination can be reached without a stop at a charging station.")
}

var sectionIndex = 0
let sections = route.sections
for section in sections {
    let evDetails = section.evDetails
    print("Estimated net energy consumption in kWh for this section: \(String(describing: evDetails?.consumptionInKilowattHour))")
    for postAction in section.postActions {
        switch postAction.action {
            case .chargingSetup:
                print("At the end of this section you need to setup charging for \(postAction.duration) s.")
            break
            case .charging:
                print("At the end of this section you need to charge for \(postAction.duration) s.")
            break
            case .wait:
                print("At the end of this section you need to wait for \(postAction.duration) s.")
            break
            default: fatalError("Unknown post action type.")
        }
    }

    print("Section \(sectionIndex): Estimated battery charge in kWh when leaving the departure place: \(String(describing: section.departurePlace.chargeInKilowattHours))")
    print("Section \(sectionIndex): Estimated battery charge in kWh when leaving the arrival place: \(String(describing: section.arrivalPlace.chargeInKilowattHours))")

    // Only charging stations that are needed to reach the destination are listed below.
    let depStation = section.departurePlace.chargingStation
    if depStation != nil  && !chargingStationsIDs.contains(depStation?.id ?? "-1") {
        print("Section \(sectionIndex), name of charging station: \(String(describing: depStation?.name))")
        chargingStationsIDs.append(depStation?.id ?? "-1")
        addCircleMapMarker(geoCoordinates: section.departurePlace.mapMatchedCoordinates, imageName: "required_charging.png")
    }

    let arrStation = section.departurePlace.chargingStation
    if arrStation != nil && !chargingStationsIDs.contains(arrStation?.id ?? "-1") {
        print("Section \(sectionIndex), name of charging station: \(String(describing: arrStation?.name))")
        chargingStationsIDs.append(arrStation?.id ?? "-1")
        addCircleMapMarker(geoCoordinates: section.arrivalPlace.mapMatchedCoordinates, imageName: "required_charging.png")
    }

    sectionIndex += 1
}

postAction.duration は、バッテリの充電にかかる推定時間が秒単位で示されています。 この時間は、全体的なルート計算および到着予定時間( ETA )に含まれます。

以下は、結果として生じるルートのスクリーンショットです。

スクリーンショット: 電気自動車のルートを表示しています。

HERE ルートには、充電スタンドで 2 つの経由地が必要であることがわかります。赤色のマーカーで示されます。 このため、ルートに は、各充電スタンドが追加の経由地を挿入するときにルートを分割するための 3 つのセクションが含まれています。

最初のセクションに は、充電の停止について説明する事後処理が含まれています。 これには、予想到着料金などの情報が含まれています。

特に指定のない限り、エネルギー消費量は Wh と見なされます。

消費モデルを定義します

以下のパラメータは、電気自動車のより正確な結果を得るための消費モデルを定義します。

  • ascentConsumptionInWattHoursPerMeter: 1 メートルあたりのエネルギー消費量の上昇率。
  • PercentRecoveryInWattHoursPerMeter : 1 メートルあたりのエネルギー回収率が上昇しています。
  • freeFlowSpeedTable: 平坦な舗装路で、所定のフリーフロー速度での消費レートを指定する機能カーブ。
  • trafficSpeedTable: 平坦な道路での交通状況下で、所定の速度での消費レートを指定する機能カーブ。
  • auxiliaryConsumptionInWattHoursPerSecond : 車両の補助システム(エアコン、照明など)が 1 秒間に消費するエネルギーの割合。

消費速度表は、車両が km/時 で指定された速度で標高の変更を行うことなく直進路を走行するときのエネルギー消費量を定義する。 区分線形関数を表します。

HERE は、フリーフロー速度リストの例です。 左側には速度が、右側には燃費が表示されます。

  • 0 : 0.239.
  • 27 : 0.239.
  • 45 : 0.259.
  • 60 : 0.196.
  • 75 : 0.207.
  • 90 : 0.238.
  • 100 : 0.26
  • 110 : 0.296
  • 120 : 0.337
  • 130 : 0.351

グラフでは、次のようになります。

スクリーンショット: 燃費グラフの例。

2 つの異なる消費速度テーブル(フリーフロー速度テーブル トラフィック速度テーブル)を指定できます。

  • フリーフロー速度: 一定の速度で走行する場合のエネルギー消費量を示します。
  • 走行速度: 交通量の多い状況で走行する場合のエネルギー消費量を示します。たとえば、車両が特定の平均速度で走行速度を頻繁に変更すると予想される場合などです。

trafficSpeedTableが提供されていない場合 は、速度関連のエネルギー消費量の計算にのみfreeFlowSpeedTableが使用されます。

メモ

GitHubEVRoutingサンプルのアプリを見つける ことができます。

」に一致する結果は 件です

    」に一致する結果はありません