ルーティング : 道順を取得します

HERE SDK は RoutingEngine 、 A から B までの最適なルート方向を計算するための本格的な機能を提供します。これには、複数の経由地 と、各ターンのローカライズ可能な操作手順が含まれます。

目的のルートタイプ(最速または最短)およびさまざまなルートオプション(速度プロファイル、ルート制限、ビネットオプションなど)を設定して、エネルギーを最も節約する最適なルートを検索することで、設定を指定します。 先進的なルーティング技術と専用の EV ルートプランニングサポートにより、 HERE は 地球をよりクリーンで安全にするお手伝い をします。

機能の概要 :

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

ルートを取得します

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

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

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

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

try {
    routingEngine = new RoutingEngine();
} catch (InstantiationErrorException e) {
    throw new RuntimeException("Initialization of RoutingEngine failed: " + e.error.name());
}

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

ApplicationonCreate() メソッド中にこのエンジンを初期化することはできません。 それ以外の時点では問題はありません。 たとえば、このエンジンを初期化するのに適した場所は、ActivityonCreate()メソッドに含まれている可能性があります。

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

Waypoint startWaypoint = new Waypoint(startGeoCoordinates);
Waypoint destinationWaypoint = new Waypoint(destinationGeoCoordinates);

List<Waypoint> waypoints =
        new ArrayList<>(Arrays.asList(startWaypoint, destinationWaypoint));

routingEngine.calculateRoute(
        waypoints,
        new CarOptions(),
        new CalculateRouteCallback() {
            @Override
            public void onRouteCalculated(@Nullable RoutingError routingError, @Nullable List<Route> routes) {
                if (routingError == null) {
                    Route route = routes.get(0);
                    showRouteDetails(route);
                    showRouteOnMap(route);
                    logRouteViolations(route);
                } else {
                    showDialog("Error while calculating a route:", routingError.toString());
                }
            }
        });

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

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

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

エラーがない場合 、ルートリストには 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 void logRouteViolations(Route route) {
    for (Section section : route.getSections()) {
        for (SectionNotice notice : section.getSectionNotices()) {
            Log.e(TAG, "This route contains the following warning: " + notice.code.toString());
        }
    }
}

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

各トランスポートモードにルートオプションを使用します

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

  • CarOptions 車両ルートを計算するには、次の手順 route.requestedTransportMode はです TransportMode.car
  • TruckOptions トラックルートを計算するには : route.requestedTransportMode はです TransportMode.truck
  • PedestrianOptions 歩行者のルートを計算するには: route.requestedTransportMode はです TransportMode.pedestrian
  • EVCarOptions EVTruckOptions 電気自動車のルートを計算するには、次の手順に従います。 route.requestedTransportMode TransportMode.car またはです TransportMode.truck
  • ScooterOptions スクーターのルートを計算するには: route.requestedTransportMode はです TransportMode.scooter
  • BicycleOptions 自転車のルートを計算するには: route.requestedTransportMode はです TransportMode.bicycle
  • TaxiOptions タクシーのルートを計算するには : route.requestedTransportMode はです TransportMode.taxi
  • BusOptions バスのルートを計算するには : route.requestedTransportMode はです TransportMode.bus
  • TransitRouteOptions 公共交通機関のルートを計算 TransitRoutingEngineするには ( 経由でのみ利用可能 ) 、次の手順に従います。 route.requestedTransportMode はです TransportMode.publicTransit

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

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

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

Route は複数のを含めることができ SectionTransportModeます。 このような場合、ルートは Section 別のルートに分割され、輸送モードの変更が示されます。 基本的に、輸送モードを変更するには 、たとえばフェリーに乗るために車を出るときに、旅行の停止が必要です。 ただし、マルチモーダルルーティング (または インターモーダルルーティング)はサポートされていません。 目的地として公園内の観光スポットが含まれている場合、最後のウェイポイントは、車で到達可能な公園の前の最後の場所にマップされ、ルートには歩行者セクションは含まれません。

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

ルートに沿ったすべての地理座標がマップマッチングされることに注意してください (スナップイン道路とも呼ばれます)。 Waypoints を追加すると、マップマッチングも実行され、元の座標は Section の始点と終点を示す RoutePlace 内のマップマッチした場所と比較できます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

公共交通機関を利用できます

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

追加の経由地でルートを形成します

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

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

オンライン RoutingEngine でサポートされている経由地 の数は、最大で約 200 経由地 に制限されています。

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

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

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

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

RoutingEngine は複数の経由地を処理できます。 基本となるアルゴリズムは、提供された ListWaypointType の順序と同様に、すべての経由地を接続するための最適なパスを探します。 各 STOPOVER経由地は、出発地と目的地の間に位置します。すなわち、経由地リストの一番最初と一番最後の項目の間に位置します。

Waypoint waypoint1 = new Waypoint(createRandomGeoCoordinatesInViewport());
Waypoint waypoint2 = new Waypoint(createRandomGeoCoordinatesInViewport());
List<Waypoint> waypoints = new ArrayList<>(Arrays.asList(new Waypoint(startGeoCoordinates),
        waypoint1, waypoint2, new Waypoint(destinationGeoCoordinates)));

