ルーティング : 道順を取得します
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 の初期化が事前に失敗した場合に、このようなエラーが発生することがあります。
注
Application
の onCreate()
メソッド中にこのエンジンを初期化することはできません。 それ以外の時点では問題はありません。 たとえば、このエンジンを初期化するのに適した場所は、Activity
の onCreate()
メソッドに含まれている可能性があります。
次のステップでは、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
を確認することをお勧めします。 NoticeCode
はNotice
オブジェクトの一部です。 可能な Notice
オブジェクトのリストには、Route
の Section
ごとにアクセスでき ます。 - 違反が発生しなかった場合、リストは空になります。
- 違反の可能性 がある場合は、少なくとも 1 つの違反を含むルートをスキップすることをお勧めします。
ただし、要求されたルートオプションおよび実際の NoticeCode
値のリストによって、実装はケースバイケースに判断します。 ルートオプションの詳細については、次のセクションを参照してください。 重要 : わかりやすいよう に、このガイドのコードスニペットでは、通知の 列挙型 (enum) 値を評価しません。
次の方法で、可能性のあるルート通知を検出できます。
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()
は 、ルートオプションからトランスポートモードを決定しますが 、Route
各Section
は異なるトランスポートモードを持つことができます。 route.getSectionTransportMode()
特定のセクションで使用する必要がある実際のSectionTransportMode
を提供 します。上記のトランスポートモードに加えて、ferry
やcarShuttleTrain
などのトランスポートモードも一覧表示されます。
デフォルト Section
では、始点と終点の経由地 のみを通過する場合、結果のルートには 1 つのルートのみが含まれます。 各 route
オブジェクトには、設定されている経由地 モードおよびトランスポートモードの数に応じて、より多くのルートセクションを含めることができます。 セクションは 、 ルートを複数の論理パーツに分割するルートレッグとして機能します。 この HERE の詳細情報を参照できます。
ルートを計算する前に、メイントランスポートモードがユーザーによって指定されますが、最終的なトランスポートモードは、ごとにルーティングエンジンによって設定 Section
されます。
注
に Route
は複数のを含めることができ SectionTransportMode
ます。 このような場合、ルートは Section
別のルートに分割され、輸送モードの変更が示されます。 基本的に、輸送モードを変更するには 、たとえばフェリーに乗るために車を出るときに、旅行の停止が必要です。 ただし、マルチモーダルルーティング (または インターモーダルルーティング)はサポートされていません。 目的地として公園内の観光スポットが含まれている場合、最後のウェイポイントは、車で到達可能な公園の前の最後の場所にマップされ、ルートには歩行者セクションは含まれません。
このようなギャップは 、RoutePlace
オブジェクトのmapMatchedCoordinates
とoriginalCoordinates
を比較することで検出できます。 フォールバックとして、適切なトランスポートモードを使用して、これら 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 への公共交通機関のルートを計算します。その間には複数の経由地があります。 GitHub で PublicTransit のサンプルアプリを探し て、その方法を確認できます。
追加の経由地でルートを形成します
デフォルトでは、出発および目的経由地のみを設定すると、結果のルートには1つのルート Section
のみが含まれます。 各ルートオブジェクトには、設定されている経由地の数に応じて、より多くのルートセクションを含めることができます。 セクションは、ルートを複数の論理パーツに分割するルートレッグとして機能します。
経由地は、より多くのセクションまたはルートの形状を決定するためにユーザーが設定できる座標です ( フェリーで川を横断する場合などに便利です ) 。
オンライン RoutingEngine
でサポートされている経由地 の数は、最大で約 200 経由地 に制限されています。
経由地には、次の 2 つのタイプがあります。
-
STOPOVER
: デフォルトの経由地タイプ。 このポイントが通過することが保証されているため、操作指示のリストに表示され、ルートが別々のルートセクションに分割されます。 -
PASS_THROUGH
: 操作指示リストに表示されない場合があり、タッチ入力の結果など、ルートを形成するヒントとして扱われます。 このタイプ では、ルートは別々のセクションに分割されません。
新しい Waypoint
オブジェクトを作成する場合、STOPOVER
タイプはデフォルトで設定されます。このタイプは、最初と最後の経由地で使用されるタイプである必要があります。 2 つの経由地のみが始点および終点として機能する場合、ルートは次のようになります。
出発地点と目的地の間に 1 つのルートセクションがあります。 RoutingEngine
は複数の経由地を処理できます。 基本となるアルゴリズムは、提供された List
と WaypointType
の順序と同様に、すべての経由地を接続するための最適なパスを探します。 各 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
オブジェクトから取得できます。
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 には、指定された輸送モードなどのさまざまなパラメータを使用して、座標の各セットに最も近いルートセグメントを検索する高度な技術が組み込まれています。 このプロセスを マップマッチングと呼びます。
ただし、ルートのシェイプは、マップが一致した経由地だけで構成されます。
各Section
Route
について 、セクションの最初(出発地)および最後(到着地)にあるRoutePlace
にアクセスできます。 Routeplace
パラメーター として渡された内容mapMatchedCoordinates
とoriginalCoordinates
が含まれています。 両方を同じにすることも、異なるにすることもできます それらが異なっていれ 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()) {
destinationWaypoint.coordinates = accessPoints.get(0);
destinationWaypoint.sideOfStreetHint = place.getGeoCoordinates();
destinationWaypoint.matchSideOfStreet = MatchSideOfStreet.ALWAYS;
}
結果 Route
のオブジェクトのRoutePlace
には、 経由地がアクセスポイントに設定されたときにACCESS_POINT
設定されたRoutePlaceType
が含まれています。
上の図を参照し て、sideOfStreetHint
がRoutePlace
のSideOfDestination
に与える影響を確認してください。
場所に複数のアクセスポイントが含まれている場合、ユーザーが適切なアクセスポイントを選択する必要があります。
開始点として経由地を設定します
旅程を開始する際 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>します。 | |
出発 | 「開始位置 <road name>」などの出発操作。 | |
左側からハイウェイを入力してください | 「左側から高速道路に参加する」など、左側の操作から高速道路に入ります。 | |
右から _ ハイウェイ _ 開始 _ します | 「右側から高速道路に参加する」など、右側の操作から高速道路に入ります。 | |
LEFT_EXIT | 「左側の出口で降りる <next road name>」などの左側の出口操作。 | |
Left_fork | 左フォーク操作(「左フォークを上に移動 <next road name>」など)。 | |
LEFT_RAMP | 「左ランプを進む」などの左ランプ操作。 | |
LEFT_ROUND_ENTER | 「ロータリーに入る」など、ロータリーを操作します ( 左側通行 ) 。 | |
LEFT_ROUNDART_EXIT1 | 「ロータリーの最初の出口を出る」などのロータリー操作(左側通行)。 | |
LEFT_ROUNDART_EXIT10 | 「ロータリーの10番出口を出てください」などのロータリー操作(左側通行)。 | |
LEFT_ROUNDART_EXIT11 | 「ロータリーの11番出口を出る」などのロータリーマヌーバ(左側通行)。 | |
LEFT_ROUNDART_EXIT12 | 「ロータリーの12番出口を出る」などのロータリーマヌーバ(左側通行)。 | |
LEFT_ROUND_EXIT2 | 「ロータリーの2番目の出口を出る」などのロータリー操作(左側通行)。 | |
LEFT_ROUNDART_EXIT3 | 「ロータリーの3番目の出口を出る」などのロータリー操作(左側通行)。 | |
LEFT_ROUNDART_EXIT4 | 「ロータリーの4番目の出口を出る」などのロータリー操作(左側通行)。 | |
LEFT_ROUNDART_EXIT5 | 「ロータリーの5番目の出口を出る」などのロータリー操作(左側通行)。 | |
LEFT_ROUNDART_EXIT6 | 「ロータリーの6番目の出口を出る」などのロータリー操作(左側通行)。 | |
LEFT_ROUNDART_EXIT7 | 「ロータリーの7番出口を出る」などのロータリーマヌーバ(左側通行)。 | |
LEFT_ROUNDART_EXIT8 | 「ロータリー8番出口を出る」などのロータリー操作(左側通行)。 | |
LEFT_ROUNDART_EXIT9 | 「ロータリーの9番出口を出てください」などのロータリー操作(左側通行)。 | |
LEFT_ROUND_PASS | 「ロータリーを通過する」など、ロータリーを操作します ( 左側通行 ) 。 | |
左折します | 「左折」などの左折操作 <next road name>。 | |
左折 _U_TURN | 「Uターンを行う <next road name>」などの左Uターン操作。 | |
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 | 「ロータリーの最初の出口を出る」などのロータリー操作(右側通行)。 | |
RIGHT_ROUNDART_EXIT10 | 「ロータリー10番出口を出て」などのロータリーマヌーバ(右側通行)。 | |
RIGHT_ROUNDART_EXIT11 | 「ロータリーの11番出口を出る」などのロータリーマヌーバ(右側通行)。 | |
RIGHT_ROUNDART_EXIT12 | 「ロータリーの12番出口を出る」などのロータリーマヌーバ(右側通行)。 | |
RIGHT_ROUNDTRAVE_EXIT2 | 「ロータリーの2番目の出口を出る」などのロータリー操作(右側通行)。 | |
RIGHT_ROUNDART_EXIT3 | 「ロータリーの3番目の出口を出る」などのロータリー操作(右側通行)。 | |
RIGHT_ROUNDART_EXIT4 | 「ロータリーの4番目の出口を出る」などのロータリー操作(右側通行)。 | |
RIGHT_ROUNDART_EXIT5 | 「ロータリーの5番目の出口を出る」などのロータリーマヌーバ(右側通行)。 | |
RIGHT_ROUNDART_EXIT6 | 「ロータリーの6番目の出口を出る」などのロータリーマヌーバ(右側通行)。 | |
RIGHT_ROUNDART_EXIT7 | 「ロータリーの7番出口を出る」などのロータリーマヌーバ(右側通行)。 | |
RIGHT_ROUNDART_EXIT8 | 「ロータリー8番出口を出る」などのロータリー操作(右側通行)。 | |
RIGHT_ROUNDART_EXIT9 | 「ロータリー9番出口を出て」などのロータリーマヌーバ(右側通行)。 | |
RIGHT_ROUNDTRAVE_PASS | 「ロータリーを通過する」など、ロータリーを操作します ( 右の交通量 ) 。 | |
右に曲がる( _T ) | 「右折」などの右折操作 <next road name>。 | |
右 _U_TURN | 右Uターン操作(「で右Uターンする <next road name>」など)。 | |
sharp_left_turn | 「急に左に曲がる <next road name>」などの急な左折操作。 | |
sharp_right_turn | 急な右折操作(「右折してください」など <next road name>)。 | |
わずかに左折します | 「左折してください <next road name>」など、少し左に曲がる操作。 | |
わずかに右に曲がる | 「右に曲がっ <next road name>て」などのわずかな右折操作。 | |
LEFT_ROUNDABOUT_PASS
現時点では、およびのHEREアセットは RIGHT_ROUNDABOUT_PASS
SVGとしてのみ使用でき、一部の操作アセットはサブフォルダ"wego-fallback-roundabout"でのみ使用できます。 PNG表現の場合、 MSDKUI オープンソースプロジェクトもフォールバックとして使用できます。
ルートに沿って交通状況を検索します
渋滞に巻き込まれた場合の総時間を取得するには、次のいずれかの操作を行います。
long estimatedTrafficDelayInSeconds = route.getTrafficDelay().getSeconds();
ルートの個々のセクションでは、交通状況に関するより詳細な情報を利用できます。 操作に加えて(上記を参照)、各Section
Route
には、ルートが計算された時点のトラフィックフローの状況に関する情報が含まれています。
各インスタンス Section
には、さまざまな量 TrafficSpeed
のインスタンスを含めることができます。 これらの値は Span
、次のまでの間有効 Span
です。 各 Span
ジオメトリは、フルルートのポリライン 形状の一部であるポリライン で表されます。
次のコード スニペットは Section
の最初の Span
の TrafficSpeed
要素を取得する方法を示しています。
Section firstSection = route.getSections().get(0);
TrafficSpeed firstTrafficSpeed = firstSection.getSpans().get(0).getTrafficSpeed();
TrafficSpeed
に baseSpeedInMetersPerSecond
はが含まれています。これは、予想されるデフォルトの走行速度です。 これは、道路の現在の制限速度とは異なる場合があります。道路状況が悪いと、走行速度が遅くなる可能性があります。 さらに、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
、セクションの各スパンに複数の色付きのオブジェクトをレンダリングすることを検討してください。
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) {
continue;
}
float widthInPixels = 10;
MapPolyline trafficSpanMapPolyline = new MapPolyline(span.getGeometry(), widthInPixels, lineColor);
mapView.getMapScene().addMapPolyline(trafficSpanMapPolyline);
mapPolylines.add(trafficSpanMapPolyline);
}
}
}
@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);
} else if (jamFactor >= 8 && jamFactor < 10) {
return Color.valueOf(1, 0, 0, 0.63f);
}
return Color.valueOf(0, 0, 0, 0.63f);
}
パフォーマンス上の理由から、長いルートのトラフィックレンダリングはスキップします。この例では、トラフィックを持つ各スパンが個別の折れ線としてレンダリングされるためです。
注
または、地図上でルートのポリインと並行して交通量スキームを表示できます。 ルートがトラフィックフローの回線をカバーしていないことを確認するには 、現在のズーム レベル 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.sectionPolylineOffset
、Span.dynamicSpeedInfo
、Span.streetAttributes
、Span.carAttributes
、Span.truckAttributes
、Span.scooterAttributes
、Span.walkAttributes
、Span.durationInSeconds
、Span.streetNames
、Span.routeNumbers
、Span.speedLimitInMetersPerSecond
、Span.consumptionInKilowattHours
、Span.functionalRoadClass
、Span.duration
、Span.baseDuration
。 属性の完全なリストについては、 API リファレンス を参照してください。
各属性はスパンごとに指定され、スパンの全長にわたって有効です。 また、 2 つの交差点の間にある道路ネットワーク の一部を示すセグメント ID も検索されることがあります。 は Span
、ルート関連の概念です。ルートの一部で、同じ属性を持ちます。 同じセグメントに複数のスパンを含める ことができ、通常、各セグメントには開始オフセット と終了オフセット があります。
は Span
ルートセグメントの最小の部分を定義 GeoCoordinates
し、その曲率がのリストとして公開されます。
ルートに沿ってトールのコストを取得できます
ルートの個々のセクションに沿って、トールのコストを計算できます。
注
これはこの機能のベータ版です。このため、いくつかのバグや予期しない動作が発生する可能性があります。 関連する API は、非推奨プロセスなしで新しいリリースで変更されることがあります。
routeOptions.enableTolls
トールのコストを取得するには、フラグを設定する必要があります。 false
デフォルトでは、に設定されています。 このフラグを有効にすると 、 API リファレンス で定義されているように、トールの該当するトランスポートモードのトールデータが要求されます。
全般 PaymentMethod
TollFare
的なToll
情報を提供するトールのコストをsection.getTolls()
取得します。
private void logTollDetails(Route route) {
for (Section section : route.getSections()) {
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) {
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);
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 {
}
}
});
このためには、ルートが計算される前にRouteOptions.enableRouteHandle()
経由で要求されるRouteHandle
を把握しておく必要があります。
また、ルートの更新は、ルートオプションをあるトランスポートタイプから別のトランスポートタイプに変換したり、特定のオプションを更新したりする場合に役立ちます。 たとえば、徒歩ルートがトラックルートに変換されたなど、変換ができない場合、 routingError
はこれを示します。
新しい出発地点を指定して、ルートを短縮することもできます。 新しいルートは計算されないため、新しい出発地点は元のルートに非常に近い位置にある必要があります。 新しい出発地点が遠すぎると、routingError
が発生します。
進行中のターン・バイ・ターンナビ (矢印ナビ)中にドライバーがルートから逸脱した場合、迂回路の計算を新たに行う必要があるため、ルートを更新するだけでは不十分です。 このような場合 returnToRoute()
は、新しい出発地点を設定してルート全体を再計算するか、または元の代替ルートを保持できる方法を使用すると便利です。
ルートに戻ります
RoutingEngine
は、現在の交通状況に基づいて既存のルート(上記を参照)を更新できます。 結果として、前のルートよりも高速な新しいルートが作成されることがあります。 ただし、新しい startingPoint
ルートは元のルートに非常に近いものにする必要があります。
startingPoint
がルートから離れている場合に対処する必要がある場合は、RoutingEngine
のreturnToRoute()
機能を使用することを検討してください。 たとえば、ローカルの交通状況により、ドライバーが迂回路を選択する場合があります。 また、コール 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 : 地理座標のリストからルートをインポートします
RouteOptions
のGeoCoordinates
リストからルートをインポートする には、ルートシェイプを定義する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 {
}
}
});
このオプションで importRoute()
は、目的の転送タイプに一致するメソッドの過負荷を選択できます。
GeoCoordinates
RouteOptions
のリストからルートをインポートすると 、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 {
}
}
});
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;
}
Isoline isoline = list.get(0);
for (GeoPolygon geoPolygon : isoline.getPolygons()) {
Color fillColor = Color.valueOf(0, 0.56f, 0.54f, 0.5f);
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 の開発者ガイドでは 、ターンバイターンの例で使用例をガイダンスセクションに記載しています。 Rerouting
GitHub のアプリの例も参照してください。 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;
}
}
});
デフォルトでは、EVRouteOptions
は、エネルギー不足なしで目的地に到達できるようにするために必要なパラメータを含めません。
これを確実 に行うには、ルートにチャージステーションを追加するために必要なパラメータを設定する必要があります。また、全体的な移動時間の結果を最適化する必要があります。
以下に、このようなオプションの作成例を示します。
private EVCarOptions getEVCarOptions() {
EVCarOptions evCarOptions = new EVCarOptions();
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);
}};
evCarOptions.routeOptions.alternatives = 0;
evCarOptions.ensureReachability = true;
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);
}};
return evCarOptions;
}
HERE では、 EVConsumptionModel
電気自動車のエネルギー消費モデルを指定するようにを定義します。 また、BatterySpecifications
を追加します 。 これらのオプションを使用すると、追加のストップオーバーとして追加のチャージステーションをルートに挿入できます。つまり、挿入されたチャージステーションの数に応じて、ルートがより多くのセクションに分割されます。
注
このような必要な充電ステーションを含める場合は、必ずを使用 OptimizationMode.FASTEST
してください。 ensureReachability
また、 true に設定する必要があります。 ensureReachability
がアクティブ化 されている場合、必要な充電ステーションが結果の経路に沿って移動し、必要な充電ステーションがroute
にWayPoint
アイテムとして追加されるようにルートを調整できます。
すべてのオプションが、電気自動車のルートの計算にかかる時間に影響を与える可能性があります。 最も重要なのは、に設定されている大容量のバッテリー totalCapacityInKilowattHours
では、充電の停止や、旅程開始時のフル装備のバッテリーの必要性が低減されることです。詳細について initialChargeInKilowattHours
は、以下を参照してください。 比較的低い値は、ルートの先頭付近に充電ステーションが含まれている必要があることを意味します。 そうしないと、ルートの計算に失敗する可能性があります。
現在、エンジンには 使用中の充電ステーションのみが含まれています。 アウトオブサービスまたはメンテナンス中のチャージステーションは考慮されません。 ただし、チャージステーションでの動的な状況のため、エンジンは、ステーションが現在使用中または予約済みであるかどうかを判断しません。 最悪の場合、駅に到着したときに、別の車を充電するために現在使用されている可能性があります。
また、利用可能なバッテリーコネクタタイプも指定しているため、車両を充電するための互換性のあるコネクタを提供していない充電ステーションは除外されます。
注
通常、車自体から消費量および電池の情報を取るか、またはマニュアルかあなたの車の製造業者に直接相談できる。 すべての情報が利用できるわけではありません。また、一部の情報はメーカーのみが把握している場合があります。 いずれの場合も、ルート計算プロセスでは指定された仕様が考慮され、不足している値に適切なデフォルト値が入力されます。
特に電気自動車を使用した長距離ドライブの場合は、途中で充電の停止を計画することが重要です。 結局のところ、チャージステーションはガソリンスタンドよりもはるかに一般的ではありません。 上記のオプションを使用する と、RoutingEngine
は最速のルート(すなわち、目的地に到達するために消費された全体的な時間が最も短いルート)を探し、その間に車両のエネルギーが不足しないようにします。
この計算結果は、「 ルートに沿った検索 」セクションに示されているように、電気自動車向けに最適化されたルートです。経路に沿って見つかった充電ステーションを追加するだけではありません。
route
が計算されると、より有用な情報を収集できます。 以下に示すコード スニペットには、Section
ごとの推定エネルギー消費量が記録さ れ、必要に応じてバッテリーを充電するために必要な処置が一覧表示されます。
int additionalSectionCount = route.getSections().size() - 1;
if (additionalSectionCount > 0) {
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);
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
が使用されます。
注
GitHub でEVRouting
サンプルのアプリを見つける ことができます。