道順を確認します
HERE SDK は RoutingEngine
、 A から B までの最適なルート方向を計算するための本格的な機能を提供します。これには、複数の経由地 と、各ターンのローカライズ可能な操作手順が含まれます。
目的のルートタイプ(最速または最短)およびさまざまなルートオプション(速度プロファイル、ルート制限、ビネットオプションなど)を設定して、エネルギーを最も節約する最適なルートを検索することで、設定を指定します。 先進的なルーティング技術と専用の EV ルートプランニングサポートにより、 HERE は 地球をよりクリーンで安全にするお手伝い をします。
機能の概要 :
- ルートの計算: さまざまなトランスポートモードで複数の経由地を使用してルートを計算します。
- 等値線 (Isoline) ルーティング: 時間、距離、または燃料消費量に基づいて、特定のポイントからの到達範囲を表す 等値線 (Isoline) ポリゴンを計算します。
- ルートに沿って検索: ルート全体に沿って場所を検索 します(この機能については、「検索」セクションで説明します)。
- ルートのインポート / ルートの一致: 他の API からルートをインポートできます。
- オフラインルーティング: インターネット接続が利用できない場合は、専用のオフラインルーティングエンジンに切り替えて、キャッシュ済みのマップ データまたは事前にロードされたオフラインマップデータのルートを計算できます。
ルートを取得します
HERE SDK では、次のルートタイプがサポートされています。
- 車でのルート案内
- タクシー乗り場への行き方。
- 徒歩ルート案内
- 自転車ルート案内
- カスタマイズ性の高いトラックオプションを備えたトラックルートの道順。
- スクーターのルート案内所。
- バスのルート案内所がある。
- 電気自動車が 最寄りの充電ステーションを見つけるためのルート(計算されたエネルギー消費量およびバッテリー仕様に基づく)。
- 高度にカスタマイズ可能な交通手段を備えた公共交通機関のルート
TransitRoutingEngine
(経由地)。
注
すべてのトランスポートモードは、でのオンラインルート計算に使用 RoutingEngine
できます。 一部の転送モードは、キャッシュされたマップ データ でのオフラインルートの計算、またはとともにダウンロード OfflineRoutingEngine
されたオフラインマップにも使用できます。 サポートされているオフラインモードの概要について は、 HEREを参照してください。
各ルートタイプは CarOptions
、またはなどの利用可能なルートオプションのいずれかによって決定さ TruckOptions
れます。 サポートされている各トランスポートモードで利用可能なすべてのルートオプションを検索します。 HERE これらのオプションは、ルートエンジン calculateRoute()
のメソッドで使用可能な過負荷に設定できます。
ルートエンジンを次のように作成して、旅程を開始します。
try {
_routingEngine = RoutingEngine();
} on InstantiationException {
throw ("Initialization of RoutingEngine failed.");
}
新しい RoutingEngine
インスタンスを作成すると、上の図のように処理する必要があるエラーがスローされることがあります。 たとえば、 HERE SDK の初期化が事前に失敗した場合に、このようなエラーが発生することがあります。
注
Application
の onCreate()
メソッド中にこのエンジンを初期化することはできません。 それ以外の時点では問題はありません。 たとえば、このエンジンを初期化するのに適した場所は、Activity
の onCreate()
メソッドに含まれている可能性があります。
次のステップでは、2 つの経由地(開始位置と宛先)(GeoCoordinates
インスタンスを保持するタイプWaypoint
の両方)に基づいてルートを計算できます。 以下では、車両に最適化されたルートを計算するために CarOptions
のデフォルトを設定します。
Future<void> addRoute() async {
var startGeoCoordinates = _createRandomGeoCoordinatesInViewport();
var destinationGeoCoordinates = _createRandomGeoCoordinatesInViewport();
var startWaypoint = Waypoint.withDefaults(startGeoCoordinates);
var destinationWaypoint = Waypoint.withDefaults(destinationGeoCoordinates);
List<Waypoint> waypoints = [startWaypoint, destinationWaypoint];
_routingEngine.calculateCarRoute(waypoints, CarOptions(),
(RoutingError? routingError, List<here.Route>? routeList) async {
if (routingError == null) {
here.Route route = routeList!.first;
_showRouteDetails(route);
_showRouteOnMap(route);
_logRouteViolations(route);
} else {
var error = routingError.toString();
_showDialog('Error', 'Error while calculating a route: $error');
}
});
}
複数の calculateRoute()
をコールすることができます。たとえば、異なるルーティングオプションを持つルートを並行して計算するために、このルートを呼び出すことができます。
注
ヒント : ドライバーが走行している場合、方位値はルート計算の改善に役立つことがあります。startWaypoint.headingInDegrees = currentLocation.bearingInDegrees;
。
各ルート計算は非同期で実行されます。 完了すると、エラーの可能性があるRoute
リストまたはRoutingError
が表示されます。 すべて問題が解決した場合 RoutingError
は、 null になります。 エラーが発生した場合、ルートリストはヌルになります。 たとえば、指定した輸送モードでルートが実行できない場合、エンジンはルートを計算できません。
注
エラーがない場合 、ルートリストには 1 つの結果のみが含まれます。 ルートオプションを使用して代替ルートの数を指定することで 、追加 のルートバリアントを要求できます。 デフォルトでは、代替ルートなしでルートが計算されます。
上記のコード スニペットの _showRouteDetails()
メソッドを使用して、操縦指示を含むルートの詳細を表示します。 すべてのソースコードは、付属のサンプルアプリに記載されています。 操作手順については、以下で詳しく説明します。 _showRouteOnMap()
メソッドには、マップ上でルートをレンダリングする方法の例が含まれています。 この点については、後述のセクションで簡単に説明します。
注 : 重要です
ルートには 、ルートの計算後に発生する可能性のある問題を説明するNoticeCode
値のリストが含まれている場合があります。 たとえば、ルートがトンネルを回避する必要があり、可能な唯一のルートがトンネルを通過する必要がある場合、Route
には、要求されたトンネル回避の違反があったことを示す通知が含まれます。
- 違反の可能性がないか、常に計算済みの
Route
を確認することをお勧めします。 NoticeCode
はNotice
オブジェクトの一部です。 可能な Notice
オブジェクトのリストには、Route
の Section
ごとにアクセスでき ます。 - 違反が発生しなかった場合、リストは空になります。
- 違反の可能性 がある場合は、少なくとも 1 つの違反を含むルートをスキップすることをお勧めします。
ただし、要求されたルートオプションおよび実際の NoticeCode
値のリストによって、実装はケースバイケースに判断します。 ルートオプションの詳細については、次のセクションを参照してください。 重要 : わかりやすいよう に、このガイドのコードスニペットでは、通知の 列挙型 (enum) 値を評価しません。
次の方法で、可能性のあるルート通知を検出できます。
void _logRouteViolations(here.Route route) {
for (var section in route.sections) {
for (var notice in section.sectionNotices) {
print("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
オブジェクトのoriginalCoordinates
とmapMatchedCoordinates
を比較することで検出できます。 フォールバックとして、適切なトランスポートモードを使用して、これら 2 つの座標間の距離を新しいルート計算で埋めることをアプリケーションで決定できます。このようなモーダルルートは、を利用する代わりにタクシーまたは公共交通機関を利用することをユーザーが好む場合があるため、さまざまなオプションで構成できます 徒歩。 HERE SDK は、このようなモーダルルートを個別の要求としてのみサポートするため、アプリケーションはフォールバックロジックを実装する必要があります。
ルートに沿ったすべての地理座標がマップマッチングされることに注意してください (スナップイン道路とも呼ばれます)。 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
: デフォルトの経由地タイプ。 このポイントが通過することが保証されているため、操作指示のリストに表示され、ルートが別々のルートセクションに分割されます。 -
passThrough
: 操作指示リストに表示されない場合があり、タッチ入力の結果など、ルートを形成するヒントとして扱われます。 このタイプ では、ルートは別々のセクションに分割されません。
新しい Waypoint
オブジェクトを作成する場合、stopover
タイプはデフォルトで設定されます。このタイプは、最初と最後の経由地で使用されるタイプである必要があります。 2 つの経由地のみが始点および終点として機能する場合、ルートは次のようになります。
出発地点と目的地の間に 1 つのルートセクションがあります。 RoutingEngine
は複数の経由地を処理できます。 基本となるアルゴリズムは、提供された List
と WaypointType
の順序と同様に、すべての経由地を接続するための最適なパスを探します。 各 stopover
経由地は、出発地と目的地の間に位置します。すなわち、経由地リストの一番最初と一番最後の項目の間に位置します。
var startWaypoint = Waypoint.withDefaults(_startGeoCoordinates);
var destinationWaypoint = Waypoint.withDefaults(_destinationGeoCoordinates);
var waypoint1 = Waypoint.withDefaults(_createRandomGeoCoordinatesInViewport());
var waypoint2 = Waypoint.withDefaults(_createRandomGeoCoordinatesInViewport());
List<Waypoint> waypoints = [startWaypoint, waypoint1, waypoint2, destinationWaypoint];
_routingEngine.calculateCarRoute(waypoints, CarOptions(),
(RoutingError? routingError, List<here.Route>? routeList) async {
if (routingError == null) {
here.Route route = routeList!.first;
_showRouteDetails(route);
_showRouteOnMap(route);
_logRouteViolations(route);
} else {
var error = routingError.toString();
_showDialog('Error', 'Error while calculating a route: $error');
}
});
上の図に示すように、コード スニペットを使用してルートに 2 つの stopover
ルート経由地を追加することで、出発地と目的地の間に 3 つのルートセクションが作成されました。
注
経由地リストの順序は、ルートに沿って渡される順序を定義します。
図 : 2 つの経由地を追加しています。 目的地までの移動にかかる推定時間やルートの全長(メートル単位)など、ルートに関する追加情報は、以下のように Route
オブジェクトから取得できます。
int estimatedTravelTimeInSeconds = route.duration.inSeconds;
int lengthInMeters = route.lengthInMeters;
移動時間と移動距離は、それぞれの Section
で利用でき ます。 追加の stopover
経由地がない場合、ルートには 1 つのルートだけが含まれます Section
。 追加の stopover
経由地が指定されている場合、ルートは各経由地間、出発地から最初のウェイポイントまで、最後のウェイポイントから目的地までのルートを複数のルート区間に分けて表示します。
注
デフォルトでは、追加の経由地がルートを別々のセクションに分割し、ルートがこのポイントを通過して、そのポイントの操作指示を生成するように強制します。
各 Section
は、ルートのシェイプが GeoPolyline
で表されています。この配列では、最初の座標が出発点を示し、最後の座標が目的地を示します。
これは、たとえば、マップポリラインを Section
ごと異なる色で使用して、マップ上のルートを表示する場合に役立ち ます。 ただし、ポリラインを Route
オブジェクトから直接取得することもできます。 MapPolyline
以下のコード スニペットは、各経由地の間に描画されたを使用して、開始ポイントと宛先を含めて、この機能を実装する方法を示しています。
_showRouteOnMap(here.Route route) {
GeoPolyline routeGeoPolyline = route.geometry;
double widthInPixels = 20;
MapPolyline routeMapPolyline = MapPolyline(routeGeoPolyline, widthInPixels, Color.fromARGB(160, 0, 144, 138));
_hereMapController.mapScene.addMapPolyline(routeMapPolyline);
}
以下の最初のスクリーンショットは、追加の経由地がないルートを示しています。そのため、ルートセクションは 1 つだけです。 出発地点と目的地は、緑で囲まれたマップ マーカーオブジェクトで示されます。 円で囲まれたオブジェクトを描画するコードは HERE ではありませんが、必要に応じてサンプルのソースコードから参照できます。
スクリーンショット: 地図にルートを表示しています。 2 つ目のスクリーンショットには、上記と同じルートが表示 stopover
されますが、 2 つの経由地が追加され、赤い丸で囲まれたマップ マーカーオブジェクトで示されます。 このため、ルートには 3 つのルートセクションが含まれています。
スクリーンショット: 2 つの経由地が追加されたルートを表示しています。 ルートを拡大表示します
一部の使用例では、計算されたルートをズームすると便利です。 Camera クラスを使用すると、ルートが収まるようにビューポイントを簡単に調整できます。
GeoBox routeGeoBox = route!.boundingBox;
_hereMapController.camera.lookAtAreaWithGeoOrientation(routeGeoBox, GeoOrientationUpdate(null, null));
HERE ルートオブジェクトの外側のバウンディング ボックスを使用します。 これを使用すると、カメラを即座に更新できます。 ズーム レベルとカメラのターゲットポイントが変更され、指定された境界矩形がビューポイントに正確に収まるようになります。 さらに、方向を指定して、より多くのカメラパラメーターを指定できます。 HERE デフォルト値を使用します。 呼び出しによって lookAtAreaWithOrientation()
ビューが即座に変更されます。
ほとんどの使用例では、アニメーションを使用してルートを拡大縮小する方がユーザーの操作性が向上します。 次の例では、に 50 GeoBox
ピクセルのパディングを加えてズームしています。
void _animateToRoute(here.Route route) {
double bearing = 0;
double tilt = 0;
Point2D origin = Point2D(50, 50);
Size2D sizeInPixels = Size2D(_hereMapController.viewportSize.width - 100, _hereMapController.viewportSize.height - 100);
Rectangle2D mapViewport = Rectangle2D(origin, sizeInPixels);
MapCameraUpdate update = MapCameraUpdateFactory.lookAtAreaWithGeoOrientationAndViewRectangle(route!.boundingBox,
GeoOrientationUpdate(bearing, tilt),
mapViewport);
MapCameraAnimation animation = MapCameraAnimationFactory.createAnimationFromUpdate(
update, const Duration(milliseconds: 3000), EasingFunction.inCubic);
_hereMapController.camera.startAnimation(animation);
}
The `CameraKeyframeTracks` example app shows how this can look like.
操作手順を取得します
各に Section
は、目的地に到着するためにユーザーが従う必要がある操作手順が含まれています。 1 つの Maneuver
オブジェクトには、曲がるたびに操作と操作が必要な場所が含まれています。 このアクションは、「出発」や「左折」などの道順を示す場合があります。
List<Section> sections = route.sections;
for (Section section in sections) {
_logManeuverInstructions(section);
}
HERE は、セクションごとの操作指示にアクセスするためのコードです。
void _logManeuverInstructions(Section section) {
print("Log maneuver instructions per route section:");
List<Maneuver> maneuverInstructions = section.maneuvers;
for (Maneuver maneuverInstruction in maneuverInstructions) {
ManeuverAction maneuverAction = maneuverInstruction.action;
GeoCoordinates maneuverLocation = maneuverInstruction.coordinates;
String maneuverInfo = maneuverInstruction.text +
", Action: " +
maneuverAction.toString() +
", Location: " +
maneuverLocation.toString();
print(maneuverInfo);
}
}
これは、経路全体を記述する操作指示リストを書面で簡単に作成する場合に役立ちます。 たとえば ManeuverAction
、 列挙型 (enum) を使用して独自のルーティングエクスペリエンスを構築できます。
スクリーンショット: 操作手順を含むルートプレビューを示す画面の例。 注
Navigator
または VisualNavigator
から取得した場合、ナビゲーション中に Maneuver
説明テキスト(maneuverInstruction.text
)は空になります。 Route
インスタンスから取得した場合にのみ、ローカライズされた命令が含まれます。 ManeuverAction
列挙型(enum)はナビゲーション中に視覚的なインジケータを表示するために使用され、テキストによる指示は、旅程を開始する前に操縦をプレビューするために、より多くのリストに入ることになっている。
反対に、maneuverInstruction.roadTexts
、maneuverInstruction.nextRoadTexts
および maneuverInstruction.exitSignTexts
は、ナビゲーション中のターンバイターン操作の一部として表示されることを意味します。したがって、これらの操作は、Maneuver
が Navigator
または VisualNavigator
から取得された場合にのみ空ではありません。 Route
インスタンスから取得した場合、これらの属性は常に空になります。
API リファレンス では、利用可能 な操作の概要を確認できます。
ManeuverAction
次の表は、プレビューの説明とアセットの例を含むすべてのアイテムを示しています。 HERE SDK自体には、操作アイコンは付属していません。 アセットは、オープンソース のHEREアイコンライブラリの一部として、さまざまな密度のSVGまたはソリッドPNGとして利用できます。
使用可能な操作アクションは 、APIリファレンスに表示される順序でソートされます。
操作アクション | 説明の例 | アイコンの例 |
出発 | 「開始位置 <road name>」などの出発操作。 | |
到着 | 「到着」などの到着操作。 中間ウェイポイントの説明例: 」に到着 <road name | waypoint>。 ルートの宛先の場合: 」に到着 <road name | destination name | destination>。 | |
leftUTurn | 「Uターンを行う <next road name>」などの左Uターン操作。 | |
sharpLeftTurn | 「急に左に曲がる <next road name>」などの急な左折操作。 | |
leftTurn | 「左折」などの左折操作 <next road name>。 | |
slightLeftTurn を選択します | 「左折してください <next road name>」など、少し左に曲がる操作。 | |
継続オン | 「続行」などの操作を続行 <road name>します。 | |
slightRightTurn | 「右に曲がっ <next road name>て」などのわずかな右折操作。 | |
rightTurn | 「右折」などの右折操作 <next road name>。 | |
sharpRightTurn | 急な右折操作(「右折してください」など <next road name>)。 | |
rightUTurn | 右Uターン操作(「で右Uターンする <next road name>」など)。 | |
leftExit | 「左側の出口で降りる <next road name>」などの左側の出口操作。 | |
rightExit | 「Take the right exit to <next road name>」(右出口で降りる)などの右出口操作。 | |
左ランプ | 「左ランプを進む」などの左ランプ操作。 | |
右ランプ | 右ランプ操作(「右ランプを進む」など)。 | |
leftFork | 左フォーク操作(「左フォークを上に移動 <next road name>」など)。 | |
ミドルフォーク | 「中央のフォークを上に移動 <next road name>」などのミドルフォーク操作。 | |
rightFork | 右フォーク操作(「右フォークを上に移動 <next road name>」など)。 | |
EnterHighwayFromLeft | 「左側から高速道路に参加する」など、左側の操作から高速道路に入ります。 | |
EnterHighwayFromRight | 「右側から高速道路に参加する」など、右側の操作から高速道路に入ります。 | |
leftRoundaboutEnter | 「ロータリーに入る」など、ロータリーを操作します ( 左側通行 ) 。 | |
rightRoundaboutEnter | 「ロータリーに入る」など、ロータリーを操作します ( 右の交通量 ) 。 | |
leftRoundaboutPass | 「ロータリーを通過する」など、ロータリーを操作します ( 左側通行 ) 。 | |
rightRoundaboutPass | 「ロータリーを通過する」など、ロータリーを操作します ( 右の交通量 ) 。 | |
leftRoundaboutExit1. | 「ロータリーの最初の出口を出る」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit2 | 「ロータリーの2番目の出口を出る」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit3. | 「ロータリーの3番目の出口を出る」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit4. | 「ロータリーの4番目の出口を出る」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit5. | 「ロータリーの5番目の出口を出る」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit6 | 「ロータリーの6番目の出口を出る」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit7 | 「ロータリーの7番出口を出る」などのロータリーマヌーバ(左側通行)。 | |
leftRoundaboutExit8 | 「ロータリー8番出口を出る」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit9. | 「ロータリーの9番出口を出てください」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit10. | 「ロータリーの10番出口を出てください」などのロータリー操作(左側通行)。 | |
leftRoundaboutExit11 | 「ロータリーの11番出口を出る」などのロータリーマヌーバ(左側通行)。 | |
leftRoundaboutExit12 | 「ロータリーの12番出口を出る」などのロータリーマヌーバ(左側通行)。 | |
rightRoundaboutExit1. | 「ロータリーの最初の出口を出る」などのロータリー操作(右側通行)。 | |
rightRoundaboutExit2. | 「ロータリーの2番目の出口を出る」などのロータリー操作(右側通行)。 | |
rightRoundaboutExit3. | 「ロータリーの3番目の出口を出る」などのロータリー操作(右側通行)。 | |
rightRoundaboutExit4. | 「ロータリーの4番目の出口を出る」などのロータリー操作(右側通行)。 | |
rightRoundaboutExit5. | 「ロータリーの5番目の出口を出る」などのロータリーマヌーバ(右側通行)。 | |
rightRoundaboutExit6. | 「ロータリーの6番目の出口を出る」などのロータリーマヌーバ(右側通行)。 | |
rightRoundaboutExit7. | 「ロータリーの7番出口を出る」などのロータリーマヌーバ(右側通行)。 | |
rightRoundaboutExit8. | 「ロータリー8番出口を出る」などのロータリー操作(右側通行)。 | |
rightRoundaboutExit9. | 「ロータリー9番出口を出て」などのロータリーマヌーバ(右側通行)。 | |
rightRoundaboutExit10. | 「ロータリー10番出口を出て」などのロータリーマヌーバ(右側通行)。 | |
rightRoundaboutExit11. | 「ロータリーの11番出口を出る」などのロータリーマヌーバ(右側通行)。 | |
rightRoundaboutExit12. | 「ロータリーの12番出口を出る」などのロータリーマヌーバ(右側通行)。 | |
leftRoundaboutPass
現時点では、およびのHEREアセットは rightRoundaboutPass
SVGとしてのみ使用でき、一部の操作アセットはサブフォルダ"wego-fallback-roundabout"でのみ使用できます。 PNG表現の場合、 MSDKUI オープンソースプロジェクトもフォールバックとして使用できます。
ルート沿いの交通状況を検索します
渋滞に巻き込まれた場合の総時間を取得するには、次のいずれかの操作を行います。
int estimatedTrafficDelayInSeconds = route.trafficDelay.inSeconds;
ルートの個々のセクションでは、交通状況に関するより詳細な情報を利用できます。 操作に加えて(上記を参照)、各Section
Route
には、ルートが計算された時点のトラフィックフローの状況に関する情報が含まれています。
各インスタンス Section
には、さまざまな量 TrafficSpeed
のインスタンスを含めることができます。 これらの値は Span
、次のまでの間有効 Span
です。 各 Span
ジオメトリは、フルルートのポリライン 形状の一部であるポリライン で表されます。
次のコード スニペットは Section
の最初の Span
の TrafficSpeed
要素を取得する方法を示しています。
Section firstSection = route.sections.first;
TrafficSpeed firstTrafficSpeed = firstSection.spans.first.trafficSpeed;
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
、セクションの各スパンに複数の色付きのオブジェクトをレンダリングすることを検討してください。
_showTrafficOnRoute(here.Route route) {
if (route.lengthInMeters / 1000 > 5000) {
print("Skip showing traffic-on-route for longer routes.");
return;
}
for (var section in route.sections) {
for (var span in section.spans) {
TrafficSpeed trafficSpeed = span.trafficSpeed;
Color? lineColor = _getTrafficColor(trafficSpeed.jamFactor);
if (lineColor == null) {
continue;
}
GeoPolyline spanGeoPolyline;
try {
spanGeoPolyline = GeoPolyline(span.polyline);
} on InstantiationException {
print("Error: Initialization of GeoPolyline failed.");
return;
}
double widthInPixels = 10;
MapPolyline trafficSpanMapPolyline = new MapPolyline(spanGeoPolyline, widthInPixels, lineColor);
_hereMapController.mapScene.addMapPolyline(trafficSpanMapPolyline);
_mapPolylines.add(trafficSpanMapPolyline);
}
}
}
Color? _getTrafficColor(double? jamFactor) {
if (jamFactor == null || jamFactor < 4) {
return null;
} else if (jamFactor >= 4 && jamFactor < 8) {
return Color.fromARGB(160, 255, 255, 0);
} else if (jamFactor >= 8 && jamFactor < 10) {
return Color.fromARGB(160, 255, 0, 0);
}
return Color.fromARGB(160, 0, 0, 0);
}
パフォーマンス上の理由から、長いルートのトラフィックレンダリングはスキップします。この例では、トラフィックを持つ各スパンが個別の折れ線としてレンダリングされるためです。
-
さらに、を使用 TrafficEngine
して、ルートに沿った交通事故を照会できます。 このためには、Route
の座標から GeoCorridor
を作成する必要があります。 また、を設定して、廊下の半径も指定してください halfWidthInMeters
。 の GeoCorridor
長さと幅には制限があります。 Traffic Example アプリ を確認TrafficEngine
して、の使用方法を確認してください。 このガイドの 交通状況のセクションも確認してください。
-
ルート上の基本的な交通事故情報のみに関心がある場合は、Section.getTrafficIncidents()
を呼び出して、Route
インスタンスから Section
ごとに交通状況の概要を直接取得できます。 結果 TrafficIncidentOnRoute
のオブジェクトには、で使用できるデータの小さなサブセットが含ま TrafficEngine
れていますが、概要を最初に示すと便利です。
ルート上のトラフィックをレンダリングするだけでなく、に基づいてトラフィックインシデントをアイコンとして表示することも TrafficIncidentType
できます。 Route
次のカテゴリは、オブジェクトの一部として重複しています。
-
accident
: 交通事故。 -
congestion
: 交通渋滞。 -
construction
: 建設工事。 -
disabledVehicle
: 道路上の車両が転覆または故障した。 -
laneRestriction
: 車線制限。 -
massTransit
: 鉄道や地下鉄などの大量輸送機関を含む事件。 -
plannedEvent
: スポーツイベントやフェスティバルなどの活動に関する事件。 -
roadClosure
: 道路閉鎖。 -
roadHazard
: 木が倒れたり信号が消えたりするなど、道路上の危険な障害物。 -
weather
: 悪天候。 -
other
: 事件は既知であるが、他のどのカテゴリーにも当てはまらない。 -
unknown
: 特定のインシデントタイプは指定されません。
HERE SDKではこのようなアイコンアセットは公開されませんが trafficIncidents
、マップフィーチャレイヤを有効にして、すべてのインシデントをマップ上にアイコン付きで表示できます。 同様に trafficFlow
、レイヤを有効にして、道路上の一般的なトラフィックフローを表示することもできます。 詳細 については、トラフィックセクションをご覧ください。
注
refreshRoute()
経由地のルートを更新することで、ルートの交通情報を更新できます。 以下のセクションを参照してください。 または、ガイダンスの最中 DynamicRoutingEngine
にを使用することも検討してください。
今後の制限速度などを確認できます
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 リファレンス で定義されているように、トールの該当するトランスポートモードのトールデータが要求されます。
トールコストは、Section.tolls
を使いPaymentMethod
、TollFare
およびToll
の情報を取得します。
ナビゲーション中 - ルートをフォロー中 - RoadAttributesListener
現在 isTollway
の道路でトールの支払いが必要かどうかを知らせるなど、新しい道路属性を知らせるを使用できます。
道路の特性を回避する
AvoidanceOptions
トンネル、高速道路、低排出ガス地帯(LEZ)、地域、フェリー、料金、その他の道路の特徴(急カーブなど)を除外するために使用します。 RoadFeatures
'''' ZoneCategory
GeoBox
CountryCode
エレメントなどのリストを渡すことができます
RoadFeatures
トンネルやトール 道路などの道路固有の機能が含まれています。 たとえば、すべての高速道路を走行から除外 controlledAccessHighway
するには、機能のリストにを追加します。
AvoidanceOptions
ローカリゼーションや単位オプションなど、他のルートオプションと組み合わせて、目的の輸送モードのオプションに設定できます。 たとえば、車、中古車 CarOptions
、トラックなど TruckOptions
です。 これらのオプションは、ルートの計算時に読み取られ、の場合 AvoidanceOptions
、エンジンは一覧表示されている機能を回避しようとします。
スクリーンショット: 回避エリアのない2つのルートと回避エリアのある2つのルート。 ルートを更新します
Route
オブジェクトに含まれているトラフィックフロー情報は、ルートが計算された時間帯に有効です。上記を参照してください。 この情報を後で更新する場合 は、ルートを更新できます。
ルートのルートオプションを更新することもできます。
RefreshRouteOptions refreshRouteOptions = RefreshRouteOptions.withTaxiOptions(taxiOptions);
routingEngine.refreshRoute(route.routeHandle, mapMatchedWaypoint, refreshRouteOptions, (routingError, routes) {
if (routingError == null) {
HERE.Route newRoute = routes.first;
} else {
}
});
このためには、ルートが計算される前にRouteOptions.enableRouteHandle
経由で要求されるRouteHandle
を把握しておく必要があります。
また、ルートの更新は、ルートオプションをあるトランスポートタイプから別のトランスポートタイプに変換したり、特定のオプションを更新したりする場合に役立ちます。 たとえば、徒歩ルートがトラックルートに変換されたなど、変換ができない場合、 routingError
はこれを示します。
新しい出発地点を指定して、ルートを短縮することもできます。 新しいルートは計算されないため、新しい出発地点は元のルートに非常に近い位置にある必要があります。 新しい出発地点が遠すぎると、routingError
が発生します。
進行中のターン・バイ・ターンナビ (矢印ナビ)中にドライバーがルートから逸脱した場合、迂回路の計算を新たに行う必要があるため、ルートを更新するだけでは不十分です。 このような場合 returnToRoute()
は、新しい出発地点を設定してルート全体を再計算するか、または元の代替ルートを保持できる方法を使用すると便利です。
ターン・バイ・ターンナビ (矢印ナビ) 中 にルートを更新して、最新の交通渋滞遅れアップデートを先に取得できます。 更新されたルートをに設定する前 Navigator
に、ルートの最後の場所を新しい出発地点として設定する必要があります。 ただし、更新処理中にドライバーがすでに進行している場合、予期しない結果が生じる可能性があります。 いずれの場合も、 ETA を更新するだけで、新しい出発地点が既存のルートにある 場合、必ずしも新しいルートを設定する必要はありません。 代わりに、交通遅延時間を含む更新済みの ETA を使用できます。前方ルートの REST は 変更されません。 ガイダンス中に新しいルートを設定すると、新しいナビゲーションセッションが効果的に開始されます。
代わりに DynamicRoutingEngine
、最後の場所 と 現在のセクションインデックスを設定する必要があるを使用することを検討してください。 この情報は、次 dynamicRoutingEngineOptions.pollInterval
の到達時に使用されます。 トレードオフとして、これは即時の更新にはつながりません。また、現在の交通障害物を迂回するより適切なルートが見つかった場合、ルートの形状が変更される可能性があります。 ここでも refreshRoute()
、新しいルートを設定するかどうかを決定する必要があります。
注
現在 OfflineRoutingEngine
の交通状況を悪化させるにはオンライン接続が必要なため、ではルートの更新はサポートされていません。 同様 DynamicRoutingEngine
に、にはオンライン接続が必要です。
ルートに戻る
RoutingEngine
は、現在の交通状況に基づいて既存のルート(上記を参照)を更新できます。 結果として、前のルートよりも高速な新しいルートが作成されることがあります。 ただし、新しい startingPoint
ルートは元のルートに非常に近いものにする必要があります。
startingPoint
がルートから離れている場合に対処する必要がある場合は、RoutingEngine
のreturnToRoute()
機能を使用することを検討してください。 たとえば、ローカルの交通状況により、ドライバーが迂回路を選択する場合があります。 また、コール returnToRoute()
によって新しいルートが作成されますが、可能であれば、コストのかかるルートの再計算を行わずに、元のルートからできるだけ類似したルートが試行されます。
- ストップオーバーの経由地の通過が保証されています。
- パススルー経由地は、ルートの形成のみを目的としているため、新しいルートがそれらのルートを受け入れるか、または廃棄するかは保証されません。
- 現在の交通状況が考慮され、ルートが再形成される可能性があります。
ターン・バイ・ターンナビ (矢印ナビ)は Navigate Edition でのみ使用できます。
注
returnToRoute()
このメソッドは OfflineRoutingEngine
、キャッシュされた、またはダウンロードされたマップ データでオフラインで動作するで使用することもできます。 ただし、現在の交通状況は考慮されません。
returnToRoute()
を 使用したコーディング例については、ナビゲーションの章を参照 してください。
他のサービスからルートをインポートします
注
これはこの機能のベータ版です。このため、いくつかのバグや予期しない動作が発生する可能性があります。 関連する API は、非推奨プロセスなしで新しいリリースで変更されることがあります。
さまざまな多重定義 routingEngine.importRoute()
されたメソッドのいずれかを使用して、他の API やベンダーからルートをインポートできます。 これは 1 対 1 のインポート機能ではなく 、再構築であることに注意してください。
次の場所から新しいRoute
オブジェクトを作成できます。
- オプション 1 :
GeoCoordinates
およびのリスト。 RouteOptions
これは、ルートを別のベンダーからインポートする必要がある場合、またはルートを長期間保持する必要がある場合に役立ちます。 ルートシェイプは、指定されたものにできるだけ近い場所に保持されます。 オンライン接続が必要です。 - オプション 2 : a.
RouteHandle
これは、他の HERE サービスからルートをインポートする場合に役立ちます。 ユースケース では 、 HERE Wego Web サイトまたは HERE REST API を使用する別の Web ページにルートを作成し、それをモバイル機器 に転送して旅程を開始できます。 バックエンド側でのマップの更新、または実世界でのその他の変更によって、無効なハンドルが生じる可能性があります。 また、ハンドルの寿命は一般的に制限されています。 そのため、数時間のみハンドルを使用することをお勧めします。 は RouteHandle
特定の情報をエンコードしますが、バックエンドから完全なルートデータを取得するには、オンライン接続が必要です。
AvoidanceOptions
適用されたものはすべて廃棄され、ルートを経由して違反として報告 Section.sectionNotices
されます。 たとえば、高速道路の回避を要求しても、指定された座標が高速道路と一致する場合、結果のルートは引き続き高速道路と一致しますが、目的の回避オプションに違反していることを示す通知が追加されます。
一般 に、ルートをインポートすると、まったく同じRouteOptions
ルートを使用しても、元のルートとまったく同じルートが再現されないことがあります。 新しい建設現場や関連する交通状況などにより、地図には常に変更が反映されることがあります。 また、マップ データ 自体は、道路や新しい道路で制限速度が変更された場合 や、既存の道路が閉鎖された場合などにも変更されます。 また、特定の道路を利用できる場合、出発時刻が影響を受けることがあります。
詳細については、以下を参照してください。
オプション 1 : 地理座標のリストからルートをインポートします
RouteOptions
GeoCoordinates
のリストからルートをインポートする には、ルートシェイプを定義するGeoCoordinates
のリストが必要です。 このような座標は互いに非常に近い値にする必要があります。そうしないと、計算に失敗します。 このような座標のリストは、別のベンダーによって計算されたルートから抽出することも、 GPX トレースから抽出することもできます。
List<Location> routeLocations = [
Location.withCoordinates(GeoCoordinates(52.518032, 13.420632)),
Location.withCoordinates(GeoCoordinates(52.51772, 13.42038)),
Location.withCoordinates(GeoCoordinates(52.51764, 13.42062)),
Location.withCoordinates(GeoCoordinates(52.51754, 13.42093)),
Location.withCoordinates(GeoCoordinates(52.51735, 13.42155)),
Location.withCoordinates(GeoCoordinates(52.51719, 13.42209)),
Location.withCoordinates(GeoCoordinates(52.51707, 13.42248)),
Location.withCoordinates(GeoCoordinates(52.51695, 13.42285)),
Location.withCoordinates(GeoCoordinates(52.5168, 13.42331)),
Location.withCoordinates(GeoCoordinates(52.51661, 13.42387)),
Location.withCoordinates(GeoCoordinates(52.51648, 13.42429)),
Location.withCoordinates(GeoCoordinates(52.51618, 13.42513)),
Location.withCoordinates(GeoCoordinates(52.5161, 13.42537)),
Location.withCoordinates(GeoCoordinates(52.51543, 13.42475)),
Location.withCoordinates(GeoCoordinates(52.51514, 13.42449)),
Location.withCoordinates(GeoCoordinates(52.515001, 13.424374))];
routingEngine.importCarRoute(routeLocations, CarOptions(), (routingError, routes) {
if (routingError == null) {
HERE.Route newRoute = routes!.first;
} else {
}
});
このオプションで importRoute()
は、目的の転送タイプに一致するメソッドの過負荷を選択できます。
GeoCoordinates
RouteOptions
のリストからルートをインポートすると 、RoutingEngine
は 提供された地理座標からできるだけ近いルートシェイプを作成します。
座標のリストに制限はありません。 サポートされているアイテムの最大数については、API リファレンスを参照してください。
最適な結果を得るには、 1Hz の GPS データ、または数メートルの間隔を持つポイントを使用します。 データが極端に希薄な場合、エラーが発生する可能性があります。
オプション 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.importRouteFromHandle(RouteHandle("routeHandleStringFromBackend"), RefreshRouteOptions.withCarOptions(CarOptions()), (routingError, routes) {
if (routingError == null) {
HERE.Route newRoute = routes!.first;
} else {
}
});
RouteHandle
この文字列は、すでに計算されたルートを示します。 正常にインポートされると、 CalculateRouteCallback
新しいオブジェクトが作成され、Route
の一部として提供され、 HERE SDK でさらに使用できます。
注
HERE SDK では、 オフラインでのルートのインポートはサポートされていません。少なくとも、RouteHandle
経由、またはGeoCoordinates
のリストを直接渡すといった上記のようなものではありません。 これは RoutingEngine
、オンライン接続が必要なでのみ可能です。
ただし、回避策があります。 OfflineRoutingEngine
に無制限の数の Waypoint
アイテムを挿入すると、ルートは指定したストップオーバー経由地でオフラインで計算されることがあり、元のルートにできるだけ近いルートが形成されます。 で RoutingEngine
サポートされる経由地 の数は、最大で約 200 経由地 に制限されていることに注意してください。 を使用する場合 OfflineRoutingEngine
、このような制限はありませんが、より長いルートのパフォーマンスのトレードオフが存在する可能性があります。 そのため、すべてのルート座標のサブセットのみを経由地 として渡すことをお勧めします。たとえば、距離のしきい値でフィルタリングします。
については、次の章のを参照 OfflineRoutingEngine
してください。 追加の経由地 は、オンラインですでに表示されているのと同じ方法 RoutingEngine
で設定できます。
オフラインルーティング
に加えて RoutingEngine
、オフラインの使用例にも相当するものがあります。 。 OfflineRoutingEngine
すでに上記で示したオンライン版と同じ方法で構築できます。
RoutingInterface _routingEngine;
RoutingEngine _onlineRoutingEngine;
OfflineRoutingEngine _offlineRoutingEngine;
...
try {
_onlineRoutingEngine = RoutingEngine();
} on InstantiationException {
throw ("Initialization of RoutingEngine failed.");
}
try {
_offlineRoutingEngine = OfflineRoutingEngine();
} on InstantiationException {
throw ("Initialization of OfflineRoutingEngine failed.");
}
注
トランジットルート(経由 TransitRoutingEngine
)、タクシー(TaxiOptions
)、 EV ルート(EVCarOptions
および EVTruckOptions
) はまだサポートされておらず、オンラインでのみ利用できます。 サポートされていない転送モードの場合、OfflineRouteEngine
は RoutingError.invalidParameter
で失敗します。
は OfflineRoutingEngine
と同じインターフェイスを提供 RoutingEngine
しますが、結果は、 HERE バックエンドサービスへの新しい要求を開始するのではなく、すでにダウンロードまたはキャッシュされているマップ データから取得されたものであるため、若干異なる場合があります。
この方法 RoutingEngine
では、たとえば、を使用しているときに受信したデータよりも古いデータを使用できます。 一方、このクラスでは、オンライン接続が不要なため、より迅速に結果を提供します。
ただし、結果のルートには空の操作のリストのみが含まれます。 ガイダンス中に操作が必要な場合は、Navigator
またはVisualNavigator
提供されているnextManeuverIndex
を経由して直接操作を行うことができます。 これは ナビゲーション セクションに表示されます。
注
すでにキャッシュされているか、または事前にロードされているオフライン地図データでのみルートを計算できます。 キャッシュされたマップ データのみを使用する場合、すべてのタイルが下のズームレベルでロードされているわけではありません。 この場合、マップが表示されていても、低いズームレベルもロードされるまでルートは見つかりません。 オフラインの地図では、この問題は発生しません。また、必要なマップ データがダウンロードした地域で利用可能であることが保証されます。 したがって、キャッシュされたマップ データに依存しないことをお勧めします。
の使用可能なすべてのインターフェイス OfflineRoutingEngine
もで使用でき RoutingEngine
、両方のエンジンが同じインターフェイスを採用します。 これにより、以下に示すように、両方のエンジンインスタンスを簡単に切り替えることができます。
注
このすべての仕組みについて簡単に説明 RoutingExample
するには、クラスを参照してください。 以下に示すすべてのコードスニペットが含まれています。このコードは、 GitHub にある routing_hybrid_app の例の一部です。
以下に OfflineRoutingEngine
、とを切り替える方法を示します RoutingEngine
。 たとえば、移動中に、接続が一時的に失われた可能性があります。 このような場合 OfflineRoutingEngine
は、ですでにキャッシュされている、またはダウンロードされているマップ データのルートを計算することが妥当です。
そのためには、まずデバイスの接続が失われていないかを確認する必要があります。 2 番目のステップとして、優先エンジンを使用できます。
void useOnlineRoutingEngine() {
_routingEngine = _onlineRoutingEngine;
_showDialog('Switched to RoutingEngine', 'Routes will be calculated online.');
}
void useOfflineRoutingEngine() {
_routingEngine = _offlineRoutingEngine;
_showDialog(
'Switched to OfflineRoutingEngine', 'Routes will be calculated offline on cached or downloaded map data.');
}
現在 _routingEngine
のインスタンスで同じコードを実行できるようになりました ( 前のセクションを参照 ) 。
注
デバイスがオフラインの場合、オンラインバリアントはルートを検索せず、エラーを報告します。 その逆も同様です。デバイスがオンラインで、使用したい領域にキャッシュまたはプリロードされたマップ データがない場合、オフラインバリアントもエラーを報告します。
デバイスがオンラインかどうかを確認するコードが HERE から削除されていることに注意してください。 この目的でサードパーティのプラグインを使用するか、実際の接続を試みることができます。その場合は OfflineRoutingEngine
、次のようにして - または別の方法に切り替えることができます。 まずオフラインルーティングを試して、ユーザーに高速なエクスペリエンスを提供できますが、マップ データが利用できない場合はオンラインで試すことができます。
経由地 注文を最適化します
OfflineEngine
( 上記を参照 ) では、オフラインの経由地 シーケンシングを使用し て 、出張の営業担当 者のユースケース をサポートすることもできます。 この機能は、オンラインではまだサポートされて RoutingEngine
いません。
Waypoint
に含まれる複数のストップオーバーアイテム Route
は、次の設定によって自動的に注文できます RouteOptions.optimizeWaypointsOrder
。 true
に設定さ れている場合、OfflineRoutingEngine
は、宛先に高速に到達するように経由地 の順序を最適化するか、またはルートを短縮するように試行します。また、すべてのタイプstopover
の設定経由地 に到達するようにします。
指定されたによって OptimizationMode
、並べ替えの結果、ルートの速度が速くなるか、または短くなるかが決定されます。
ルート計算への影響を確認するには、少なくとも 5 つ以上の経由地 (出発地点と目的地を含む)を設定する必要があります。 必要に 応じて、各RoutePlace
のoriginalCoordinates
をユーザー定義の座標と比較することで、リフリングされた経由地 を特定できます。 RoutePlace
各ストップオーバーがルートをセクションに分割するたびに、オブジェクトが各Section
Route
オブジェクトに提供されます。 ナビゲーション中に MilestoneStatus
、ユーザー定義の経由地 に到達したかどうかがイベントによって通知されます。
図 : 経由地 シーケンシングを使用するルートと使用しないルート。 これはこの機能のベータ版です。
到達可能領域を表示します
等値線 (Isoline) ルーティングを使用すると、時間、距離、またはエネルギー消費量に基づいて、特定のポイントからの到達範囲を表すポリゴンを生成できます。 ポリゴンには、特定の時間、最長走行距離、電気自動車で利用できる充電レベルで到達できるすべての目的地が含まれます。
注
等値線 (Isoline) ルーティング では、リアルタイムおよび履歴のトラフィックが計算で考慮されます。
これがどのように役立つかの例を次に示します。
- 徒歩 2 キロメートル以内にレストランが軒を連ねている。
- ユーザーは、観光地までの距離に基づいてホテルを検索 できます。たとえば、ディズニーワールドやユニバーサルスタジオなどの主な名所まで車で 20 分以内の距離にあるホテルを検索できます。
以下に Isoline
、電気自動車シナリオの消費量ベースの例を示します。この例では、ドライバーが指定された制限値 400 Wh 以内に到達可能なポイントを確認したいと考えています。 そのため、目標は 400 Wh 以下を消費することです。問題は次のとおりです。 このエネルギー制限の範囲内で、ドライバーは何に達することができますか?
注
電気自動車は、現在のバッテリー充電量と、道路の勾配や補助電源の使用状況などのエネルギー消費量に影響を与える要因に基づいて、到達可能範囲に限りがあります。 そのため、適切な範囲を視覚化して、充電ポイントに到達する前にエネルギー不足を避けることができます。 車両には固有の燃費パラメータがあるため、正確な走行距離を計算するために、要求に応じてパラメータを指定する必要があります。 詳細については 、以下の電気自動車のセクションを参照してください。
結果は GeoPolygon
地図に表示できる図形になり、ドライバーに視覚的な向きを提供します。
List<int> rangeValues = [400];
int? maxPoints;
IsolineOptionsCalculation calculationOptions = IsolineOptionsCalculation.withNoDefaults(
IsolineRangeType.consumptionInWattHours, rangeValues, IsolineCalculationMode.balanced, maxPoints, RoutePlaceDirection.departure);
IsolineOptions isolineOptions = IsolineOptions.withEVCarOptions(calculationOptions, _getEVCarOptions());
_routingEngine.calculateIsoline(Waypoint(_startGeoCoordinates!), isolineOptions,
(RoutingError? routingError, List<Isoline>? list) {
if (routingError != null) {
_showDialog("Error while calculating reachable area:", routingError.toString());
return;
}
Isoline isoline = list!.first;
for (GeoPolygon geoPolygon in isoline.polygons) {
Color fillColor = Color.fromARGB(128, 0, 143, 138);
MapPolygon mapPolygon = MapPolygon(geoPolygon, fillColor);
_hereMapController.mapScene.addMapPolygon(mapPolygon);
_mapPolygons.add(mapPolygon);
}
});
これにより、電気自動車が 400Wh 以下の電力を消費して到達できるエリアが見つかります。その一方で、最短ルートを開始から任意の直進方向に走行しようとします。
最速の理由 これは、ルートの最適化モードによって異なります(前述のセクションで説明しました)。もちろん、任意のモードを指定できます。 各 等値線 (Isoline) には、出発地点からちょうど 1 つのセンターポイントが必要です。
エネルギー消費に関心 EVCarOptions
があるので、こちらも提供しました。 これらのオプションには 、以下の電気自動車の取り回しのセクションに示されているバッテリーの仕様が含まれている必要があります。 範囲タイプとして時間または距離の制限を指定する場合は、前述のように通常のルートオプションを指定できます。
は IsolineRangeType
、提供範囲値のタイプを定義します。 ここでは、400を使用しています。 複数の値を指定できます。その結果、指定された範囲の値ごとに、複数の Isoline
オブジェクトが取得されます。
一方 Isoline
、各オブジェクトには、到達範囲に島が含まれている場合など、特殊なケースで複数のポリゴンを含めることができます。 このような領域は、個別のポリゴンとして提供されます。
結果の多角形のシェイプは maxPoints
、パラメーターで定義できます。 GeoPolygon
の頂点の数を指定します。 このパラメータは、ポリゴンの実際の計算には影響を与えず、その外観にのみ影響します。
スクリーンショット: 指定した制限の到達範囲を表示します。 スクリーンショットには、大きな緑色の円で示された多角形の中心位置が表示されます。 また、このエリアを超える可能性のあるルートが表示され、ルートに沿って 2 つの追加の充電ステーションが見つかります。 次のセクションでは、電気自動車のルートを計算する方法について説明します。
電気自動車のルートを取得します
電気自動車( EV )の使用量と販売量は世界中で増加し続けています。 HERE は電気自動車に最適なルートを提供するのにどのように役立ちますか?
-
HERE EV ルーティングは、 EV が A から B に到達できるように最適化されたルートを提供し、充電の停止回数を最小限に抑え、バッテリー充電時間を最適化します(車両の消費モデルに基づきます)。 また、地形、道路のジオメトリ、リアルタイムの交通情報、交通パターンなど、旅程を計画する際にもいくつかの要因が考慮されます。
-
HERE は、ルート沿いの充電ステーションを検索する代わりに、可能なすべてのステーションの充電時間を分析し、最短の運転時間と充電時間を提供する最適な組み合わせを選択します。
EV ルートの取得は簡単です。 自動車やトラックのルートを取得する場合と同様 に、電気自動車に固有のルートオプションを追加するだけで、 EV のルートを取得できます。 このようにして、電気自動車のルートを他の輸送モードと同じように取得できます。 EVRouteOptions
を指定して calculateRoute()
メソッドに追加するだけです。
_routingEngine.calculateEVCarRoute(waypoints, _getEVCarOptions(),
(RoutingError? routingError, List<here.Route>? routeList) {
if (routingError == null) {
here.Route route = routeList!.first;
} else {
var error = routingError.toString();
_showDialog('Error', 'Error while calculating a route: $error');
}
});
デフォルトでは、EVRouteOptions
は、エネルギー不足なしで目的地に到達できるようにするために必要なパラメータを含めません。
これを確実 に行うには、ルートにチャージステーションを追加するために必要なパラメータを設定する必要があります。また、全体的な移動時間の結果を最適化する必要があります。
以下に、このようなオプションの作成例を示します。
EVCarOptions _getEVCarOptions() {
EVCarOptions evCarOptions = EVCarOptions();
evCarOptions.consumptionModel.ascentConsumptionInWattHoursPerMeter = 9;
evCarOptions.consumptionModel.descentRecoveryInWattHoursPerMeter = 4.3;
evCarOptions.consumptionModel.freeFlowSpeedTable = {0: 0.239, 27: 0.239, 60: 0.196, 90: 0.238};
evCarOptions.routeOptions.alternatives = 0;
evCarOptions.ensureReachability = true;
evCarOptions.avoidanceOptions = AvoidanceOptions();
evCarOptions.routeOptions.speedCapInMetersPerSecond = null;
evCarOptions.routeOptions.optimizationMode = OptimizationMode.fastest;
evCarOptions.batterySpecifications.connectorTypes = [
ChargingConnectorType.tesla,
ChargingConnectorType.iec62196Type1Combo,
ChargingConnectorType.iec62196Type2Combo
];
evCarOptions.batterySpecifications.totalCapacityInKilowattHours = 80.0;
evCarOptions.batterySpecifications.initialChargeInKilowattHours = 10.0;
evCarOptions.batterySpecifications.targetChargeInKilowattHours = 72.0;
evCarOptions.batterySpecifications.chargingCurve = {0.0: 239.0, 64.0: 111.0, 72.0: 1.0};
return evCarOptions;
}
HERE では、 EVConsumptionModel
電気自動車のエネルギー消費モデルを指定するようにを定義します。 また、BatterySpecifications
を追加します 。 これらのオプションを使用すると、追加のストップオーバーとして追加のチャージステーションをルートに挿入できます。つまり、挿入されたチャージステーションの数に応じて、ルートがより多くのセクションに分割されます。
注
このような必要な充電ステーションを含める場合は、必ずを使用 OptimizationMode.FASTEST
してください。 ensureReachability
また、 true に設定する必要があります。 ensureReachability
がアクティブ化 されている場合、必要な充電ステーションが結果の経路に沿って移動し、必要な充電ステーションがroute
にWayPoint
アイテムとして追加されるようにルートを調整できます。
すべてのオプションが、電気自動車のルートの計算にかかる時間に影響を与える可能性があります。 最も重要なのは、に設定されている大容量のバッテリー totalCapacityInKilowattHours
では、充電の停止や、旅程開始時のフル装備のバッテリーの必要性が低減されることです。詳細について initialChargeInKilowattHours
は、以下を参照してください。 比較的低い値は、ルートの先頭付近に充電ステーションが含まれている必要があることを意味します。 そうしないと、ルートの計算に失敗する可能性があります。
現在、エンジンには 使用中の充電ステーションのみが含まれています。 アウトオブサービスまたはメンテナンス中のチャージステーションは考慮されません。 ただし、チャージステーションでの動的な状況のため、エンジンは、ステーションが現在使用中または予約済みであるかどうかを判断しません。 最悪の場合、駅に到着したときに、別の車を充電するために現在使用されている可能性があります。
また、利用可能なバッテリーコネクタタイプも指定しているため、車両を充電するための互換性のあるコネクタを提供していない充電ステーションは除外されます。
注
通常、車自体から消費量および電池の情報を取るか、またはマニュアルかあなたの車の製造業者に直接相談できる。 すべての情報が利用できるわけではありません。また、一部の情報はメーカーのみが把握している場合があります。 いずれの場合も、ルート計算プロセスでは指定された仕様が考慮され、不足している値に適切なデフォルト値が入力されます。
特に電気自動車を使用した長距離ドライブの場合は、途中で充電の停止を計画することが重要です。 結局のところ、チャージステーションはガソリンスタンドよりもはるかに一般的ではありません。 上記のオプションを使用する と、RoutingEngine
は最速のルート(すなわち、目的地に到達するために消費された全体的な時間が最も短いルート)を探し、その間に車両のエネルギーが不足しないようにします。
この計算結果は、「 ルートに沿った検索 」セクションに示されているように、電気自動車向けに最適化されたルートです。経路に沿って見つかった充電ステーションを追加するだけではありません。
route
が計算されると、より有用な情報を収集できます。 以下に示すコード スニペットには、Section
ごとの推定エネルギー消費量が記録さ れ、必要に応じてバッテリーを充電するために必要な処置が一覧表示されます。
void _logEVDetails(here.Route route) {
int additionalSectionCount = route.sections.length - 1;
if (additionalSectionCount > 0) {
print("EVDetails: Number of required stops at charging stations: " + additionalSectionCount.toString());
} else {
print(
"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.sections;
for (Section section in sections) {
EVDetails? evDetails = section.evDetails;
if (evDetails == null) {
print("No EVDetails found.");
return;
}
print("EVDetails: Estimated net energy consumption in kWh for this section: " +
evDetails.consumptionInKilowattHour.toString());
for (PostAction postAction in section.postActions) {
switch (postAction.action) {
case PostActionType.chargingSetup:
print("EVDetails: At the end of this section you need to setup charging for " +
postAction.duration.inSeconds.toString() +
" s.");
break;
case PostActionType.charging:
print("EVDetails: At the end of this section you need to charge for " +
postAction.duration.inSeconds.toString() +
" s.");
break;
case PostActionType.wait:
print("EVDetails: At the end of this section you need to wait for " +
postAction.duration.inSeconds.toString() +
" s.");
break;
default:
throw ("Unknown post action type.");
}
}
print("EVDetails: Section " +
sectionIndex.toString() +
": Estimated battery charge in kWh when leaving the departure place: " +
section.departurePlace.chargeInKilowattHours.toString());
print("EVDetails: Section " +
sectionIndex.toString() +
": Estimated battery charge in kWh when leaving the arrival place: " +
section.arrivalPlace.chargeInKilowattHours.toString());
ChargingStation? depStation = section.departurePlace.chargingStation;
if (depStation != null && depStation.id != null && !chargingStationsIDs.contains(depStation.id)) {
print("EVDetails: Section " + sectionIndex.toString() + ", name of charging station: " + depStation.name.toString());
chargingStationsIDs.add(depStation.id.toString());
_addCircleMapMarker(section.departurePlace.mapMatchedCoordinates, "assets/required_charging.png");
}
ChargingStation? arrStation = section.departurePlace.chargingStation;
if (arrStation != null && arrStation.id != null && !chargingStationsIDs.contains(arrStation.id)) {
print("EVDetails: Section " + sectionIndex.toString() + ", name of charging station: " + arrStation.name.toString());
chargingStationsIDs.add(arrStation.id.toString());
_addCircleMapMarker(section.arrivalPlace.mapMatchedCoordinates, "assets/required_charging.png");
}
sectionIndex += 1;
}
}
に postAction.duration.inSeconds
は、バッテリの充電にかかる推定時間が記載されています。 この時間は、全体的なルート計算および到着予定時間( ETA )に含まれます。
以下は、結果として生じるルートのスクリーンショットです。
スクリーンショット: 電気自動車のルートを表示しています。 HERE ルートには、充電スタンドで 2 つの経由地が必要であることがわかります。赤色のマーカーで示されます。 ルートに は、各充電スタンドがルートを分割するときに、追加の経由地を挿入するときに 3 つのセクションが含まれています。
最初のセクションには 、充電の停止について説明する事後処理が含まれています。 これには、予想到着料金などの情報が含まれています。
特に指定のない限り、エネルギー消費量は Wh と見なされます。
消費モデルを定義します
以下のパラメータは、電気自動車のより正確な結果を得るための消費モデルを定義します。
- ascentConsumptionInWattHoursPerMeter: 1 メートルあたりのエネルギー消費量の上昇率。
- PercentRecoveryInWattHoursPerMeter : 1 メートルあたりのエネルギー回収率が上昇しています。
- freeFlowSpeedTable: 平坦な舗装路で、所定のフリーフロー速度での消費レートを指定する機能カーブ。
- trafficSpeedTable: 平坦な道路での交通状況下で、所定の速度での消費レートを指定する機能カーブ。
- auxiliaryConsumptionInWattHoursPerSecond : 車両の補助システム(エアコン、照明など)が 1 秒間に消費するエネルギーの割合。
消費速度表は、車両が km/時 で指定された速度で標高の変更を行うことなく直進路を走行するときのエネルギー消費量を定義する。 区分線形関数を表します。
HERE は、フリーフロー速度リストの例です。 左側には速度が、右側には燃費が表示されます。
- 0 : 0.239.
- 27 : 0.239.
- 45 : 0.259.
- 60 : 0.196.
- 75 : 0.207.
- 90 : 0.238.
- 100 : 0.26
- 110 : 0.296
- 120 : 0.337
- 130 : 0.351
グラフでは、次のようになります。
スクリーンショット: 燃費グラフの例。 2 つの異なる消費速度テーブル(フリーフロー速度テーブル と トラフィック速度テーブル)を指定できます。
- フリーフロー速度: 一定の速度で走行する場合のエネルギー消費量を示します。
- 走行速度: 交通量の多い状況で走行する場合のエネルギー消費量を示します。たとえば、車両が特定の平均速度で走行速度を頻繁に変更すると予想される場合などです。
trafficSpeedTable
が提供されていない場合 は、速度関連のエネルギー消費量の計算にのみfreeFlowSpeedTable
が使用されます。
注
GitHub でev_routing_app
サンプルのアプリを見つける ことができます。