routingEngine.calculateRoute(
        waypoints,
        new CarOptions(),
        new CalculateRouteCallback() {
            @Override
            public void onRouteCalculated(@Nullable RoutingError routingError, @Nullable List<Route> routes) {
                if (routingError == null) {
                    Route route = routes.get(0);
                    showRouteDetails(route);
                    showRouteOnMap(route);
                    logRouteViolations(route);
                } else {
                    showDialog("Error while calculating a route:", routingError.toString());
                }
            }
        });

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

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

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

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

// estimatedTravelTimeInSeconds includes traffic delay.
long estimatedTravelTimeInSeconds = route.getDuration().getSeconds();
long estimatedTrafficDelayInSeconds = route.getTrafficDelay().getSeconds();
int lengthInMeters = route.getLengthInMeters();

移動時間と移動時間は、以下の場合にも利用できます Section

private void logRouteSectionDetails(Route route) {
    DateFormat dateFormat = new SimpleDateFormat("HH:mm");

    for (int i = 0; i < route.getSections().size(); i++) {
        Section section = route.getSections().get(i);

        Log.d(TAG, "Route Section : " + (i + 1));
        Log.d(TAG, "Route Section Departure Time : "
                + dateFormat.format(section.getDepartureLocationTime().localTime));
        Log.d(TAG, "Route Section Arrival Time : "
                + dateFormat.format(section.getArrivalLocationTime().localTime));
        Log.d(TAG, "Route Section length : " + section.getLengthInMeters() + " m");
        Log.d(TAG, "Route Section duration : " + section.getDuration().getSeconds() + " s");
    }
}

Additional STOPOVER経由地がない場合、ルートには 1 つのルートだけが含まれます Section。 Additional STOPOVER経由地が指定されている場合、ルートは各経由地間、開始ポイントから最初の経由地まで、および最後の経由地から宛先まで、複数のルートセクションに分割されます。

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

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

これは、たとえば、マップポリラインをそれぞれ異なる色で使用して、マップ上のルートを表示する場合に役立ち Sectionます。 ただし、ポリラインを Route オブジェクトから直接取得することもできます。

MapPolyline 以下のコード スニペットは、ルートの各座標(出発地点と目的地を含む)の間に描画されたを使用して、この設定を実装する方法を示しています。

GeoPolyline routeGeoPolyline = route.getGeometry();
MapPolylineStyle mapPolylineStyle = new MapPolylineStyle();
mapPolylineStyle.setColor(0x00908AA0, PixelFormat.RGBA_8888);
mapPolylineStyle.setWidthInPixels(10);
MapPolyline routeMapPolyline = new MapPolyline(routeGeoPolyline, mapPolylineStyle);
mapView.getMapScene().addMapPolyline(routeMapPolyline);

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

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

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

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

内部的 MapPolyline には、のレンダリングは非常に長いルートに合わせて最適化されています。 たとえば、高いズーム レベルではすべての座標をレンダリングする必要はありませんが、低いズームレベルではルート全体が表示されません。 このアルゴリズムは公開されていませ んが、基本的な原理は HERE の柔軟な折れ線のオープンソースプロジェクトで確認できます。

地図に一致する経由地を取得します

ルートの計算には 、 オフロードの場合でも、任意の目的地を開始地点、目的地、中間地点、STOPOVERまたはPASS_THROUGH経由地として使用できます。 ただし、結果として生じるルートは、指定された経由地を正確に通過するものではありません。 ルーティングアルゴリズムは、指定された座標にできるだけ近い位置に移動しようとします。 これを実現するために、 HERE SDK には、指定された輸送モードなどのさまざまなパラメータを使用して、座標の各セットに最も近いルートセグメントを検索する高度な技術が組み込まれています。 このプロセスを マップマッチングと呼びます。

ただし、ルートのシェイプは、マップが一致した経由地だけで構成されます。

SectionRouteについて 、セクションの最初(出発地)および最後(到着地)にあるRoutePlaceにアクセスできます。 Routeplace パラメーター として渡された内容mapMatchedCoordinatesoriginalCoordinatesが含まれています。 両方を同じにすることも、異なるにすることもできます それらが異なっていれ originalCoordinates ば、は道にないことを意味する。

RoutePlace は、旅程の支援に役立つ詳細情報が含まれています。 たとえば chargeInKilowattHours 、電気自動車(以下を参照)および sideOfDestination 元の経由地のchargingStation情報にアクセスできます。

図 : 元の経由地と地図が一致した。

ルート沿いを走行中で、途中降機地として、オフロードにある観光スポットを指定したとします。 該当する地図に到着して、経由地に到着したときに、道路に乗って目的地に向かってルート沿いに進むと sideOfDestination 、その場に観光地 ( または上図のようなレストラン ) が表示されます 現在ご利用の通りの左側または右側にあります。

指定した配達地点が、現在地の上または下にある場合もあります。その場合 sideOfDestination 、このフィールドには次 UNDEFINED のような場所が示されます。 湖に到着しようとすると、通りはその前で終わる。

場所を経由地に設定します

Place から取得したに SearchEngine は、 1 つ以上のアクセスポイントが含まれている場合があります。 たとえば、大規模な倉庫には複数の入口があり、倉庫の中心部には直接到達できない場合があります。 アクセスポイントは車両から到達できるように設計されていることに注意してください。

ルートの場合 sideOfStreetHint は、利用可能なアクセスポイントのいずれかにナビゲートすることをお勧めしますが、はその場所の地理座標に設定する必要があります。 アクセスポイントが認識されていない場合、または場所に直接到達できる場合、リストは空になります。

List<GeoCoordinates> accessPoints = place.getAccessPoints();
Waypoint destinationWaypoint = new Waypoint(place.getGeoCoordinates());        
if (!accessPoints.isEmpty()) {
    // Set the first access point of a place as route destination.
    destinationWaypoint.coordinates = accessPoints.get(0);
    // When reaching destination provide a hint on the actual location of the place.
    destinationWaypoint.sideOfStreetHint = place.getGeoCoordinates();
    // Always prefer the given side of street hint, even if the street has no lane dividers.
    destinationWaypoint.matchSideOfStreet = MatchSideOfStreet.ALWAYS;
}

結果 Route のオブジェクトのRoutePlaceには、 経由地がアクセスポイントに設定されたときにACCESS_POINT設定されたRoutePlaceTypeが含まれています。

上の図を参照し て、sideOfStreetHintRoutePlaceSideOfDestinationに与える影響を確認してください。

場所に複数のアクセスポイントが含まれている場合、ユーザーが適切なアクセスポイントを選択する必要があります。

開始点として経由地を設定します

旅程を開始する際 RoutingEngine に、適切な開始方向を選択するための追加のヒントを提供することができます。たとえば、必要な U ターンを実施するためです。

たとえば、次のように最初の見出し方向を指定できます。

startWaypoint.headingInDegrees = location.bearingInDegrees;

ユーザーが移動している場合、方位の値を使用してルートの計算を改善できます。 Location オブジェクトが配置ソースから取得され、ユーザーがすでに移動している場合、そのオブジェクトにはベアリング値が含まれていることに注意してください。 そうでない場合、設定されていない可能性があります。 このようなシナリオは、ガイダンス中により一般的になります。たとえば、ユーザーが提示されたパスから逸脱した後でルートを再計算する必要がある場合などです。

ルートを拡大表示します

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

CameraUpdate cameraUpdate = mapView.getCamera().calculateEnclosingCameraUpdate(
        route.getBoundingBox(),
        new Padding(10, 10, 10, 10));
mapView.getCamera().updateCamera(cameraUpdate);

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

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

操作手順を取得します

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

List<Section> sections = route.getSections();
for (Section section : sections) {
    logManeuverInstructions(section);
}

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

private void logManeuverInstructions(Section section) {
    Log.d(TAG, "Log maneuver instructions per route section:");
    List<Maneuver> maneuverInstructions = section.getManeuvers();
    for (Maneuver maneuverInstruction : maneuverInstructions) {
        ManeuverAction maneuverAction = maneuverInstruction.getAction();
        GeoCoordinates maneuverLocation = maneuverInstruction.getCoordinates();
        String maneuverInfo = maneuverInstruction.getText()
                + ", Action: " + maneuverAction.name()
                + ", Location: " + maneuverLocation.toString();
        Log.d(TAG, maneuverInfo);
    }
}

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

スクリーンショット: 操作手順を含むルートプレビューを示す画面の例。

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

API リファレンス では、利用可能 な操作の概要を確認できます。

ManeuverAction 次の表は、プレビューの説明とアセットの例を含むすべてのアイテムを示しています。 HERE SDK自体には、操作アイコンは付属していません。 アセットは、オープンソース のHEREアイコンライブラリの一部として、さまざまな密度のSVGまたはソリッドPNGとして利用できます。

使用可能な操作アクションは 、APIリファレンスに表示される順序でソートされます。

操作アクション 説明の例 アイコンの例
到着 「到着」などの到着操作。 中間ウェイポイントの説明例: 」に到着 <road name | waypoint>。 ルートの宛先の場合: 」に到着 <road name | destination name | destination>。 到着
CONTINUT_ON 「続行」などの操作を続行 <road name>します。 continue_on
出発 「開始位置 <road name>」などの出発操作。 出発します
左側からハイウェイを入力してください 「左側から高速道路に参加する」など、左側の操作から高速道路に入ります。 「_Highway_from_left」と入力します
右から _ ハイウェイ _ 開始 _ します 「右側から高速道路に参加する」など、右側の操作から高速道路に入ります。 「_Highway_From_right」と入力します
LEFT_EXIT 「左側の出口で降りる <next road name>」などの左側の出口操作。 LEFT_EXIT
Left_fork 左フォーク操作(「左フォークを上に移動 <next road name>」など)。 left_fork
LEFT_RAMP 「左ランプを進む」などの左ランプ操作。 左ランプ(Left_Ramp
LEFT_ROUND_ENTER 「ロータリーに入る」など、ロータリーを操作します ( 左側通行 ) 。
LEFT_ROUNDART_EXIT1 「ロータリーの最初の出口を出る」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT1アイコン
LEFT_ROUNDART_EXIT10 「ロータリーの10番出口を出てください」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT10アイコン
LEFT_ROUNDART_EXIT11 「ロータリーの11番出口を出る」などのロータリーマヌーバ(左側通行)。 LEFT_ROUNDABOUT_EXIT11アイコン
LEFT_ROUNDART_EXIT12 「ロータリーの12番出口を出る」などのロータリーマヌーバ(左側通行)。 LEFT_ROUNDABOUT_EXIT12アイコン
LEFT_ROUND_EXIT2 「ロータリーの2番目の出口を出る」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT2アイコン
LEFT_ROUNDART_EXIT3 「ロータリーの3番目の出口を出る」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT3アイコン
LEFT_ROUNDART_EXIT4 「ロータリーの4番目の出口を出る」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT4アイコン
LEFT_ROUNDART_EXIT5 「ロータリーの5番目の出口を出る」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT5アイコン
LEFT_ROUNDART_EXIT6 「ロータリーの6番目の出口を出る」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT6アイコン
LEFT_ROUNDART_EXIT7 「ロータリーの7番出口を出る」などのロータリーマヌーバ(左側通行)。 LEFT_ROUNDABOUT_EXIT7アイコン
LEFT_ROUNDART_EXIT8 「ロータリー8番出口を出る」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT8アイコン
LEFT_ROUNDART_EXIT9 「ロータリーの9番出口を出てください」などのロータリー操作(左側通行)。 LEFT_ROUNDABOUT_EXIT9アイコン
LEFT_ROUND_PASS 「ロータリーを通過する」など、ロータリーを操作します ( 左側通行 ) 。 LEFT_ROUNDABOUT_PASSアイコン
左折します 「左折」などの左折操作 <next road name>。 左旋回アイコン
左折 _U_TURN 「Uターンを行う <next road name>」などの左Uターン操作。 Left_U_Turnアイコン
midle_fork 「中央のフォークを上に移動 <next road name>」などのミドルフォーク操作。 ミドルフォークアイコン
right_exit 「Take the right exit to <next road name>」(右出口で降りる)などの右出口操作。 右の終了アイコン
right_fork 右フォーク操作(「右フォークを上に移動 <next road name>」など)。 右フォークアイコン
RIGHT_RAMP 右ランプ操作(「右ランプを進む」など)。 右ランプアイコン
RIGHT_ROUNDER_ENTER 「ロータリーに入る」など、ロータリーを操作します ( 右の交通量 ) 。 右環状交差点の入力アイコン
RIGHT_ROUNDART_EXIT1 「ロータリーの最初の出口を出る」などのロータリー操作(右側通行)。 右ロータリーの[終了1(終了)]アイコン
RIGHT_ROUNDART_EXIT10 「ロータリー10番出口を出て」などのロータリーマヌーバ(右側通行)。 右ロータリーの[終了10(終了)]アイコン
RIGHT_ROUNDART_EXIT11 「ロータリーの11番出口を出る」などのロータリーマヌーバ(右側通行)。 右ロータリーの[終了11(終了)]アイコン
RIGHT_ROUNDART_EXIT12 「ロータリーの12番出口を出る」などのロータリーマヌーバ(右側通行)。 RIGHT_ROUNDABOUT_EXIT12アイコン
RIGHT_ROUNDTRAVE_EXIT2 「ロータリーの2番目の出口を出る」などのロータリー操作(右側通行)。 RIGHT_ROUNDABOUT_EXIT2アイコン
RIGHT_ROUNDART_EXIT3 「ロータリーの3番目の出口を出る」などのロータリー操作(右側通行)。 RIGHT_ROUNDABOUT_EXIT3アイコン
RIGHT_ROUNDART_EXIT4 「ロータリーの4番目の出口を出る」などのロータリー操作(右側通行)。 RIGHT_ROUNDABOUT_EXIT4アイコン
RIGHT_ROUNDART_EXIT5 「ロータリーの5番目の出口を出る」などのロータリーマヌーバ(右側通行)。 RIGHT_ROUNDABOUT_EXIT5アイコン
RIGHT_ROUNDART_EXIT6 「ロータリーの6番目の出口を出る」などのロータリーマヌーバ(右側通行)。 RIGHT_ROUNDABOUT_EXIT6アイコン
RIGHT_ROUNDART_EXIT7 「ロータリーの7番出口を出る」などのロータリーマヌーバ(右側通行)。 RIGHT_ROUNDABOUT_EXIT7アイコン
RIGHT_ROUNDART_EXIT8 「ロータリー8番出口を出る」などのロータリー操作(右側通行)。 RIGHT_ROUNDABOUT_EXIT8アイコン
RIGHT_ROUNDART_EXIT9 「ロータリー9番出口を出て」などのロータリーマヌーバ(右側通行)。 RIGHT_ROUNDABOUT_EXIT9アイコン
RIGHT_ROUNDTRAVE_PASS 「ロータリーを通過する」など、ロータリーを操作します ( 右の交通量 ) 。 right_roundabout_passアイコン
右に曲がる( _T ) 「右折」などの右折操作 <next road name>。 右折アイコン
右 _U_TURN 右Uターン操作(「で右Uターンする <next road name>」など)。 RIGHT_U_TURNアイコン
sharp_left_turn 「急に左に曲がる <next road name>」などの急な左折操作。 シャープ左ターンアイコン
sharp_right_turn 急な右折操作(「右折してください」など <next road name>)。 シャープ右ターンアイコン
わずかに左折します 「左折してください <next road name>」など、少し左に曲がる操作。 SLETT_LEFT_TURNアイコン
わずかに右に曲がる 「右に曲がっ <next road name>て」などのわずかな右折操作。 ライト右ターンアイコン

LEFT_ROUNDABOUT_PASS 現時点では、およびのHEREアセットは RIGHT_ROUNDABOUT_PASS SVGとしてのみ使用でき、一部の操作アセットはサブフォルダ"wego-fallback-roundabout"でのみ使用できます。 PNG表現の場合、 MSDKUI オープンソースプロジェクトもフォールバックとして使用できます。

ルートに沿って交通状況を検索します

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

long estimatedTrafficDelayInSeconds = route.getTrafficDelay().getSeconds();

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

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

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

Section firstSection = route.getSections().get(0);
TrafficSpeed firstTrafficSpeed = firstSection.getSpans().get(0).getTrafficSpeed();

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

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

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

図 : 交通渋滞の要因。

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

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

TrafficSpeed表示値 jamFactorは 、道路タイプおよびその他のパラメータを考慮せずに、 trafficSpeedInMetersPerSecond/baseSpeedInMetersPerSecond - の比率から線形に計算されます。 したがって、提供さ jamFactor れたは、マップ ビュー のトラフィックフローの表示と正確に一致するとは限りません(有効な場合)。 さらに、は RoutingEngine予測位置情報サービスを使用 して、ルートを通過する間に今後のトラフィックを予測します。一方、トラフィックフローの視覚化は現在の時点のみを表します。

スクリーンショット: 渋滞係数を使用してルート上のトラフィックを視覚化。

ルートに沿ったトラフィックを表示する場合は MapPolyline 、セクションの各スパンに複数の色付きのオブジェクトをレンダリングすることを検討してください。

// This renders the traffic jam factor on top of the route as multiple MapPolylines per span.
private void showTrafficOnRoute(Route route) {
    if (route.getLengthInMeters() / 1000 > 5000) {
        Log.d(TAG, "Skip showing traffic-on-route for longer routes.");
        return;
    }

    for (Section section : route.getSections()) {
        for (Span span : section.getSpans()) {
            TrafficSpeed trafficSpeed = span.getTrafficSpeed();
            Color lineColor = getTrafficColor(trafficSpeed.jamFactor);
            if (lineColor == null) {
                // We skip rendering low traffic.
                continue;
            }
            float widthInPixels = 10;
            MapPolyline trafficSpanMapPolyline = new MapPolyline(span.getGeometry(), widthInPixels, lineColor);
            mapView.getMapScene().addMapPolyline(trafficSpanMapPolyline);
            mapPolylines.add(trafficSpanMapPolyline);
        }
    }
}

// Define a traffic color scheme based on the route's jam factor.
// 0 <= jamFactor < 4: No or light traffic.
// 4 <= jamFactor < 8: Moderate or slow traffic.
// 8 <= jamFactor < 10: Severe traffic.
// jamFactor = 10: No traffic, ie. the road is blocked.
// Returns null in case of no or light traffic.
@Nullable
private Color getTrafficColor(Double jamFactor) {
    if (jamFactor == null || jamFactor < 4) {
        return null;
    } else if (jamFactor >= 4 && jamFactor < 8) {
        return Color.valueOf(1, 1, 0, 0.63f); // Yellow
    } else if (jamFactor >= 8 && jamFactor < 10) {
        return Color.valueOf(1, 0, 0, 0.63f); // Red
    }
    return Color.valueOf(0, 0, 0, 0.63f); // Black
}

パフォーマンス上の理由から、長いルートのトラフィックレンダリングはスキップします。この例では、トラフィックを持つ各スパンが個別の折れ線としてレンダリングされるためです。

または、地図上でルートのポリインと並行して交通量スキームを表示できます。 ルートがトラフィックフローの回線をカバーしていないことを確認するには 、現在のズーム レベル for MapPolylineおよびMapArrowに基づいて、測定に依存する幅を設定します。

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

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

ルート上のトラフィックをレンダリングするだけでなく、に基づいてトラフィックインシデントをアイコンとして表示することも TrafficIncidentTypeできます。 Route 次のカテゴリは、オブジェクトの一部として重複しています。

  • ACCIDENT: 交通事故。
  • CONGESTION: 交通渋滞。
  • CONSTRUCTION: 建設工事。
  • DISABLED_VEHICLE: 道路上の車両が転覆または故障した。
  • LANE_RESTRICTION: 車線制限。
  • MASS_TRANSIT: 鉄道や地下鉄などの大量輸送機関を含む事件。
  • PLANNED_EVENT: スポーツイベントやフェスティバルなどの活動に関する事件。
  • ROAD_CLOSURE: 道路閉鎖。
  • ROAD_HAZARD: 木が倒れたり信号が消えたりするなど、道路上の危険な障害物。
  • WEATHER: 悪天候。
  • OTHER: 事件は既知であるが、他のどのカテゴリーにも当てはまらない。
  • UNKNOWN: 特定のインシデントタイプは指定されません。

HERE SDKではこのようなアイコンアセットは公開されませんが TRAFFIC_INCIDENTS 、マップフィーチャレイヤを有効にして、すべてのインシデントをマップ上にアイコン付きで表示できます。 同様に TRAFFIC_FLOW 、レイヤを有効にして、道路上の一般的なトラフィックフローを表示することもできます。 詳細 については、トラフィックセクションをご覧ください。

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

今後の制限速度などを確認できます

Route このオブジェクトは、に沿って詳細な情報を公開 Route し、今後の制限速度、道路の属性と道路名、動的な交通情報などを把握します。

Take a look at the following attributes: Span.sectionPolylineOffsetSpan.dynamicSpeedInfoSpan.streetAttributesSpan.carAttributesSpan.truckAttributesSpan.scooterAttributesSpan.walkAttributesSpan.durationInSecondsSpan.streetNamesSpan.routeNumbersSpan.speedLimitInMetersPerSecondSpan.consumptionInKilowattHoursSpan.functionalRoadClassSpan.durationSpan.baseDuration。 属性の完全なリストについては、 API リファレンス を参照してください。

各属性はスパンごとに指定され、スパンの全長にわたって有効です。 また、 2 つの交差点の間にある道路ネットワーク の一部を示すセグメント ID も検索されることがあります。 は Span 、ルート関連の概念です。ルートの一部で、同じ属性を持ちます。 同じセグメントに複数のスパンを含める ことができ、通常、各セグメントには開始オフセット終了オフセット があります。

Span ルートセグメントの最小の部分を定義 GeoCoordinatesし、その曲率がのリストとして公開されます。

ルートに沿ってトールのコストを取得できます

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

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

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

全般 PaymentMethodTollFare 的なToll情報を提供するトールのコストをsection.getTolls()取得します。

private void logTollDetails(Route route) {
    for (Section section : route.getSections()) {
        // The spans that make up the polyline along which tolls are required or
        // where toll booths are located.
        List<Span> spans = section.getSpans();
        List<Toll> tolls = section.getTolls();
        if (!tolls.isEmpty()) {
            Log.d(TAG, "Attention: This route may require tolls to be paid.");
        }
        for (Toll toll : tolls) {
            Log.d(TAG, "Toll information valid for this list of spans:");
            Log.d(TAG, "Toll system: " + toll.tollSystem);
            Log.d(TAG, "Toll country code (ISO-3166-1 alpha-3): " + toll.countryCode);
            Log.d(TAG, "Toll fare information: ");
            for (TollFare tollFare : toll.fares) {
                // A list of possible toll fares which may depend on time of day, payment method and
                // vehicle characteristics. For further details please consult the local
                // authorities.
                Log.d(TAG, "Toll price: " + tollFare.price + " " + tollFare.currency);
                for (PaymentMethod paymentMethod : tollFare.paymentMethods) {
                    Log.d(TAG, "Accepted payment methods for this price: " + paymentMethod.name());
                }
            }
        }
    }
}

道路の特徴を避けてください

AvoidanceOptions トンネル、高速道路、低排出ガス地帯(LEZ)、地域、フェリー、料金、その他の道路の特徴(急カーブなど)を除外するために使用します。 RoadFeatures'''' ZoneCategory GeoBox CountryCode エレメントなどのリストを渡すことができます

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

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

スクリーンショット: 回避エリアのない2つのルートと回避エリアのある2つのルート。

ルートがブロックされたエリアで開始されたときなど、設定されたオプションを回避できない場合 SectionNotice は、提供された要素でこのような違反を検査できます。 これらのルートが設定されている場合は、そのようなルートを拒否できます。

ルートを更新します

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

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

RefreshRouteOptions refreshRouteOptions = new 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(route.getRouteHandle(), mapMatchedWaypoint, refreshRouteOptions, new CalculateRouteCallback() {
    @Override
    public void onRouteCalculated(@Nullable RoutingError routingError, @Nullable List<Route> list) {
        if (routingError == null) {
            Route newRoute = list.get(0);
            // ...
        } else {
            // Handle error.
        }
    }
});

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

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

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

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

ルートに戻ります

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

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

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

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

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

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

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

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

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

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

一般 に、ルートをインポートすると、まったく同じRouteOptionsルートを使用しても、元のルートとまったく同じルートが再現されないことがあります。 新しい建設現場や関連する交通状況などにより、地図には常に変更が反映されることがあります。 また、マップ データ 自体は、道路や新しい道路で制限速度が変更された場合 や、既存の道路が閉鎖された場合などにも変更されます。 また、特定の道路を利用できる場合、出発時刻が影響を受けることがあります。

詳細については、以下を参照してください。

オプション 1 : 地理座標のリストからルートをインポートします

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

List<Location> locations = Arrays.asList (new Location(new GeoCoordinates(52.518032,13.420632)), new Location(new GeoCoordinates(52.51772,13.42038)),
        new Location(new GeoCoordinates(52.51764,13.42062)), new Location(new GeoCoordinates(52.51754,13.42093)),
        new Location(new GeoCoordinates(52.51735,13.42155)), new Location(new GeoCoordinates(52.51719,13.42209)),
        new Location(new GeoCoordinates(52.51707,13.42248)), new Location(new GeoCoordinates(52.51695,13.42285)),
        new Location(new GeoCoordinates(52.5168, 13.42331)), new Location(new GeoCoordinates(52.51661,13.42387)),
        new Location(new GeoCoordinates(52.51648,13.42429)), new Location(new GeoCoordinates(52.51618,13.42513)),
        new Location(new GeoCoordinates(52.5161,13.42537)),  new Location(new GeoCoordinates(52.51543,13.42475)),
        new Location(new GeoCoordinates(52.51514,13.42449)), new Location(new GeoCoordinates(52.515001,13.424374)));

routingEngine.importRoute(locations, new CarOptions(), new CalculateRouteCallback() {
    @Override
    public void onRouteCalculated(@Nullable RoutingError routingError, @Nullable List<Route> list) {
        if (routingError == null) {
            Route newRoute = list.get(0);
            // ...
        } else {
            // Handle error.
        }
    }
});

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

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

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

座標のリスト に制限はありません。 サポートされているアイテムの最大数については、 API リファレンス を参照してください。 同様に、ウェイポイントのリスト には制限はありません

Additionally, you can use an overload of the importRoute(..) method to specify a list of RouteStop elements. When importing a route just from a list of coordinates, the information on stopover waypoints is usually lost. Use the RouteStop class to specify such stops. It allows to specify a locationIndex where the stop should be done and a stopDuration. This will influence the overall ETA and during navigation the RouteStop will be treated as a stopover waypoint so that it will be reported as a Milestone when passing-by (note that navigation is only supported for the Navigate Edition).

この機能を使用するには、すべての提供ポイントを道路にマップする必要があります。 そのため、から(より長い)ルートをインポートする場合よりも RouteHandle、かなり遅くなることがあります。

オプション 2 : RouteHandle からルートをインポートします

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

次に、ルートハンドル文字列を使用してルートを作成する REST API コールの例を示し YOUR_API_KEY ます(使用している実際のキーで置き換えます)。

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(new RouteHandle("routeHandleStringFromBackend"),
                          new RefreshRouteOptions(TransportMode.CAR),
                          new CalculateRouteCallback() {
            @Override
            public void onRouteCalculated(@Nullable RoutingError routingError, @Nullable List<Route> list) {
                if (routingError == null) {
                    Route newRoute = list.get(0);
                    // ...
                } else {
                    // Handle error.
                }
            }
        });

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

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

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

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

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

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

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

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

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

List<Integer> rangeValues = Collections.singletonList(400);

IsolineOptions.Calculation calculationOptions =
        new IsolineOptions.Calculation(IsolineRangeType.CONSUMPTION_IN_WATT_HOURS, rangeValues, IsolineCalculationMode.BALANCED);
IsolineOptions isolineOptions = new IsolineOptions(calculationOptions, getEVCarOptions());

routingEngine.calculateIsoline(new Waypoint(startGeoCoordinates), isolineOptions, new CalculateIsolineCallback() {
    @Override
    public void onIsolineCalculated(RoutingError routingError, List<Isoline> list) {
        if (routingError != null) {
            showDialog("Error while calculating reachable area:", routingError.toString());
            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.
        Isoline isoline = list.get(0);

        // 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 geoPolygon : isoline.getPolygons()) {
            // Show polygon on map.
              Color fillColor = Color.valueOf(0, 0.56f, 0.54f, 0.5f); // RGBA
            MapPolygon mapPolygon = new MapPolygon(geoPolygon, fillColor);
            mapView.getMapScene().addMapPolygon(mapPolygon);
            mapPolygons.add(mapPolygon);
        }
    }
});

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

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

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

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

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

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

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

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

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

操縦プレビュー用のロードシールドアイコンを取得します

では iconProvider.createRoadShieldIcon(...)Bitmap 「 A7 」や「 US-101 」などの道路番号がマップ ビューにすでに表示されているように、非同期でを作成できます。

道路シールドアイコンの作成はオフラインで行われ、インターネット接続は必要ありません。 アイコンの作成に必要なデータは、そのアイコン Route 自体からのみ取得されますが、手動で入力することもできます。

ロードシールドアイコンの例。

Navigate Edition開発者ガイドでは 、ターンバイターンの例で使用例をガイダンスセクションに記載しています。 ReroutingGitHub のアプリの例も参照してください。 naviate Edition が必要ですが、のコードは IconProvider 他のエディションでも使用できます。たとえば、ルートプレビューの一部として道路シールドアイコンを表示する場合に使用できます。

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

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

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

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

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

routingEngine.calculateRoute(waypoints, getEVCarOptions(), new CalculateRouteCallback() {
    @Override
    public void onRouteCalculated(RoutingError routingError, List<Route> list) {
        if (routingError != null) {
            showDialog("Error while calculating a route: ", routingError.toString());
            return;
        }

        // Use routes from list.
    }
});

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

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

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

private EVCarOptions getEVCarOptions()  {
    EVCarOptions evCarOptions = new 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 = new HashMap<Integer, Double>() {{
        put(0, 0.239);
        put(27, 0.239);
        put(60, 0.196);
        put(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 = new AvoidanceOptions();
    evCarOptions.routeOptions.speedCapInMetersPerSecond = null;
    evCarOptions.routeOptions.optimizationMode = OptimizationMode.FASTEST;
    evCarOptions.batterySpecifications.connectorTypes =
            new ArrayList<>(Arrays.asList(ChargingConnectorType.TESLA,
                ChargingConnectorType.IEC_62196_TYPE_1_COMBO, ChargingConnectorType.IEC_62196_TYPE_2_COMBO));
    evCarOptions.batterySpecifications.totalCapacityInKilowattHours = 80.0;
    evCarOptions.batterySpecifications.initialChargeInKilowattHours = 10.0;
    evCarOptions.batterySpecifications.targetChargeInKilowattHours = 72.0;
    evCarOptions.batterySpecifications.chargingCurve = new HashMap<Double, Double>() {{
        put(0.0, 239.0);
        put(64.0, 111.0);
        put(72.0, 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.
int additionalSectionCount = route.getSections().size() - 1;
if (additionalSectionCount > 0) {
    // Each additional waypoint splits the route into two sections.
    Log.d("EVDetails", "Number of required stops at charging stations: " + additionalSectionCount);
} else {
    Log.d("EVDetails","Based on the provided options, the destination can be reached without a stop at a charging station.");
}

int sectionIndex = 0;
List<Section> sections = route.getSections();
for (Section section : sections) {
    EVDetails evDetails = section.getEvDetails();
    if (evDetails == null) {
        return;
    }    
    Log.d("EVDetails", "Estimated net energy consumption in kWh for this section: " + evDetails.consumptionInKilowattHour);
    for (PostAction postAction : section.getPostActions()) {
        switch (postAction.action) {
            case CHARGING_SETUP:
            Log.d("EVDetails", "At the end of this section you need to setup charging for " + postAction.duration.getSeconds() + " s.");
                break;
            case CHARGING:
            Log.d("EVDetails", "At the end of this section you need to charge for " + postAction.duration.getSeconds() + " s.");
                break;
            case WAIT:
            Log.d("EVDetails", "At the end of this section you need to wait for " + postAction.duration.getSeconds() + " s.");
                break;
            default: throw new RuntimeException("Unknown post action type.");
        }
    }

    Log.d("EVDetails", "Section " + sectionIndex + ": Estimated battery charge in kWh when leaving the departure place: " + section.getDeparturePlace().chargeInKilowattHours);
    Log.d("EVDetails", "Section " + sectionIndex + ": Estimated battery charge in kWh when leaving the arrival place: " + section.getArrivalPlace().chargeInKilowattHours);

    // Only charging stations that are needed to reach the destination are listed below.
    ChargingStation depStation = section.getDeparturePlace().chargingStation;
    if (depStation != null  && depStation.id != null && !chargingStationsIDs.contains(depStation.id)) {
        Log.d("EVDetails", "Section " + sectionIndex + ", name of charging station: " + depStation.name);
        chargingStationsIDs.add(depStation.id);
        addCircleMapMarker(section.getDeparturePlace().mapMatchedCoordinates, R.drawable.required_charging);
    }

    ChargingStation arrStation = section.getDeparturePlace().chargingStation;
    if (arrStation != null && arrStation.id != null && !chargingStationsIDs.contains(arrStation.id)) {
        Log.d("EVDetails", "Section " + sectionIndex + ", name of charging station: " + arrStation.name);
        chargingStationsIDs.add(arrStation.id);
        addCircleMapMarker(section.getArrivalPlace().mapMatchedCoordinates, R.drawable.required_charging);
    }

    sectionIndex += 1;
}

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

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

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

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

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

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

充電ステーションを探しています

オンラインSearchEngineで、 EVChargingPoolの一部であるEVChargingStationコネクターを検索できます 。 電気自動車用の充電プールは、 1 つ以上の充電ステーションを備えたエリアです。

PlaceCategory.BUSINESS_AND_SERVICES_EV_CHARGING_STATION プールの検索に使用します。 Place 結果のDetailsで、ステーションを含む検出されたプールのリストがある場合は、そのリストを見つけることができます。

OfflineSearchEngineお使いの HERE SDK のエディションでこのエンジンがサポートされている場合は、でステーションを検索することもできます。

この検索機能を使用するに SearchEngineは、オンラインで使用するためのライセンスが必要です。 で使用 OfflineSearchEngineする場合、ライセンスは必要ありません。 アクセス権を取得するには、弊社に連絡してください。 資格情報が有効になっていない場合 SearchError.FORBIDDEN は、不足しているライセンスを示すエラーが表示されます。

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

消費モデルを定義します

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

  • 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サンプルのアプリを見つける ことができます。

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

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