ガイダンスを開始します
HERE SDK を使用すると、包括的なターン・バイ・ターンナビ (矢印ナビ)エクスペリエンスを構築できます。 この機能を使用すると、アプリは現在のデバイスの位置を計算されたルートと照合して確認し、ナビゲーションの指示をジャストインタイムで取得できます。
注
ナビゲーションは、を除くすべての利用可能なトランスポートモードでサポート publicTransit
されています。 公共交通機関を利用すると、ナビゲーションで安全でない予期せぬ結果が生じる可能性があります。
bus
ルートのナビゲーションサポートは現在制限されています : 今後リリースされる HERE SDK では、バス固有のレーンアシスタンスの改善や、バスナビゲーションのより正確なターンバイターン指示が期待されています。
輸送モードは、をまたいで変更 Route
される場合があります。たとえば、公園を歩いて観光地に到着した場合、車を降りる必要がある場合があります。 ルートが計算されると、トランスポート モードが Route
オブジェクトの各 Section
に添付されます。
車、トラック、タクシー、バス、スクーターのルートについては、道路と地図で車両の位置を合わせます。また、徒歩ルートなどの他のモードについては、舗装されていない舗装されていない舗装されていない舗装路やドライバーがアクセスできないその他の経路に位置を合わせることができます。 自転車ルートでは、利用可能なすべてのパスを利用できます。
HERE SDK では、追跡ルートがなくても 追跡モードをサポートしています。追跡モードでは、現在の道路、マップマッチした場所、および制限速度などのその他のサポート情報が提供されます。
HERE SDK に は、 視覚的なフィードバックを示すための操作矢印のための UI アセットがありません。 代わりに、ルート上で利用できるすべての情報が単純なデータ型として提供され、必要に応じて独自のアセットを選択できます。
注
ご自身のアプリケーションで使用できる再利用可能なアセットは、 HERE の MSDKUI オープンソースプロジェクトにあり ます。このプロジェクトは、 GitHub のこのリンクから利用できます。 再利用可能なアイコンの数は、 HERE の公式アイコンライブラリ に記載されています。
カスタマイズされたナビゲーションマップ ビューは、オプション VisualNavigator
でとともにレンダリングできます。 startRendering()
が呼び出されると、現在 MapMarker3D
の方向を示す矢印の形式で事前設定されたインスタンスが追加され、受信位置の更新がスムーズに補間されます。 さらに、地図の向きが最適なデフォルト値に変更されます。
事前設定 MapMarker3D
されたインスタンスは、独自のモデルを設定してカスタマイズすることも、無効にすることもできます。 内部的に、VisualNavigator
はLocationIndicator
インスタンスを使用するため、VisualNavigator
にLocationIndicator
カスタムを設定することもできます。 この操作が完了したら、インスタンスを手動で追加、削除、および更新する必要もあります。 マップ ビューですでにLocationIndicator
インスタンスを使用している場合と同様 に、関連する地図アイテムのセクションを参照してください。
デフォルトでは、LocationIndicator
のスタイルは、VisualNavigator
に設定できるトランスポートモードによって決まります。 ルートが設定されている場合は、代わりにルートインスタンスから取得されます。 カスタムアセットを使用する場合 LocationIndicator
は、クラスを介してスタイルを直接切り替える必要があります。
注
NavigationCustom Example アプリで は、ナビゲーションが停止したときにカスタムLocationIndicator
および別のタイプに切り替える方法を示します。 また、ナビゲーションパースペクティブのカスタマイズ方法も示します。
音声ガイダンスは 、 任意 String
のプラットフォーム TTS (音声合成)ソリューションにとして送信できる操作通知として提供されます。
注
オフラインガイダンスがサポートされています。 キャッシュ されているか、または事前にロードされているマップ データがないとルートがリージョンに到達しない限り、オフライン マップおよびトラッキングは、すでにキャッシュまたはダウンロードされているターン・バイ・ターンナビ (矢印ナビ)データでオフラインで完全に動作します。
ターン・バイ・ターンナビ (矢印ナビ)
ターン・バイ・ターンナビ (矢印ナビ)の基本原則は、速度や方位値などの位置情報を頻繁に受け取ることです。 これらの値は、道路と照合され、目的のルートと比較されます。 現在地と 次の目的地の方向を指定できる操作指示が表示されます。
ルートを出るときに、メートル単位で偏差が通知されます。 この通知を使用すると、新しいルートを計算するかどうかを決定できます。 最後に、位置シミュレータを使用すると、開発フェーズでルートナビゲーションをテストできます。
注 : 重要です
ターン・バイ・ターンナビ (矢印ナビ)を使用するアプリケーション開発者は、想定されるすべての使用シナリオでアプリケーションを徹底的にテストして、安全で正しい動作を保証する必要があります。 アプリケーション開発者は、アプリユーザーに以下を含む ( ただし、これらに限定されない ) 義務について警告する責任があります。
- 安全でない、または違法な状況につながる可能性のある指示に従わないでください。
- すべての地域の法律に従ってください。
- 運転中に携帯電話またはその機能の一部を使用することは禁止されている場合がありますので、ご了承ください。
- 運転中は、常に手を離さないでください。
- 走行中は、道路の安全性を最優先にしてください。
以下のセクションのすべてのコードスニペットは 、ナビゲーションサンプルアプリ の一部として GitHub でも利用できます。このアプリ は、関連するコードを示し、指導中に画面をアクティブに保つなど、安定したドライビング体験とベストプラクティスを提供します。 ただし、本格的な量産対応アプリケーションのすべての側面をカバーするわけではありません。 たとえば、アプリ では、アプリ がバックグラウンドで動作している間に位置情報の更新を取得する方法は表示されません。
位置情報のバックグラウンド更新を取得する場合 は、『位置情報の取得』ガイドの関連セクションを参照してください。
さらに 、 GitHub で NavigationQuickStart アプリを利用し て、数行のコードでガイダンスを開始する方法を確認することもできます。 次のセクションも参照してください。
利用開始
HERE SDK のナビゲーション機能についてより詳しく調べる前に、まず短いコード例を参照して、音声で操作できる指示とガイダンスビューを使用してガイダンスを開始する方法を示します。
_startGuidance(HERE.Route route) {
try {
_visualNavigator = HERE.VisualNavigator();
} on InstantiationException {
throw Exception("Initialization of VisualNavigator failed.");
}
_visualNavigator!.startRendering(_hereMapController!);
_visualNavigator!.maneuverNotificationListener = HERE.ManeuverNotificationListener((String maneuverText) {
print("ManeuverNotifications: $maneuverText");
});
_visualNavigator!.route = route;
_setupLocationSource(_visualNavigator!, route);
}
_setupLocationSource(HERE.LocationListener locationListener, HERE.Route route) {
try {
_locationSimulator = HERE.LocationSimulator.withRoute(route, HERE.LocationSimulatorOptions());
} on InstantiationException {
throw Exception("Initialization of LocationSimulator failed.");
}
_locationSimulator!.listener = locationListener;
_locationSimulator!.start();
}
このコードの抜粋では、ガイダンスビューが開始 され、提供されたroute
で定義されている宛先に到達するまで、操作手順がコンソールに出力されます ( 宣言を含むすべてのコードについては、「 NavigationQuickStart Example アプリ 」を参照してください ) 。 操作の指示はドライバーに伝えられることを意図しており、「左折して 5 、 000 m 先の Invalidenstra ß e に入る」などの文字列が含まれている場合があります。 操作方法の詳細な説明も利用できます。詳細については、以下のセクションを参照してください。
上記では、 HERE SDK のシミュレーション機能を使用して位置情報の更新を取得しています。 もちろん、に実際の位置情報の更新をフィードすることもでき VisualNavigator
ます。
ナビゲーションアプリの基本原則は次のとおりです。
- を作成
Route
します。 フォローするルートがないと、ガイダンスを開始できません。 VisualNavigator
インスタンスを作成してレンダリングを開始 Navigator
します ( または、独自のガイダンスビューをレンダリングする場合はインスタンスを作成します ) 。 - を
Route
に設定 VisualNavigator
します。 - 位置情報の更新がに送ら
VisualNavigator
れました。 位置情報がないと、ルート沿いのルートの進行状況を検出できません。 これは、上に示したようにシミュレートできます。または、実際の位置情報の更新を提供できます。
クイックスタートでは、 GitHub の NavigationQuickStart サンプルアプリ を参照して、この仕組みを確認してください。 で読むと、 HERE SDK が提供する多くのナビゲーション機能の詳細を確認できます。
注
Waypoint
を設定する場合 、ドライバーが道路のどの側に到着するかsideOfStreetHint
を設定して調整できます。 ドライバーが動いている場合、ベアリング値を headingInDegrees
に設定 Waypoint
することで、初期の方向を決定できます。 これにより、次の目的地がドライバーの後ろにある場合に、不要な U ターンを避けることができます。 これは、不要な道路横断を避けるためなど、歩行者のルートを最適化するのにも役立ちます。
ナビゲーターを使用して、ガイダンスイベントをリッスンします
前述のように、目的地へのナビゲーションを開始する前に、次の 2 つのことを行う必要があります。
- フォロー
Route
する A 。 ナビゲーションを開始するには、Navigator
またはVisualNavigator
インスタンスにRoute
を設定する必要があります。 Navigator
または VisualNavigator
インスタンスにユーザーがいる場所を定期的に通知する場所ソース。
ヒント : 次のパッケージをインポートして、 Fluter の Route/Navigator クラスとの名前の衝突を避けるようにしてください。
import 'package:here_sdk/navigation.dart';
import 'package:here_sdk/routing.dart' as HERE;
ルートがすでに計算されていない場合は、次のように作成します。 Route
インスタンスを取得中で あることが HERE に示されます。 アプリをトラッキングモードでのみ開始する場合は、この手順をスキップできます。
注
ターン・バイ・ターンナビ (矢印ナビ)中に、Navigator
またはVisualNavigator
インスタンスから現在のLocation
と同期されたすべてのManeuver
情報を取得します。 移動中は 、Route
オブジェクトから直接Manuever
データを取得しないでください。
ガイダンスを開始するには、 2 つの選択肢があります。 ヘッドレス Navigator
を使用するか、またはのサポートを受け VisualNavigator
てください。 両方とも、VisualNavigator
のサブセットをNavigator
提供するのと同じインターフェースを提供しますが、VisualNavigator
では、ディスクリートLocation
更新間のスムーズな補間などの機能を使用して、上部にビジュアルレンダリングの支援を提供します。
別の要件は、Location
インスタンスを提供することです。現在の場所で頻繁に更新を行わないとナビゲーションを実行できないためです。 このため には、 GitHub にあるプロバイダの実装を使用しLocation
てイベントをシミュレートするか、 または Get Locations ガイドの実装に従って、シミュレートされていない Location
イベントをリッスンします。 これは 、 navigation_app の例の一部としても表示されます。
プラットフォーム位置決めソリューションを実装するか、 HERE SDK 位置決め機能を使用 するか 、または位置シミュレータを設定することで、新しい場所にフィードできます。
基本的な情報フローは次のとおりです。
位置プロバイダ => 位置 => (Visual ) ナビゲータ => イベント
Location
任意のソースを「位置情報プロバイダ」として設定できます。 onLocationUpdated()
Navigator
またはVisualNavigator
でのみ呼び出す必要 があります。
開発者は、有効な場所でにフィードする責任 VisualNavigator
があります。 は、受信した各場所について VisualNavigator
、ルート沿いの進行状況を示す適切なイベント(操作、予想されるルートからの逸脱など)を使用して応答します。 結果のイベントは、提供された位置信号の精度と周波数に依存します。
まず、参照実装の新しいインスタンスを作成して場所を取得します。
_locationSimulationProvider = new HEREPositioningSimulator();
次に、新しい VisualNavigator
インスタンスを作成し HEREPositioningSimulator
、上記のからへのリスナーとして設定します。 このVisualNavigator
クラスは、位置を受け取るonLocationUpdated()
メソッドを定義するLocationListener
インターフェイスに準拠しています。
try {
_visualNavigator = VisualNavigator();
} on InstantiationException {
throw Exception("Initialization of VisualNavigator failed.");
}
_visualNavigator.route = route;
_locationSimulationProvider.startLocating(route, _visualNavigator);
さらに、追跡するルートを設定してください ( 追跡モードにする予定がある場合のみ ) 。
注
VisualNavigator
のレンダリング機能を使用しない場合は Navigator
、代わりにクラスを使用することもできます。 このクラスは、フードの下の同じコードを使用 VisualNavigator
し、とまったく同じように動作しますが、特殊なナビゲーションビューのレンダリングはサポートしていません。
次のステップでは、ルートの進行状況、現在の場所、ルートの逸脱に関する次の操作について通知を受け取るように、いくつかのリスナーをアタッチできます。
_visualNavigator.routeProgressListener = RouteProgressListener((RouteProgress routeProgress) {
List<SectionProgress> sectionProgressList = routeProgress.sectionProgress;
SectionProgress lastSectionProgress = sectionProgressList.elementAt(sectionProgressList.length - 1);
print('Distance to destination in meters: ' + lastSectionProgress.remainingDistanceInMeters.toString());
print('Traffic delay ahead in seconds: ' + lastSectionProgress.trafficDelay.inSeconds.toString());
List<ManeuverProgress> nextManeuverList = routeProgress.maneuverProgress;
if (nextManeuverList.isEmpty) {
print('No next maneuver available.');
return;
}
ManeuverProgress nextManeuverProgress = nextManeuverList.first;
int nextManeuverIndex = nextManeuverProgress.maneuverIndex;
Maneuver? nextManeuver = _visualNavigator.getManeuver(nextManeuverIndex);
if (nextManeuver == null) {
return;
}
ManeuverAction action = nextManeuver.action;
String roadName = _getRoadName(nextManeuver);
String logMessage = describeEnum(action) +
' on ' +
roadName +
' in ' +
nextManeuverProgress.remainingDistanceInMeters.toString() +
' meters.';
if (_previousManeuverIndex != nextManeuverIndex) {
print('New maneuver: $logMessage');
} else {
print('Maneuver update: $logMessage');
}
_previousManeuverIndex = nextManeuverIndex;
});
_visualNavigator.navigableLocationListener =
NavigableLocationListener((NavigableLocation currentNavigableLocation) {
MapMatchedLocation? mapMatchedLocation = currentNavigableLocation.mapMatchedLocation;
if (mapMatchedLocation == null) {
print('This new location could not be map-matched. Are you off-road?');
return;
}
var speed = currentNavigableLocation.originalLocation.speedInMetersPerSecond;
var accuracy = currentNavigableLocation.originalLocation.speedAccuracyInMetersPerSecond;
print("Driving speed (m/s): $speed plus/minus an accuracy of: $accuracy");
});
_visualNavigator.routeDeviationListener = RouteDeviationListener((RouteDeviation routeDeviation) {
HERE.Route? route = _visualNavigator.route;
if (route == null) {
return;
}
MapMatchedLocation? currentMapMatchedLocation = routeDeviation.currentLocation.mapMatchedLocation;
GeoCoordinates currentGeoCoordinates = currentMapMatchedLocation == null
? routeDeviation.currentLocation.originalLocation.coordinates
: currentMapMatchedLocation.coordinates;
GeoCoordinates lastGeoCoordinatesOnRoute;
if (routeDeviation.lastLocationOnRoute != null) {
MapMatchedLocation? lastMapMatchedLocationOnRoute = routeDeviation.lastLocationOnRoute!.mapMatchedLocation;
lastGeoCoordinatesOnRoute = lastMapMatchedLocationOnRoute == null
? routeDeviation.lastLocationOnRoute!.originalLocation.coordinates
: lastMapMatchedLocationOnRoute.coordinates;
} else {
print('User was never following the route. So, we take the start of the route instead.');
lastGeoCoordinatesOnRoute = route.sections.first.departurePlace.originalCoordinates!;
}
int distanceInMeters = currentGeoCoordinates.distanceTo(lastGeoCoordinatesOnRoute) as int;
print('RouteDeviation in meters is ' + distanceInMeters.toString());
});
HERE では、RouteProgressListener
、NavigableLocationListener
、およびRouteDeviationListener
を設定しまし た。
RouteProgressListener
内部では、渡されたRoute
インスタンスSection
ごとの進行状況に関する詳細情報にアクセスできます。 ルートは、経由地およびトランスポートモードの数に基づいて複数のセクションに分割できます。 remainingDistanceInMeters
および trafficDelay.inSeconds
はすでにセクションごとに累積されています。 SectionProgress
一覧表の最後の項目を確認して、目的地までの全体的な残り距離と全体的な推定交通遅延を取得します。
trafficDelay.inSeconds
は Route
データが計算された時刻に基づいているため 、ガイダンス中に交通渋滞の遅れは更新されません。 値は、初期データに基づいて進行中のセクションに沿ってのみ更新されます。 現在 DynamicRoutingEngine
のトラフィック状況に基づいて、最適化されたルートを定期的に要求するには、を使用します。
内部 RouteProgressListener
では、前方にある次の操作にもアクセスできます。 このために、次のものを使用します maneuverIndex
。
List<ManeuverProgress> nextManeuverList = routeProgress.maneuverProgress;
if (nextManeuverList.isEmpty) {
print('No next maneuver available.');
return;
}
ManeuverProgress nextManeuverProgress = nextManeuverList.first;
int nextManeuverIndex = nextManeuverProgress.maneuverIndex;
Maneuver? nextManeuver = _visualNavigator.getManeuver(nextManeuverIndex);
Maneuver
取得した情報 visualNavigator
を使用して、ドライバーが次のアクションや、このアクションが実行されるまでの距離などのその他の役立つ情報を表示するためのディスプレイを作成できます。 上記の例に示されているデバッグ目的で使用されている場合を除き、テキスト表現には使用しないことをお勧めします。 代わりに音声ガイダンスを使用してください ( 以下を参照 ) 。
ただし、ローカライズされた道路名または番地 ( 高速道路番号など ) を表示すると便利です。これらの住所は、次のように取得できます。
String _getRoadName(Maneuver maneuver) {
RoadTexts currentRoadTexts = maneuver.roadTexts;
RoadTexts nextRoadTexts = maneuver.nextRoadTexts;
String? currentRoadName = currentRoadTexts.names.getDefaultValue();
String? currentRoadNumber = currentRoadTexts.numbersWithDirection.getDefaultValue();
String? nextRoadName = nextRoadTexts.names.getDefaultValue();
String? nextRoadNumber = nextRoadTexts.numbersWithDirection.getDefaultValue();
String? roadName = nextRoadName == null ? nextRoadNumber : nextRoadName;
if (maneuver.nextRoadType == RoadType.highway) {
roadName = nextRoadNumber == null ? nextRoadName : nextRoadNumber;
}
if (maneuver.action == ManeuverAction.arrive) {
roadName = currentRoadName == null ? currentRoadNumber : currentRoadName;
}
roadName ??= 'unnamed road';
return roadName;
}
上 currentRoadTexts.names.getDefaultValue()
に示すように、経由でデフォルトの道路テキストを直接取得できます。 ほとんどの場合、この道路名はローカルの標識に示されている通りになります。
または、経由で、優先言語のリストに基づいて道路名のローカライズされたテキストを取得 currentRoadTexts.names.getPreferredValueForLocales(locales)
できます。 使用できる言語がない場合は、既定の言語が返されます。
注
RoadTextsListener
を使用 して、現在運転中の状況RoadTexts
(追跡モード中など)について通知を受け取ることができます。
デバイスの GPS センサーによって提供された位置が正確でない可能性があるため、VisualNavigator
は内部的に、NavigableLocation
物体の一部として当社に提供されたマップマッチした場所を計算します。 たとえば、道路の場所はナビゲーション可能なパスにあることが想定されています。 ただし、ユーザーが車を降りた場合や、 GPS 信号が弱すぎてマップマッチした場所を見つけることができない場合にも、軌道から外れてしまうことがあります。
マップマッチした場所を使用して、ユーザーに視覚的なフィードバックを提供することをお勧めします。 たとえば、マップマッチした場所に基づいて現在のマップ ビューを更新します。 ユーザーがオフロードにいるときなど、位置情報を地図上で照合できなかった場合にのみ、不一致にフォールバックすると便利 originalLocation
です。 以下 VisualNavigator
では、のレンダリング機能を使用して、マップ ビューを自動的に更新することを選択します。
注
ナビゲーション中は、 ManeuverAction
列挙型 (enum) によって示されている操作アイコンを視覚的インジケータとして表示することをお勧め します。また、走行を開始する前に、操作をプレビューするために、Maneuver
指示テキスト (nextManeuver.text
) がより多くのリストに収まるようにします。 これらのローカライズされた指示は記述的であり、進行中のガイダンスのコンテキスト外で理解できます。 ただし、一般 的には、オープンソースの HERE Icon ライブラリ にある対応するManeuverAction
アイコンと一緒に表示できます。 詳細については 、「ルーティング 」セクションを参照してください。
反対に nextManeuver.roadTexts
、nextManeuver.nextRoadTexts
およびnextManeuver.exitSignTexts
は 、ナビゲーション中のターンバイターン操作の一部として表示されます。 これらはManeuver
、Navigator
または VisualNavigator
から取得された場合にのみ空では ありません。 Route
インスタンスから取得した場合、これらの属性は常に空になります。
高速道路などの一部の道路には道路名がありません。 代わりに、道路番号を取得してください。 また、世界のどこかに名前のない道路がある可能性もあることにも注意してください。
次の表に、操作のプロパティの使用方法を示します。
操作のプロパティ |
RoutingEngine | ナビゲーター / ビジュアルナビゲーター | 例 |
操作テキスト | 空でない文字列を提供します。 | 空でない文字列を提供します。 | 出力例 text : "Detmolder Stra ß e を A100 方面に右折します。 " |
操作。 roadTexts | 空の文字列を提供します。 | 空でない文字列を提供します。 | 出力例 roadTexts.names.getDefaultValue() : "Stadtring" 。 |
manuence.nextRoadTexts を選択します | 空の文字列を提供します。 | 空でない文字列を提供します。 | 出力例 nextRoadTexts.names.getDefaultValue() : "Halenseestra ß e" |
Operation.exitSignTexts | 空の文字列を提供します。 | 空でない文字列を提供します。 | 出力例 exitSignTexts.getDefaultValue() : " ハンブルク " 。 |
注
上記のイベントを自分でトリガーする必要はありません。 代わり VisualNavigator
に、は、ロケーションプロバイダの実装からの提供された場所で応答します。
ルートの逸脱が検出 distanceInMeters
された場合は、ユーザーを宛先に再ルーティングするかどうかに基づいて決定できます。 フルルートの再計算では、同じルートパラメータを使用することがあります。 ルートに戻る方法の詳細については、次のセクションを参照してください。
上の例では、に含まれている座標に基づいて距離を計算します RouteDeviation
。distanceInMeters
。 ルート上の予想される場所と実際の場所の間の直線距離を示します。 その距離が遠すぎると判断 VisualNavigator
された場合は、インスタンスへの新たに計算されたルートを設定できます。それ以降のすべてのイベントは、新しいルートに基づいて作成されます。
ドライブガイダンスのシナリオでは、 lastLocationOnRoute
とmapMatchedLocation
が null
の場合があることに注意してください。 routeDeviation.lastLocationOnRoute
がの場合 null
、ユーザーはルートをフォローしていませんでした。これは、開始位置が道路ネットワーク から離れている場合に発生することがあります。 通常、 Navigator
/VisualNavigator
はLocation
の更新内容を道路と一致させようとします。 ドライバーが遠すぎると、その場所を見つけることができません。
注
イベントが非同期で配信されるため、キュー内の以前のイベントは、古いルートについて少なくとも 1 回は配信されることがあります。 この問題を回避するには、必要に応じて、新しいルートを設定した後で新しいリスナーを添付します。
navigation_app の例では、偏差を検出する方法を示します。
道路標識のイベントを聞きます
道に沿って多くの盾を見つけることができる。 運転中 RoadSignWarningListener
に、を設定することで、これらのシールドに関する詳細な通知を受信できます。
結果の RoadSignWarning
イベントには、RoadSignType
や RoadSignCategory
などの情報を含むシールドに関する情報が含まれます。
デフォルトでは、イベントは他のバーナーと同じ距離のしきい値で開始されます。
- 高速道路を利用する場合、約 2000 メートル先にイベントが発生します。
- 田舎道では、約 1500 メートル先にイベントが発生します。
- 都市部では、約 1000 メートル先にイベントが発生します。
で RoadSignWarningOptions
は、通知を受け取るシールドのフィルタを設定できます。
優先道路標識の例をいくつか示します。 すべてのロードシールドが含まれているわけではありません。 RoadSignType
サポートされているすべてのタイプを一覧表示 たとえば 、制限速度を示す道路標識 は、専用ので検知できるため、除外さ SpeedLimitListener
れます。
次のコード スニペット は、使用例を示しています。
RoadSignWarningOptions roadSignWarningOptions = new RoadSignWarningOptions();
roadSignWarningOptions.vehicleTypesFilter = [RoadSignVehicleType.trucks, RoadSignVehicleType.heavyTrucks];
_visualNavigator.roadSignWarningOptions = roadSignWarningOptions;
_visualNavigator.roadSignWarningListener = RoadSignWarningListener((RoadSignWarning roadSignWarning) {
print("Road sign distance (m): ${roadSignWarning.distanceToRoadSignInMeters}");
print("Road sign type: ${roadSignWarning.type.name}");
if (roadSignWarning.signValue != null) {
print("Road sign text: ${roadSignWarning.signValue!.text}");
}
});
RoadSignWarning
イベントは次の 2 回正確に発行されます。
DistanceType
が AHEAD
で、distanceToRoadSignInMeters
が 0 より大きい場合。 DistanceType
が PASSED
0 の場合 distanceToRoadSignInMeters
。
注
スピードカメラ、道路標識、現実的なビューなど、道路沿いの単一のオブジェクトについて通知する位置ワーナーの場合、一度に発生するアクティブな警告は常に1つだけです。 これは、各 ahead
イベントの後に常に passed
イベントが続くことを意味し、1つのオブジェクトに対する2つの先行警告が同時にアクティブになることを回避します。
ルート偏差を処理します
上記のセクションで見たように RouteDeviation
、このイベントを使用して、ドライバーが元のルートを離れたときに検出できます。 これは、運転中に目的地まで別のルートを選択しようとした場合など、誤って、または意図的に発生する可能性があることに注意してください。これは、ルートの代替およびルートオプションに関する以前の選択を無視して、運転者が目的地まで別のルートを選択する場合
上記のように 、ドライバーの現在の位置からルート上の最後の既知の位置までの距離を検出できます。 その距離に基づいて、アプリケーションは、新しいルート全体を計算する時か、ルート代替およびルートオプションの選択を維持するためにユーザーを元のルートに誘導する時かを決定できます。
HERE SDKは ルートを自動的に再計算することはなく、偏差距離のみを記録するため、ルートに戻る方法に関するロジックはアプリ側で実装する必要があります。
注
ヒント: RouteDeviation
このイベントは、新しいロケーションが更新されるたびに起動されます。 イベントの不必要な処理を避けるために、ドライバーがまだ逸脱しているかどうかを確認するために数秒待つことをお勧めします。 イベントが発生しなくなった場合は、ドライバーがルートに戻っていることを意味します。 ルート計算は非同期的に行われ、新しいルート計算を開始するタイミングと方法がアプリケーションによって決定されることに注意してください。 ただし、 Navigator
または VisualNavigator
インスタンスへのナビゲーション中にいつでも新しいルートを設定でき、今後のイベントは新しく設定された Route
インスタンスに基づいて更新されます。
ユーザーがオフロードである場合もあることを言及する価値があります。 新しいルートを設定した後も、ユーザはまだオフロードにいる可能性があります。そのため、ユーザはまだルートをたどることができません。 このような場合でも、新しく設定されたルートの偏差イベントを受信し、 routeDeviation.lastLocationOnRoute
ヌルになります。 ユーザーの現在の位置が変更されていない場合は、新しいルート計算を再開しないことをお勧めします。
HERE SDK には、ルートの逸脱を処理するための複数の API があります。
- 新しい、または更新した
RouteOptions
を使用して新しい代替ルートを提供するために、RoutingEngine
を使用してルート全体を再計算します。 ユーザーの現在の位置を新しい開始点として使用する場合は、最初のベアリング方向も指定してください Waypoint
。 returnToRoute()
このメソッドを使用して、最初に選択した代替ルートに到達するための新しいルートを計算します。 オンライン RoutingEngine
およびで利用 OfflineRouteEngine
できます。 を使用して計算されたルート OfflineRouteEngine
には、交通情報が含まれなくなっていることに注意してください。 routingEngine.refreshRoute()
元のルート上にある必要がある新しい始点を使用して、古いルートを更新し、オプションでルートオプションを更新します。 RouteHandle
は元のルートを識別する必要があります。 このオプションでは、逸脱した場所からルートに戻るパスは提供されないため、それ自体では、逸脱のユースケースには適していません。 - さらに、HERE SDKは、
DynamicRoutingEngine
現在のトラフィック状況に基づいて最適化されたルートを定期的に要求できるを提供します。 を必要とするため、オンラインで計算されたルートが必要 RouteHandle
です。 これは、ユーザーがまだルートをたどっている間に、より良いルートを見つけることを目的としています。 したがって、入力として現在の位置を必要としますが、偏差のユースケースには最適な選択ではない場合があります。
1 番めと 3 番めのオプションについては 、「ルーティング 」セクションで説明します。 元のルートを更新する 3 番目のオプションでは、逸脱した場所からルートに戻るパスは提供されません。 このため、以下では説明しません。 ただし、アプリケーションは、ルートから移動された部分を削除して、ユーザーが自分で新しい出発地点に到達できるようにするために使用できます。
逸脱した場所の距離や位置などのパラメータに基づいて、アプリケーションはドライバーに提供するオプションを決定する必要があります。
偏差後のルートに戻る
RoutingEngine
またはOfflineRoutingEngine
を使用して、元のルートに戻るルートをオンラインまたはオフラインで計算 します。 returnToRoute()
この方法は、最初に選択したルートを維持しながら、ドライバーができるだけ早くルートに戻るのを支援する場合に使用します。
注
returnToRoute()
ルート偏差を処理するための選択肢の1つにすぎません。 代替オプションについては、上記を参照してください。 たとえば、場合によっては、ユーザーの目的地までの新しいルート全体を計算することをお勧めします。
現在 、このreturnToRoute()
機能はエンジンと同じ輸送モードをサポート しています。OfflineRoutingEngine
、およびRoutingEngine
の両方を使用できます。 でメソッドを実行する場合 RoutingEngine
、パブリックトランジットルートのみがサポートされませ RoutingEngine
ん。の他のすべての利用可能なトランスポートモードがサポートされます。
注
このOfflineRoutingEngine
メソッドのreturnToRoute()
には、キャッシュされたマップ データまたはすでにダウンロードされた が必要です。 ほとんどの場合、ドライバーがルートから逸脱している間に、元のルートに戻るパスがすでにキャッシュされている可能性があります。 ただし、偏差が大きすぎる場合は、代わりに新しいルートを計算することを検討してください。
ルートの計算には、次のパラメータが必要です。
- オリジナル
Route
。 Navigator
/ から入手でき VisualNavigator
ます。 - で使用するに
OfflineRoutingEngine
は、ルートにすでに沿って移動したルートの正規化された割合も設定する必要があります。この割合は RouteDeviation
、次のイベントから利用できます。routeDeviation.fractionTraveled
。 オンラインの RoutingEngine
場合、このパラメータは無視されます。 fractionTraveled
このパラメータは、ルート上のドライバーの最後の既知の位置に基づいています。 ユーザーがルートを出発すると、「いいえ RouteProgress
」が配達されます。 この値は、 0 (進行状況なし) ~ 1 (宛先に到達)の値に正規化されます。 すでに走行したルートの一部は、ルート計算によって無視されます。 - 新しい開始地点
Waypoint
。ドライバーの現在の地図と一致する場所である可能性があります。
新しい出発地点は RouteDeviation
、次のイベントから取得できます。
MapMatchedLocation currentMapMatchedLocation = routeDeviation.currentLocation.mapMatchedLocation;
GeoCoordinates currentGeoCoordinates = currentMapMatchedLocation == null
? routeDeviation.currentLocation.originalLocation.coordinates
: currentMapMatchedLocation.coordinates;
Waypoint newStartingPoint = Waypoint(currentGeoCoordinates);
オンラインでは RoutingEngine
、完全に新しいルートが計算されることがあります。たとえば、ユーザーが以前に選択したルートの代替ルートよりも早く目的地に到達できる場合です。 は OfflineRoutingEngine
、ルートの非移動部分を誤って再利用します。
一般に、アルゴリズムは元のルートに戻る最速の方法を探しますが、宛先までの距離も考慮します。 新しいルートは、可能であれば元のルートの形状を保持しようとします。
まだ走行していないストップオーバー はスキップされません。 パススルー経由地の場合、新しいルートでそれらのルートがまったく考慮される保証はありません。
任意で、ドライバーの見出し方向を設定することで、ルート計算を改善できます。
if (currentMapMatchedLocation != null && currentMapMatchedLocation.bearingInDegrees != null) {
newStartingPoint.headingInDegrees = currentMapMatchedLocation.bearingInDegrees;
}
最後に、新しいルートを計算します。
routingEngine.returnToRoute(originalRoute, newStartingPoint, routeFractionTravelled, (routingError, routes) {
if (routingError == null) {
HERE.Route newRoute = routes.first;
} else {
}
});
注
CalculateRouteCallback
が再利用されるため、ルートのリストが提供されます。 ただし、リストに含まれるルートは 1 つだけです。 エラー処理は、と同じロジックに従い RoutingEngine
ます。
オンラインおよびオフラインでの使用に関する一般的なガイドラインとして returnToRoute()
、この機能は originalRoute
、すでに計算されているの前方の部分を再利用しようとします。 トラフィックデータは、オンラインで使用された場合にのみ更新さ RoutingEngine
れ、反映されます。
作成された新しいルートも OptimizationMode
、で検出されたものと同じものを使用し originalRoute
ます。
ただし、最良の結果を得る RoutingEngine
には、オンラインを使用してトラフィックを最適化したルートを取得することをお勧めします。
より適切なルートを動的に検索します
現在 DynamicRoutingEngine
のトラフィック状況に基づいて、最適化されたルートを定期的に要求するには、を使用します。 このエンジンは、走行中の現在のルートよりも速い( ETA に基づいて)新しいルートを検索します。
に DynamicRoutingEngine
は、オンライン接続とが必要 RouteHandle
です。 オフラインでより適切なルートを検索しようとした場合、または RouteHandle
が有効になっていない 場合、ルーティングエラーが伝播されます。
var routingOptions = HERE.CarOptions();
routingOptions.routeOptions.enableRouteHandle = true;
DynamicRoutingEngineOptions
を設定すると 、より適切なルートで通知を受け取る前にminTimeDifference
を定義できます。 は minTimeDifference
、現在設定されているルートの残りの ETA と比較されます。 で DynamicRoutingEngineOptions
は、 pollInterval
エンジンがより適切なルートを検索する頻度を決定するようにを設定することもできます。
void _createDynamicRoutingEngine() {
var dynamicRoutingOptions = DynamicRoutingEngineOptions();
dynamicRoutingOptions.minTimeDifference = Duration.zero;
dynamicRoutingOptions.minTimeDifferencePercentage = 0.0;
dynamicRoutingOptions.pollInterval = Duration(minutes: 5);
try {
_dynamicRoutingEngine = DynamicRoutingEngine(dynamicRoutingOptions);
} on InstantiationException {
throw Exception("Initialization of DynamicRoutingEngine failed.");
}
}
A を minTimeDifference
0 に設定すると、ルートが同じであってもイベントが取得されます。
より適切なルートを受信すると、元のルートとの差 route
がメートルと秒で表示されます。
void _startDynamicSearchForBetterRoutes(HERE.Route route) {
try {
_dynamicRoutingEngine.start(
route,
DynamicRoutingListener((Route newRoute, int etaDifferenceInSeconds, int distanceDifferenceInMeters) {
print('DynamicRoutingEngine: Calculated a new route.');
print('DynamicRoutingEngine: etaDifferenceInSeconds: $etaDifferenceInSeconds.');
print('DynamicRoutingEngine: distanceDifferenceInMeters: $distanceDifferenceInMeters.');
}, (RoutingError routingError) {
final error = routingError.toString();
print('Error while dynamically searching for a better route: $error');
}));
} on DynamicRoutingEngineStartException {
throw Exception("Start of DynamicRoutingEngine failed. Is the RouteHandle missing?");
}
}
提供され たetaDifferenceInSeconds
distanceDifferenceInMeters
に基づい て、現在のルートと比較して、newRoute
を使用するかどうかをアプリケーションが決定できます。 その場合 VisualNavigator
は、いつでもまたはNavigator
に設定できます。
注
DynamicRoutingEngine
は 交通情報および ETA を定期的に更新するために使用できますが 、新しいルートが異なるとは限りません。 さらに、 DynamicRoutingEngine
はインフォームをオン distanceDifferenceInMeters
にしますが、ルートの長さが変更されていない場合、ルートのシェイプが同じであるとは限りません。 ただし、 ETA のみが変更され、長さが同じ場合、交通状況の更新により ETA のみが更新された可能性があります。 元のルートにとどまることが重要な場合 routingEngine.refreshRoute()
は、ルートシェイプの座標を比較するか、または独自のルートを計算することを検討する必要があります。 呼び出し refreshRoute()
ても ルートの形状は変更されません。 詳細については、「ルーティング」セクションを参照してください。 反対 DynamicRoutingEngine
に、の用途はより適切なルートを見つけることであり、そのためには新しいルート形状をたどり、交通の障害物を回避することが最も望ましいことに注意してください。 また、より適切なルートは、前方のルートに交通障害物が存在する(または存在しなくなった)場合にのみ発見できます。
ドライバーの最後のマップマッチした場所 を更新し、 取得後すぐに ( RouteProgress
またはNavigableLocation
更新の一部として ) DynamicRoutingEngine
に設定してください。 これは、より適切なルートが常にドライバーの現在位置に近い位置から開始されるようにするために重要です。
_dynamicRoutingEngine.updateCurrentLocation(_lastMapMatchedLocation!, routeProgress.sectionIndex);
lastMapMatchedLocation
NavigableLocationListener
および sectionIndex
RouteProgressListener
から取得できます 。 updateCurrentLocation()
からイベントを受信する場合は、を呼び出すことをお勧め RouteProgressListener
します。
これの実装例について は、対応するナビゲーションの例アプリを参照してください。
ルートの交通情報を更新します
交通遅延時間を含む最新の到着時間( ETA )を提供し、現在のルートを超える交通の障害物について通知することが重要です。 旅程の交通情報を更新する方法を教えてください。
次の 2 つのシナリオがあります。
- 既存のルートにとどまる : この場合、を使用し
RoutingEngine
て refreshRoute()
、を定期的に呼び出します。 - 交通の障害物を迂回するための適切な代替ルートを探します。 を使用
DynamicRouteEngine
します。 ユーザーがRoute
新しいをフォローする必要がある場合 は、Navigator
またはVisualNavigator
インスタンスに設定する必要があります。
更新された ETA 、交通遅れ、交通渋滞情報を Route
オブジェクトから直接取得できます。
これらのオプションの詳細については、上記 のセクションを参照してください。
ルートポリライン を独自にレンダリングする場合、ルートでのトラフィックの表示がサポートされます。 この例について は、このガイドの「ルーティング」セクションを参照してください。 このガイドで Route
は、オブジェクトからトラフィック情報を抽出する方法についても説明します。
注
または 、マップでトラフィックフローレイヤをイネーブルにすることもできます。 のデフォルト設定で VisualNavigator
は、ルートポリライン の他にもトラフィックフロー回線が表示されます。 たとえば 、 HERE Wego アプリケーションはこのアプローチを使用して、現在の交通状況を視覚化します。
ビジュアルナビゲータを使用してマップ ビューを更新します
位置の更新に自分で対応する VisualNavigator
か、またはこの目的でを使用できます。
通常、ナビゲーション中に次の操作を行います。
- 地図上の現在の位置を追跡します。
- 現在の方向を示す位置矢印を表示します。
- 地図を現在の方向に回転させます。
- 操作矢印など、他の視覚的なアセットを追加します。
新しい位置情報イベントが発生するたびに、VisualNavigator
に送られた元の GPS 信号に基づいて計算されたマップマッチした場所を保持する新しいNavigableLocation
が作成されます。 このマップマッチした場所を使用してマップ ビューを更新できます。
ほとんどの場合、位置情報の更新は頻繁に行われますが、個別の手順で取得することに注意してください。 つまり、各場所の間に数百メートルの距離がある可能性があります。 カメラを新しい場所に更新すると、少しジャンプすることがあります。
一方、のレンダリング機能を使用すると VisualNavigator
、スムーズに補間された移動を利用できます。 ドライバーの速度に応じて、 2 つの位置更新の間の不足している座標が補間され、ターゲット地図の位置が自動的に更新されます。
さらに、は VisualNavigator
マップを傾斜させ、マップを見出し方向に回転させて、 3D 位置の矢印とを表示 LocationIndicator
します。 これらはすべて、次の 1 行のコードでアクティブ化できます。
_visualNavigator.startRendering(_hereMapController);
スクリーンショット: デバイスで実行されているターン・バイ・ターンナビ (矢印ナビ)の例。 さらに、次のものを使用して、現在の場所の追跡を停止できます。
_visualNavigator.cameraBehavior = null;
次のコマンドを使用して再度有効にします。
_visualNavigator.cameraBehavior = FixedCameraBehavior();
デフォルトでは、カメラ追跡が有効になっています。 したがって、マップは常に現在の位置を中心に配置されます。 これを一時的に無効にすると、ユーザーが手動でパニングしたり、ナビゲーションまたは追跡中に地図を操作したりできます。 3D の位置を示す矢印が移動し続けますが、地図 は移動しません。 カメラ追跡モードが再び有効になると、地図が現在の位置にジャンプし、位置情報の更新内容をスムーズに追跡できます。
進行中のナビゲーションを停止するには、を呼び出し _visualNavigator.route = null
ます。 上記のリスナーを null にリセットするか stop()
、ロケーションプロバイダを呼び出します ( プロバイダの実際の実装によって異なります ) 。 詳細については、以下のストップナビゲーションセクションを参照してください。
ソースコードの全文について は、対応するナビゲーションのサンプルアプリを確認してください。
ナビゲーションエクスペリエンスをカスタマイズします
NavigationCustom Example アプリで は、ナビゲーションが停止したときにカスタムLocationIndicator
および別のタイプに切り替える方法を示します。 また、ナビゲーションパースペクティブのカスタマイズ方法も示します。 GitHub でサンプルアプリを探します。
- で
CameraBehavior
は、ガイダンス中のマップ ビュー の外観をカスタマイズできます。 を使用して自動ズームの動作 DynamicCameraBehavior
を設定でき FixedCameraBehavior
ます。または、を使用して静的なチルトおよびズームの方向を設定できます。この方向は、プログラムで更新できます。 また、主点の変更などの他のオプションも使用できます。 - で
ManeuverNotificationOptions
は、 TTS 音声コマンドをいつ転送するかを指定できます。
マップ ビュー のカスタマイズオプションがさらに必要な場合 は、VisualNavigator
の代わりに Navigator
を使用することを検討してください。 ヘッドレスでNavigator
あれば、同じ機能を利用できます。 ただし、デフォルトまたはカスタマイズ可能なレンダリングオプションはありません。その代わりに、マップ ビュー 全体を独自にレンダリングできます。たとえば、より大きなルートラインやその他の視覚的なカスタマイズを使用する場合は、 HERE SDK の一般的なレンダリング機能を使用できます。
を使用し Navigator
ている場合、スムーズなマップエクスペリエンスをレンダリングするには、マップビューの現在のターゲット位置を自分で更新する必要があります。 位置情報プロバイダは、新しい位置情報の更新を個別の手順でのみ送信します。これは、高頻度で配達された場合でも、「ジャンプ」マップ ビュー につながります。 そのため、 InterpolatedLocationListener
を使用 VisualNavigator
して、と同じスムーズな位置更新を取得することをお勧めします。
ルートの飲食
デフォルト では、VisualNavigator
は異なる色でRoute
をレンダリングし、現在の位置の背後にある移動パーツをユーザーの前のパーツから視覚的に分離します。 これは無効化またはカスタマイズできます。 既定では、 HERE Wego モバイルアプリケーションと同じ色が使用されます。
ルートイートアップの視覚化を無効にする場合は、次の電話をしてください。
visualNavigator.isRouteProgressVisible = false;
デフォルト VisualNavigatorColors
では、昼間モードと夜間モードが使用できます。 たとえば、日中に応じて色を切り替えることができます。 デフォルトの色は、次のようにカスタマイズできます。
void _customizeVisualNavigatorColors() {
Color routeAheadColor = Colors.blue;
Color routeBehindColor = Colors.red;
Color routeAheadOutlineColor = Colors.yellow;
Color routeBehindOutlineColor = Colors.grey;
Color maneuverArrowColor = Colors.green;
VisualNavigatorColors visualNavigatorColors = VisualNavigatorColors.dayColors();
RouteProgressColors routeProgressColors = new RouteProgressColors(
routeAheadColor,
routeBehindColor,
routeAheadOutlineColor,
routeBehindOutlineColor);
visualNavigatorColors.maneuverArrowColor = maneuverArrowColor;
visualNavigatorColors.setRouteProgressColors(SectionTransportMode.car, routeProgressColors);
_visualNavigator?.colors = visualNavigatorColors;
}
これ により、パスに沿ってレンダリングされる操作矢印の色を変更して、次の回転を示すこともできます。
経由地イベントを受信します
VisualNavigator
/classes Navigator
は、より便利な通知を提供します。 次に、渡された経由地 で通知を受け取る方法の例を示します。 宛先経由地 では、次の 2 つの方法で通知を受け取ることができます。
- 以下の最初のリスナが目的地に到達したことを通知します。そのため、ナビゲーションを停止できます。
- 一方、 2 番目のリスナーは 、宛先経由地 を含むすべてのタイプの経由地 について通知を受け取る方法を示しますが 、パススルー 経由地 は除きます。
_visualNavigator.destinationReachedListener = DestinationReachedListener(() {
print('Destination reached. Stopping turn-by-turn navigation.');
stopNavigation();
});
_visualNavigator.milestoneStatusListener = MilestoneStatusListener((Milestone milestone, MilestoneStatus milestoneStatus) {
if (milestone.waypointIndex != null && milestoneStatus == MilestoneStatus.reached) {
print('A user-defined waypoint was reached, index of waypoint: ' + milestone.waypointIndex.toString());
print('Original coordinates: ' + milestone.originalCoordinates.toString());
} else if (milestone.waypointIndex != null && milestoneStatus == MilestoneStatus.missed) {
print('A user-defined waypoint was missed, index of waypoint: ' + milestone.waypointIndex.toString());
print('Original coordinates: ' + milestone.originalCoordinates.toString());
} else if (milestone.waypointIndex == null && milestoneStatus == MilestoneStatus.reached) {
print('A system-defined waypoint was reached at: ' + milestone.mapMatchedCoordinates.toString());
} else if (milestone.waypointIndex == null && milestoneStatus == MilestoneStatus.reached) {
print('A system-defined waypoint was missed at: ' + milestone.mapMatchedCoordinates.toString());
}
});
onMilestoneStatusUpdated()
このメソッドは Milestone
、ルートに沿って渡された、または失われた経由地 に関する情報を含むインスタンスを提供します。 ストップオーバー の経由地 のみが含まれています。 また、目的地の経由地 と、ユーザーが追加したその他のすべてのストップオーバー経由地 が含まれます。 さらに、 HERE SDK が追加した経由地 も含まれています。たとえば、フェリーを利用する必要がある場合などです。 ただし、旅程の出発地点である最初の経由地 は除外されます。 パス スルータイプの経由地 も除外されます。
に Milestone
は、ルートの計算時にユーザーが設定した経由地 リストを参照するインデックスが含まれています。 利用できない場合、は Milestone
、ルートの計算中に設定された経由地 を参照します。たとえば、フェリーを利用する必要があることを示すために、ルーティングアルゴリズムによって追加のストップオーバーが含まれていた場合などです。
MilestoneStatus
列挙型 (enum) は、対応する Milestone
に達したか、または不在であったかを示します。
制限速度のイベントを受信します
を実装すると SpeedLimitListener
、道路で利用できる制限速度でイベントを受信できます。 これらは、ローカルの標識に示されている制限速度、および特定の気象条件にのみ有効な制限速度などの特殊な速度状況に関する警告になります。
条件付きとしてマークされている制限速度は、時間によって異なる場合があります。 たとえば、学校区の制限速度は、特定の時間帯にのみ有効です。 この場合、 HERE SDK はデバイスの時間を制限速度の時間範囲と比較します。 制限速度が現在有効な場合、イベントとして伝播されます。有効でない場合は、イベントとして伝播されません。
実装例は 、GitHub にある navigation_app の例に記載されています。
_visualNavigator.speedLimitListener = SpeedLimitListener((SpeedLimit speedLimit) {
double? currentSpeedLimit = _getCurrentSpeedLimit(speedLimit);
if (currentSpeedLimit == null) {
print("Warning: Speed limits unknown, data could not be retrieved.");
} else if (currentSpeedLimit == 0) {
print("No speed limits on this road! Drive as fast as you feel safe ...");
} else {
print("Current speed limit (m/s): $currentSpeedLimit");
}
});
double? _getCurrentSpeedLimit(SpeedLimit speedLimit) {
print("speedLimitInMetersPerSecond: " + speedLimit.speedLimitInMetersPerSecond.toString());
print("schoolZoneSpeedLimitInMetersPerSecond: " + speedLimit.schoolZoneSpeedLimitInMetersPerSecond.toString());
print("timeDependentSpeedLimitInMetersPerSecond: " + speedLimit.timeDependentSpeedLimitInMetersPerSecond.toString());
print("advisorySpeedLimitInMetersPerSecond: " + speedLimit.advisorySpeedLimitInMetersPerSecond.toString());
print("fogSpeedLimitInMetersPerSecond: " + speedLimit.fogSpeedLimitInMetersPerSecond.toString());
print("rainSpeedLimitInMetersPerSecond: " + speedLimit.rainSpeedLimitInMetersPerSecond.toString());
print("snowSpeedLimitInMetersPerSecond: " + speedLimit.snowSpeedLimitInMetersPerSecond.toString());
return speedLimit.effectiveSpeedLimitInMetersPerSecond();
}
制限速度は、指定した転送モードによって異なります。 現在、 HERE SDK では 、各国の正規顧客車両規制( CVR )に基づいて、車両とトラックの差別化を図っています。 つまり、上記 SpeedLimit
のイベントはトラックの制限速度の低下を示している可能性があります。 たとえば、高速道路では 、制限速度はドイツ で最大 80 km/時 になります。一方、車両では、制限速度が 130 km/時 以上であることが示されている場合があります。 CVR の制限速度を取得するには、地図バージョン 32 以降を使用してください。 より低い地図バージョンでは、トラックは車と同じ制限速度を受け取ります。 MapUpdater
地図のバージョンは、ダウンロードされた地域がない場合でもで更新できます。ナビゲーションは、現在地図キャッシュに保存されているのと同じバージョンのマップ データ のみを要求するためです。 したがって、これはオンライン とオフラインの両方の使用に適用されることに注意してください。
情報
トラックの場合は TruckSpecifications
、の内側も指定することをお勧め RouteOptions
します。 トラック grossWeightInKilograms
の制限速度に影響が出る可能性があります。 ほとんどの国では、法的に許可されている制限速度に影響があります。 重量が設定されていない場合、法的に許容されているトラックの最高速度制限のみが転送されます。 HERE SDK は、トラックの重量が非常に少ないと想定します。 トラックの制限速度は、地域の顧客車両規制( CVR )に基づいて決定されます。 日本 のような国々では、この規制が異なります。 ただし、トラック用に計算されたルートでは、車両に適した制限速度は提供されません。たとえば、トラックの重量が 3.5 T 未満の場合は、代わりに車のルートを計算することを検討してください。
注意 : トラック 運転者の場合、トラッキングモードの場合は、navigator.trackingTransportProfile(vehicleProfile)
を呼び出しVehicleProfile
て輸送モードtruck
などを使用して設定します。 デフォルト car
では、が想定され、車両に有効な制限速度のみを受信します。車両に応じて、重量などの他の車両プロパティも指定してください。
注
日本 のルートの場合、TruckSpecifications
経由で特殊フラグisLightTruck
を設定できます。 このフラグは、トラックが車両として分類できるほど軽量であるかどうかを示します。 このフラグ は、日本 以外の国では使用できません。 これはこの機能のベータ版です。
速度警告イベントを受信します
新しい制限速度イベント ( 上記を参照 ) を受信したときに、自分で制限速度を超過したことを検出できますが、アプリに速度警告機能を実装するのに役立つ、より便利なソリューションがあります。
注
これは、天候に応じた制限速度などの一時的な制限速度を超過した場合には警告しません。
onSpeedWarningStatusChanged()
ドライバーが現在許可されている制限速度を超過すると、ただちに通知されます。 また、制限速度を超過した後、ドライバーが再び低速で走行しているときにも通知されます。
_visualNavigator.speedWarningListener = SpeedWarningListener((SpeedWarningStatus speedWarningStatus) {
if (speedWarningStatus == SpeedWarningStatus.speedLimitExceeded) {
SystemSound.play(SystemSoundType.click);
print('Speed limit exceeded.');
}
if (speedWarningStatus == SpeedWarningStatus.speedLimitRestored) {
print('Driver is again slower than current speed limit (plus an optional offset.)');
}
});
注
lambda_onSpeedWarningStatusChanged()
では、制限速度データが利用できない場合は通知されません。 この情報は NavigableLocation
、インスタンスの一部としてのみ使用できます。
が SpeedWarningStatus
配達されるのは、現在の速度を超過した場合、または再び復元された場合のみです。たとえば、ドライバーが頻繁に運転する速度が速すぎた場合、 1 つのイベントのみが点火されます。
lambda_onSpeedWarningStatusChanged()
通知は、現在の道路の制限速度およびドライバーの速度に応じて異なります。 つまり、ルートから独立して、速度警告イベントを追跡モードでも取得できます。 その結果 speedLimitRestored
、ルートが変更されたときに、ドライバーの減速後にイベントを受け取ることができます。
オプションで、制限速度の値に追加されるオフセットを定義できます。 オフセットを含む制限速度を超過した場合にのみ、通知が送られます。 以下では、 2 つのオフセットを定義します。 1 つは下限のオフセットで、もう 1 つは高速の制限のオフセットです。 境界は highSpeedBoundaryInMetersPerSecond
次の要素で定義されます。
void _setupSpeedWarnings() {
SpeedLimitOffset speedLimitOffset = SpeedLimitOffset();
speedLimitOffset.lowSpeedOffsetInMetersPerSecond = 2;
speedLimitOffset.highSpeedOffsetInMetersPerSecond = 4;
speedLimitOffset.highSpeedBoundaryInMetersPerSecond = 25;
_visualNavigator.speedWarningOptions = SpeedWarningOptions(speedLimitOffset);
}
HERE では、を highSpeedBoundaryInMetersPerSecond
25 m/s に設定しています。 制限速度の標識に 25 m/s を超える値が表示 highSpeedOffsetInMetersPerSecond
されている場合、使用されているオフセットはです。 25 m/s 未満の場合、使用されているオフセットはです lowSpeedOffsetInMetersPerSecond
。
上で使用した値の例では、
-
道路の制限速度が 27 m/s の場合、使用される(高速)オフセットは 4 m/s です これは、 31 m/s = 27 m/s + 4 m/s を超える速度で走行している場合にのみ警告通知を受け取ることを意味します highSpeedOffsetInMetersPerSecond
現在の制限速度がより大きいため、が使用 highSpeedBoundaryInMetersPerSecond
されます。
-
道路の制限速度が 20 m/s の場合、使用されている(低速)オフセットは 2 m/s です つまり、 22 m/s = 20 m/s + 2 m/s を超える速度で走行している場合にのみ、警告通知が送られます lowSpeedOffsetInMetersPerSecond
現在の制限速度がよりも小さいため、が使用 highSpeedBoundaryInMetersPerSecond
されます。
負のオフセット値を設定することもできます。 これは、制限に達する前にバッファを用意して制限速度を超過しないようにする場合に役立ちます。 走行 速度が遅すぎる場合、例えば定義されているオフセットよりも遅い場合などは、前の速度警告が復元されない限り、通知を受け取ることはありません。
注
車両の仕様については、上記の制限速度についての規則と同じ規則が適用されます。
スピードカメライベントを受信します
Navigator
またはVisualNavigator
にSafetyCameraWarningListener
を接続すると、ドライバーの速度を検知するカメラに通知するSafetyCameraWarning
イベントについて通知を受け取ることができます。
ほとんどの国では、カメラは永久インストールされています。 HERE SDK は、カメラが現在アクティブかどうかを通知しません。
「スピードカメラ」とも呼ばれるセイフティカメラに関する通知を受け取ることは、国によっては利用できない場合があります。地域の法律および規制によります。 フランスなどの国では、スピードカメラの正確な位置情報は法律で禁止されています。 代わりに、政府のガイドラインを満たすために、 HERE からの通知の精度を下げることのみができます。 ただし、ほとんどの国では、正確な位置情報が許可されています。
現在、以下の国々がサポートされています。
スピードカメラのカバレッジ
- アメリカ合衆国
- イギリスのイギリスと北アイルランド
- アラブ首長国連邦
- トルコ
- タイ
- 台湾
- スウェーデン
- スペイン
- 南アフリカ
- スロベニア
- スロバキア
- シンガポール
- セルビア
- サウジアラビア
- ロシア連邦
- ルーマニア
- カタール
- ポルトガル
- ポーランド
- オマーン
- ノルウェー
- オランダ
- メキシコ
- マレーシア
- マカオ
- ルクセンブルグ
- リトアニア
- ラトビア
- クウェート
- Kazakhstan
- イタリア
- イスラエル
- マン島
- アイスランド
- ハンガリー
- 香港
- ギリシャ
- フランス
- フィンランド
- エストニア
- デンマーク
- チェコ
- キプロス
- クロアチア
- チリ
- カナダ
- ブルガリア
- ブラジル
- ボスニア・ヘルツェゴビナ
- ベルギー
- ベラルーシ
- バーレーン
- アゼルバイジャン
- オーストリア
- アルゼンチン
- アンドラ
道路の属性を取得します
を実装すると RoadAttributesListener
、道路属性でイベントを受信できます。 道路を走行中に属性が変更されると、イベントが開始されます。
_visualNavigator.roadAttributesListener = RoadAttributesListener((RoadAttributes roadAttributes) {
print('Received road attributes update.');
if (roadAttributes.isBridge) {
print('Road attributes: This is a bridge.');
}
if (roadAttributes.isControlledAccess) {
print('Road attributes: This is a controlled access road.');
}
if (roadAttributes.isDirtRoad) {
print('Road attributes: This is a dirt road.');
}
if (roadAttributes.isDividedRoad) {
print('Road attributes: This is a divided road.');
}
if (roadAttributes.isNoThrough) {
print('Road attributes: This is a no through road.');
}
if (roadAttributes.isPrivate) {
print('Road attributes: This is a private road.');
}
if (roadAttributes.isRamp) {
print('Road attributes: This is a ramp.');
}
if (roadAttributes.isRightDrivingSide) {
print('Road attributes: isRightDrivingSide = ' + roadAttributes.isRightDrivingSide.toString());
}
if (roadAttributes.isRoundabout) {
print('Road attributes: This is a roundabout.');
}
if (roadAttributes.isTollway) {
print('Road attributes change: This is a road with toll costs.');
}
if (roadAttributes.isTunnel) {
print('Road attributes: This is a tunnel.');
}
});
実装例について は、 GitHub にあるナビゲーションの例アプリを参照してください。
HERE SDK 自体は、このようなイベントには反応しませ roadAttributes.isTunnel
ん。 アプリケーションは isTunnel
、 true である限り夜間マップ スキーム に切り替えることを決定できます。 内部的には、 HERE SDK はトンネル補間アルゴリズムを使用してこの検出を提供しています。通常、 GPS 信号は非常に弱いか、トンネルにいる間に失われる可能性があります。
レーンアシスタンスを利用できます
HERE SDK は、ドライバーがルートに乗るのを助けるように車線変更を提供する。 「いいえ Route
」に設定されている場合、車線支援は提供されません。
ジャンクションに到達する前に、 2 つの独立したリスナーを設定して、次のイベントを取得できます(交差およびラウンドバックを含む)。
-
ManeuverViewLaneAssistance
: Lane
ジャンクションが複雑と見なされているかどうかにかかわらず、ジャンクションで次のルート操作が行われた場合の推奨事項のリストを提供します。 -
JunctionViewLaneAssistance
: Lane
ジャンクションで操作が行われたかどうかにかかわらず、複雑なジャンクションでのみ推奨事項のリストを提供します。 このイベントは、非複合ジャンクションには配信されません。
複合ジャンクションは次のように定義されます。
- ジャンクションには少なくとも分岐があります。
- ジャンクションには、現在のルートに沿っていない方向のレーンが少なくとも 2 つあります。
両方のイベントを同じジャンクションまたは異なるジャンクションに送信できます。 Lane
インスタンスには、現在の道路で利用可能な車線、その方向のカテゴリ、車線が推奨されるかどうかなどの情報が含まれています。
どちらのイベントも、高速道路以外のジャンクションより 300 メートル先、高速道路のジャンクションより 1300 メートル先に発生します。 ただし、現在のところ、次の複合ジャンクションまでの距離は JunctionViewLaneAssistance
イベントの一部として公開されていません。 ManeuverViewLaneAssistance
では、 この距離は、RouteProgress
イベント経由で利用できる次の操作までの距離の一部として利用できます。
各車線は、以下に保存されている複数の方向に進むことができます LaneDirectionCategory
。
-
straight
: 直進する車線。 -
slightlyLeft
: 45 度前後にわずかに左に出る車線。 -
slightlyRight
: 45 度前後にわずかに右に曲がる車線。 -
quiteLeft
: 90 度前後にかなり左に出る車線。 -
quiteRight
: 90 度前後の車線。 -
hardLeft
: 135 度ほど左に曲がる車線。 -
hardRight
: 135 度前後に急に曲がる車線。 -
uTurnLeft
: 左に U ターンして 180 度曲がる車線。 -
uTurnRight
: 右に U ターンして 180 度曲がる車線。
すべてのメンバーが true
同時にまたは同時に false
参加できることに注意してください。 理論 true
的には、すべてのメンバーが車線がすべての複数の方向に導かれる場合になることがあります。 ただし、ほとんどのレーンは 1 つまたは 2 つの方向に導かれ、レーンが 2 つの別々のレーンに分割されます。quiteLeft
quiteRight
true
ドライバーに視覚的なフィードバックを提供するには、 9 つの方向ごとに 1 つの透明なイメージアセットを作成することをお勧めします。 各画像をオーバーレイとして使用し、複数の画像を 1 つの車線のピクトグラムに混合して、道路上の車線ごとに可能な道順を示すことができます。
最も重要なのは、車両がルートを走行している間に、どの車線を走行するかドライバーに知らせることができることです。 この情報はLane.recommendationState
に保存 され、推奨レーンの絵文字を強調表示することをお勧めします。
図 : 3 つのレーンがある道路で、左端の 2 つの道路が次の操縦につながる可能性のある視覚化の例。 レーンアシスタンス情報 には、逆方向のレーンは含まれていません。代わりに、現在の走行方向のレーンのみが記述されています。 レーンのリストは、常に左端のレーン(インデックス 0 )から道路の右端のレーン(最後のインデックス)まで並べ替えられます。
このように、車線アシスタンスは、左側および右側の両方の運転国で同じように機能します。
注
roadAttributes.isRightDrivingSide
左側の運転国にいるかを確認してください。 操縦指示およびその他の通知は、自動的に国に合わせて調整されます。 レーンアシスタンスの場合、国に関係なくコードは同じように機能します。レーンのリストは常に左からインデックス 0 から右に並べ替えられます。
ManeuverViewLaneAssistance
イベントを受信した直後にイベントを表示することをお勧めします。 音声 ManeuverNotificationListener
ガイダンスイベントを受信するために、イベントがと同期されます。
JunctionViewLaneAssistance
イベントによって提供された車線情報は、別の UI エリアに表示することをお勧めします。これは、今後注意が必要な複雑な交差点があることを示しています。
ManeuverViewLaneAssistance を利用して、ジャンクションでの操縦について推奨される車線を取得できます
ManeuverViewLaneAssistance
このイベントでは、操縦が行われるジャンクションで推奨レーンが提供されます。 この操作は、 VisualNavigator
がをレンダリングしているときに、地図上で操作矢印によって表示さ MapView
れます。 ジャンクションの場所は、RouteProgress
イベントの一部として利用できる次のManeuver
ジャンクションから取得できます。
各 ManeuverViewLaneAssistance
イベントは、によって送信された対応する操作音声通知と同期さ ManeuverNotificationListener
れます。 これは、ほとんどの道路で、交差点までの距離で次の操作を説明する操作音声通知テキストと同じ頻度で、イベントが同時に到着することを意味します。 以下で説明するように、このイベントは、 TTS エンジンが操作メッセージをドライバーに伝えるために使用できます。
上記の他のイベントと同様に、Navigator
またはVisualNavigator
にManeuverViewLaneAssistanceListener
を添付できます。 結果 ManeuverViewLaneAssistance
のオブジェクトには、現在の道路で利用可能な車線に関する情報と、その道順などの情報が含まれます。
次のコード スニペットは、どのレーンを取得するかについての情報を取得する方法を示しています。
_visualNavigator.maneuverViewLaneAssistanceListener =
ManeuverViewLaneAssistanceListener((ManeuverViewLaneAssistance laneAssistance) {
List<Lane> lanes = laneAssistance.lanesForNextManeuver;
logLaneRecommendations(lanes);
List<Lane> nextLanes = laneAssistance.lanesForNextNextManeuver;
if (nextLanes.isNotEmpty) {
print("Attention, the next next maneuver is very close.");
print("Please take the following lane(s) after the next maneuver: ");
logLaneRecommendations(nextLanes);
}
});
...
void logLaneRecommendations(List<Lane> lanes) {
int laneNumber = 0;
for (Lane lane in lanes) {
if (lane.recommendationState == LaneRecommendationState.recommended) {
print("Lane $laneNumber leads to next maneuver, but not to the next next maneuver.");
}
if (lane.recommendationState == LaneRecommendationState.highlyRecommended) {
print("Lane $laneNumber leads to next maneuver and eventually to the next next maneuver.");
}
if (lane.recommendationState == LaneRecommendationState.notRecommended) {
print("Do not take lane $laneNumber to follow the route.");
}
laneNumber++;
}
}
は laneAssistance.lanesForNextNextManeuver
通常空のリストですが、 2 つの操作が非常に近い場合があります。 このような場合、このリストには、現在の操縦状況に達した直後に車線が取得する情報が保持されます。
次の操縦に達するまで、車線に関する情報が有効になります。 次の操作に到達するか、または新しい ManeuverViewLaneAssistance
イベントに含まれている情報に置き換えられたら、非表示にする必要があります。
if (_previousManeuverIndex != nextManeuverIndex) {
}
RouteProgressListener
上記のコードを参照 nextManeuverIndex
すると、の入手方法を確認できます。この方法では、新しい操作を行う必要があることが示されます。
JunctionViewLaneAssistance で、複合ジャンクションのレーンに関する推奨事項を入手できます
ManeuverViewLaneAssistance
HERE SDK は、(上記を参照)に加え JunctionViewLaneAssistance
て、ジャンクションで実際に操作が行われていない場合でも、複雑なジャンクションで利用可能なレーンについて通知するイベントを提供します。 これらの通知は ManeuverViewLaneAssistance
と並行して動作しますが 複雑 なジャンクションに達する前にのみ発生します ( 上記を参照 ) 。
ManeuverViewLaneAssistance
と比較して、このJunctionViewLaneAssistance
イベントでは、複雑なジャンクションを安全に通過するためにより多くのレーンを推奨できますが、ジャンクションを通過した後、これらのレーンのすべてが次の操縦につながるわけではありません。
とは異なり ManeuverViewLaneAssistance
、ジャンクションが渡されたタイミングを検出するには、リストが空かどうかを確認します。
_visualNavigator.junctionViewLaneAssistanceListener =
JunctionViewLaneAssistanceListener((JunctionViewLaneAssistance junctionViewLaneAssistance) {
List<Lane> lanes = junctionViewLaneAssistance.lanesForNextJunction;
if (lanes.isEmpty) {
print("You have passed the complex junction.");
} else {
print("Attention, a complex junction is ahead.");
logLaneRecommendations(lanes);
}
});
複合ジャンクションを通過したら、アプリ の UI を更新して車線情報を削除することをお勧めします。 JunctionViewLaneAssistance
イベントは、複雑な交差点でどの車線を走行するかを示す追加のヒントと見なすことができます。特に、このような交差点で操縦が行われない場合は、この情報は ManeuverViewLaneAssistance
イベントに含まれていないためです。
ルートがない場合、車線変更に関連するイベントは発生しませんので、ご注意ください。
標識や交差点表示のリアルなビューを取得できます
で RealisticViewWarningListener
は、署名後盾および複合ジャンクションビューの SVG 文字列データを 3D で受信できます。RealisticViewWarning
このイベントには、署名者ビューとジャンクションビューの両方の SVG データが含まれています。 この警告は 、複雑 なジャンクションにのみ表示されます(上記を参照)。
void _setupRealisticViewWarnings() {
RealisticViewWarningOptions realisticViewWarningOptions = RealisticViewWarningOptions();
realisticViewWarningOptions.aspectRatio = AspectRatio.aspectRatio3X4;
realisticViewWarningOptions.darkTheme = false;
_visualNavigator.realisticViewWarningOptions = realisticViewWarningOptions;
}
_visualNavigator.realisticViewWarningListener =
RealisticViewWarningListener((RealisticViewWarning realisticViewWarning) {
double distance = realisticViewWarning.distanceToRealisticViewInMeters;
DistanceType distanceType = realisticViewWarning.distanceType;
if (distanceType == DistanceType.ahead) {
print("A RealisticView ahead in: " + distance.toString() + " meters.");
} else if (distanceType == DistanceType.passed) {
print("A RealisticView just passed.");
}
RealisticView? realisticView = realisticViewWarning.realisticView;
if (realisticView == null) {
print("A RealisticView just passed. No SVG content delivered.");
return;
}
String signpostSvgImageContent = realisticView.signpostSvgImageContent;
String junctionViewSvgImageContent = realisticView.junctionViewSvgImageContent;
print("signpostSvgImage: " + signpostSvgImageContent);
print("junctionViewSvgImage: " + junctionViewSvgImageContent);
});
は realisticView.signpostSvgImageContent
、の上にオーバーレイすることを目的 realisticView.junctionViewSvgImageContent
としています。 両方の画像を同じ縦横比でリクエストできます。 このようにすると、両方の画像のサイズが同じになり、左上の同じ位置にレンダリングできます。
スクリーンショット : 標識の画像でオーバーレイされた交差点表示。 HERE SDK は SVG を文字列としてのみ提供 するので、サードパーティのプラグイン を使用して、 flutter_svg などの SVG 文字列の内容をレンダリングする必要があります。
注
ジャンクションビューのデータは約 2 MB のみを占有するように最適化され、署名後のデータはわずか数 KB しか占有しません。 ただし、利用可能 な機能設定 を使用して、事前にイメージデータをプリロードすることをお勧め します。詳細については、最適化ガイドを参照してください。
16:9の解像度は横向きの形式で使用できますが、縦向きモードでも使用して、全画面表示ができないようにすることができます。 ただし、SVGアセットは非常に詳細なので、セカンダリディスプレイでフルスクリーンで表示することをお勧めします。
注
スピードカメラ、道路標識、現実的なビューなど、道路沿いの単一のオブジェクトについて通知する位置ワーナーの場合、一度に発生するアクティブな警告は常に1つだけです。 これは、各 ahead
イベントの後に常に passed
イベントが続くことを意味し、1つのオブジェクトに対する2つの先行警告が同時にアクティブになることを回避します。
ナビゲーションの例、 GitHub のアプリ を参照して、使用例を確認してください。
注
RealisticView
この機能はベータリリースとしてリリースされているため、いくつかのバグや予期しない動作が発生する可能性があります。 非推奨プロセスなしで新しいリリースでは、関連するAPIが変更される可能性があります。
トラック案内
HERE SDK は、さまざまな機能を備えたプレミアムトラックの取り回しおよびガイダンスをサポートしています。 たとえば、ナビゲーション中に、狭いトンネルなどのトラックの前方の制限について通知を受け取るようにリスナーを添付できます。 他にも、大型トラックや、トラックの重量が道路の許容重量を超える道路を通過するのに十分な高さではない橋が制限されることがあります。
次のコード スニペットを参照してください。
_visualNavigator.truckRestrictionsWarningListener =
TruckRestrictionsWarningListener((List<TruckRestrictionWarning> list) {
for (TruckRestrictionWarning truckRestrictionWarning in list) {
if (truckRestrictionWarning.distanceType == DistanceType.ahead) {
print("TruckRestrictionWarning ahead in: ${truckRestrictionWarning.distanceInMeters} meters.");
} else if (truckRestrictionWarning.distanceType == DistanceType.reached) {
print("A restriction has been reached.");
} else if (truckRestrictionWarning.distanceType == DistanceType.passed) {
print("A restriction just passed.");
}
if (truckRestrictionWarning.weightRestriction != null) {
WeightRestrictionType type = truckRestrictionWarning.weightRestriction!.type;
int value = truckRestrictionWarning.weightRestriction!.valueInKilograms;
print("TruckRestriction for weight (kg): ${type.toString()}: $value");
} else if (truckRestrictionWarning.dimensionRestriction != null) {
DimensionRestrictionType type = truckRestrictionWarning.dimensionRestriction!.type;
int value = truckRestrictionWarning.dimensionRestriction!.valueInCentimeters;
print("TruckRestriction for dimension: ${type.toString()}: $value");
} else {
print("TruckRestriction: General restriction - no trucks allowed.");
}
}
});
は DistanceType.reached
、トラックの制限に達したことを通知します。 passed
制限が渡されると、イベントの後にが続きます。 制限に長さがない場合、 reached
はスキップ reached
され、イベントのみが送信されます。 ahead
イベントは常に最初に送信されます。
すべての制限がない場合 は、一般的なトラックの制限が適用されます。 制限のタイプは、からも参照 TruckRestrictionWarningType
できます。
一部の制限事項は 、道路の一方の方向にのみ有効であることに注意してください。
注
ヌルルート または 新しいルートを設定してガイダンスを停止すると ahead
、通知とともに通知されたすべての制限がただちに passed
解除され、保留中の制限警告がクリアされます。 ルートを追跡中 - ルートにないすべての制限がフィルタリングされますが、ドライバーがルートから十分に離れた( 15 メートルを超える)とただちに、現在の道路で前方にサポートされている制限が適用され、再び制限警告が表示されます。
トラックの制限に関する通知しきい値は、他のバーナーとは若干異なります。
- 都市部
ahead
では、イベントは 1000 m 先ではなく、 500 m 先に送信されます。 - 田舎道では、イベントは 750 m 先に送られます ( 先に 1500 m 進むのではなく ) 。
- 高速道路では、イベントは 1500 m 先に送られます ( 前方は 2000 m ではありません ) 。
TruckRestrictionWarning
このイベントは、道路ネットワーク of the マップ データ Ahead に基づいています。 現在設定されている内容にかかわらず、制限が適用 TransportMode
されます。
注
ルートを計算するとき TruckOptions
に、次を含むを指定でき TruckSpecifications
ます。 これは結果に影響を与える可能 Route
性があります。 ただし 、TruckRestrictionWarning
イベントには影響しません。 マップ データ ahead で検出されたほとんどの制限事項が転送されます。 そのため、現在の車両に関連しない制限警告をアプリケーションがフィルタリングすることは理にかなっている場合があります。 このイベントでは、追跡するルートがない場合にも追跡モードでイベントが配信されます。
トラックルートの詳細については 、「ルーティング 」セクションを参照してください。 たとえば、トラック専用のルートの計算方法を見つけることができます。 一般に、ルートに Truck
輸送タイプが含まれている場合、トラック用に最適化されます。
さらに、いくつかの回避オプションを指定して、たとえば特定の都市部を除外できます。 これはすべて、ルートが計算され Navigator
てまたはに渡される前に指定でき VisualNavigator
ます。
以下の機能についても説明します。
- トラックの寸法などの車両の制限を指定したり、トラックが危険物を運搬している場合に、
TruckSpecifications
およびHazardousGood
リストを含むことができるように指定できます。 TruckOptions
この情報を使用して、トラックルートを形成できます。 トラックの制限事項について通知を受け取るに TruckRestrictionWarning
は、上記のようにイベントを聴いてください。 RoadAttributes
前述のように、特定の音声を聞くことができます。 - 輸送モードが
truck
に設定 されている場合、SpeedLimit
イベントは顧客車両の規制( CVR )制限速度が車両よりも低くなっている可能性があることを示します。 ルートを計算するときは、RouteOptions
内部TruckSpecifications
も指定することを検討してください。 トラッキングモードの場合 は、navigator.trackingTransportProfile(vehicleProfile)
を呼び出して、truck
転送モードでVehicleProfile
を設定します。 デフォルトでは、トラッキングの car
場合、次のことが想定されます。 あなたのトラックに従って重量のような他の車の特性を指定することを確かめなさい。 - 特に
grossWeightInKilograms
と weightInKilograms
は、ルートの制限、到着予定時刻に影響があるだけでなく、CVR の制限速度にも影響があります。 適切に設定しないと TruckSpecifications
、ルートおよび通知が適切でない可能性があります。 - 経由
AvoidanceOptions
で、良識のある都心部の空気を汚染しないように放出帯を除外できます。 この機能を使用 RoadFeatures
すると、特定の類似のトンネルを回避することもできます。 これらは経由で設定でき TruckOptions
、ルート計算から除外されます。 - マップにスピードカメラのアイコンを表示するマップ レイヤースキームを有効にできます。
MapSceneLayers.safetyCameras
。 注 : この層は車にも適しています。 - トラック固有の情報を地図に表示するように最適化されたマップ レイヤー スキームを有効にできます。
MapScene.Layers.vehicleRestrictions
。 たとえば、 影響を受ける道路でアクティブおよび 非アクティブな制限を紫色の線で強調表示するための MapFeatureModes
機能がいくつかあります。灰色の線または灰色のアイコンは、制限が非アクティブであることを示します。 道路がこのような紫の線を横切っており、その道路自体が紫で示されていない場合、この制限は現在の道路には適用されません。 アイコンが正確な場所を示すとは限りません。 たとえば、制限された道路の場合、アイコンが制限された道路の中央に配置されます。または、制限がより長い場合は、 1 つ以上の道路に沿って同じ制限についてアイコンを複数回繰り返すことができます。 アイコン自体は国ごとにローカライズされ、制限のタイプを表します。 ほとんどの制限では、制限の場所と種類も TruckRestrictionWarning
イベントによって示されます ( 上図を参照 ) 。
MapSceneLayers.vehicleRestrictions 位置情報プロバイダを実装します
に Location
インスタンスを提供するには、ロケーションプロバイダが必要 VisualNavigator
です。 任意のソースから位置データをフィードできます。 以下では、デバイスからのネイティブの位置データ と テストドライブのシミュレートされた位置データを切り替えることができる実装を使用する予定です。
すでに説明したように、VisualNavigator
はLocationListener
インターフェイスに準拠しているため、onLocationUpdated()
を呼び出すクラスのリスナーとして使用できます。
位置情報データのソースとして、「 HEREPositioningProvider
位置情報を検索 」セクションに示されているコードに基づいたを使用します。
注
ナビゲーションでは LocationAccuracy.NAVIGATION
、 LocationEngine
ターン・バイ・ターンナビ (矢印ナビ)中に最良の結果が保証されるように、の開始時にを使用することをお勧めします。
イベントを配信するには、次のものを開始する必要があります herePositioningProvider
。
_herePositioningProvider.startLocating(_visualNavigator, LocationAccuracy.navigation);
必要な HERE SDK Location
タイプには、ベアリングおよび速度情報、現在の地理座標、およびによって消費されるその他の情報が含ま VisualNavigator
れます。 提供されたデータの正確性と完全性が高いほど、ナビゲーション全体の操作性がより正確になります。
Location
オブジェクトから取得されたbearing
値によって 移動の方向が決まり 、 その方向に回転するLocationIndicator
アセットによって示されます。 ユーザーが移動していない場合、新しいベアリング値が設定されるまで最後の回転が保持されます。 Location
データのソースに応じて、この値の精度を増減できます。
内部的には timestamp
、のが Location
使用され、ユーザーがトンネルを通過しているか、または信号が単に失われたかなどを評価します。
GitHub で位置情報プロバイダの参照実装を見つけることができます。 navigation_app の例では、 HERE Positioning をナビゲーションに使用する方法を示します。
位置シミュレータを設定します
開発中に、テスト目的でルート上で予想される進行状況を再生すると便利な場合があります。 は LocationSimulator
、元のルート座標から取得された連続的な位置情報を提供します。
以下では、 LocationSimulator
を代替プロバイダとして統合し、実際の位置情報の更新とシミュレートされた位置情報の切り替えを可能にしています。
import 'package:here_sdk/core.dart' as HERE;
import 'package:here_sdk/core.errors.dart';
import 'package:here_sdk/navigation.dart' as HERE;
import 'package:here_sdk/routing.dart' as HERE;
class HEREPositioningSimulator {
HERE.LocationSimulator? _locationSimulator;
void startLocating(HERE.Route route, HERE.LocationListener locationListener) {
_locationSimulator?.stop();
_locationSimulator = _createLocationSimulator(route, locationListener);
_locationSimulator!.start();
}
void stop() {
_locationSimulator?.stop();
}
HERE.LocationSimulator _createLocationSimulator(HERE.Route route, HERE.LocationListener locationListener) {
HERE.LocationSimulatorOptions locationSimulatorOptions = HERE.LocationSimulatorOptions();
locationSimulatorOptions.speedFactor = 2;
locationSimulatorOptions.notificationInterval = Duration(milliseconds: 500);
HERE.LocationSimulator locationSimulator;
try {
locationSimulator = HERE.LocationSimulator.withRoute(route, locationSimulatorOptions);
} on InstantiationException {
throw Exception("Initialization of LocationSimulator failed.");
}
locationSimulator.listener = locationListener;
return locationSimulator;
}
}
また、設定することで LocationSimulatorOptions
、現在のシミュレート位置の移動速度を指定することができます。 デフォルトでは notificationInterval
、は1で、は speedFactor
1.0です。これは、トラフィック関連の制約を考慮せずに、ユーザが通常運転または各ルートセグメントを歩く平均速度に等しくなります。 デフォルトの速度は、道路形状、道路状況、その他の統計データによって異なる場合がありますが、現在の制限速度を超えることはありません。 値が1.0を超えると、速度が比例して増加します。 ルートに指定した時間間隔で十分な座標が含まれていない場合は、によって追加のロケーションイベントが補間 VisualNavigator
されます。
注
LocationSimulator
によって放出される位置は 補間されず、ソースに基づいて提供されます。 の場合 Route
、ルート形状の座標が使用されます(互いに非常に近い)。 の場合 GPXTrack
、座標はGPXデータに基づいて出力されます。 たとえば、2つの座標の間に100メートルのメートルがある場合、それらの2つの座標だけが時間設定に基づいて放出されます。 ただし、に入力すると VisualNavigator
、レンダリングされたマップアニメーションはによって補間 VisualNavigator
されます。
VisualNavigator
連続 Location
する更新間の距離が 100 m を超える場合、はアニメーションをスキップします が speedFactor
増加すると、ロケーションの更新間隔も変化します。通知間隔が適切に調整されていない場合は、次のようになります。 たとえば、速度係数を 8 に変更する場合は、 Location
通知間隔を 125 ms (1000 ms/8) に変更して、更新間の距離を一貫したものにする必要があります。 notificationInterval
および speedFactor
は反比例します。 したがって、 A speedFactor
が 3 の場合、 330 notificationInterval
ms を推奨します。
新しいシミュレーション(または実際の位置情報ソース)を開始する前に、進行中のすべてのシミュレーションを停止する必要があります。
GitHub の navigation_app の例に含まれている上記のコードを確認できます。
音声ガイダンス
運転中は、ユーザーの注意をルートに集中させる必要があります。 提供されている操作データから視覚的な表現を作成できますが ( 上記を参照 ) 、ターンバイターンガイダンス中に話されることを意図したローカライズされたテキスト表現を取得することもできます。 これらの操作の通知 はとして提供されるため String
、任意の TTS ソリューションと一緒に使用できます。
注
操作の通知はドライバーを対象としています。 歩行者誘導には使用しないことをお勧めします。
HERE SDK には、事前に録音された音声スキンは含まれていません。 つまり、再生のために TTS エンジンを統合する必要があります。 オーディオ再生の詳細および例については、以下を参照してください。
通知の例 ( 文字列で提供 ) :
Voice message: After 1 kilometer turn left onto North Blaney Avenue.
Voice message: Now turn left.
Voice message: After 1 kilometer turn right onto Forest Avenue.
Voice message: Now turn right.
Voice message: After 400 meters turn right onto Park Avenue.
Voice message: Now turn right.
これらの通知を取得するには ManeuverNotificationListener
、を設定します。
_visualNavigator.maneuverNotificationListener = ManeuverNotificationListener((String voiceText) {
print('Voice guidance text: $voiceText');
});
HERE テキストを印刷します。 音声テキストをドライバーが聞くことのできる音声メッセージに変換するには、 flutter_ts などの TTS プラグインを使用します。
オプションで 、ナチュラルガイダンスを有効にすることもできます。 ManeuverNotification
テキストは、ルートに沿って重要なオブジェクト(信号機や停止標識など)を含めるように拡張して、操作をより理解しやすくすることができます。 例: "次 の信号で 左折してウォールストリートに入ります。" デフォルトでは、この機能はディセーブルになっています。 有効にするには、 NaturalGuidanceType
trafficLight
ManeuverNotificationOptions
のリストからなどを少なくとも1つ追加 includedNaturalGuidanceTypes
します。
LanguageCode
通知テキストをローカライズするようにを設定し、 UnitSystem
メートル法 または ヤードポンド法 の長さの単位を決定するようにを設定できます。 ルートを設定する前に、必ずこの番号を呼び出してください。そうでない場合、デフォルトの設定は (enUs
,metric
) です。 詳細については ManeuverNotificationOptions
、 API リファレンス を参照してください。
void _setupVoiceTextMessages() {
LanguageCode languageCode = LanguageCode.enGb;
List<LanguageCode> supportedVoiceSkins = VisualNavigator.getAvailableLanguagesForManeuverNotifications();
if (supportedVoiceSkins.contains(languageCode)) {
_visualNavigator.maneuverNotificationOptions = ManeuverNotificationOptions(languageCode, UnitSystem.metric);
} else {
print('Warning: Requested voice skin is not supported.');
}
}
HERE SDK は 37 言語をサポートしています。 VisualNavigator
を使用して、から言語を照会でき VisualNavigator.getAvailableLanguagesForManeuverNotifications()
ます。 HERE SDK 内のすべての言語が LanguageCode
列挙型 (enum) として指定されます。
注
操作の通知を生成するためにサポートされている各言語は 、 HERE SDK フレームワーク内で音声スキンとして保存されます。 フレームワークを展開し 、 VOICE_ASSETS フォルダを探します。 関心のないアセットを手動で削除して、 HERE SDK パッケージのサイズを縮小できます。
ただし、操作の通知を TTS エンジンに送信するには、使用する言語が TTS エンジンでサポートされていることを確認する必要があります。 通常、各デバイスには一部の言語がプリインストールされていますが、最初はすべての言語が表示されているわけではありません。
注
SpatialAudioNavigation サンプルアプリでは、VisualNavigator
を iOSおよびAndroidのネイティブコードと一緒に使用してTTSオーディオメッセージを再生する方法を示します。 この例は GitHubで見つけることができます。 また、オーディオパンニングを使用してステレオパナロマを介して方向を示す方法についても説明します。
音声ガイダンスでサポートされている言語
以下に 、サポートされているすべての音声言語のリストと、 HERE SDK フレームワーク内に保存されている関連する音声スキンの名前を示します。
- アラビア料理(サウジアラビア): voice_package_ar-sa
- チェコ料理 : voice_package_cs-cz
- デンマーク料理 : voice_package_da-dk
- ドイツ語 : voice_package_de-de
- ギリシャ料理 : VOICE_PACKAGE_EL-GR
- 英語 ( イギリス料理 ) : voice_package_en-gb
- 英語(米国 ): voice_package_en-US
- スペイン料理(スペイン): VOICE_PACKAGE_ES-ES
- スペイン料理(メキシコ): VOICE_PACKAGE_ES-MX
- ペルシャ料理(イラン料理): voice_package_fa-ir
- フィンランド料理 : VOICE_PACKAGE_FI
- フランス料理(カナダ): voice_package_fr-CA
- フランス語 : voice_package_fr-FR
- ヘブライ語 : VOICE_PACKAGE_HE-IL
- ヒンディー語 : voice_package_hi-in
- クロアチア料理 : VOICE_PACKAGE_hr-HR
- ハンガリー料理 : VOICE_PACKAGE_HU-HU
- インドネシア料理 : ( Bahasa ) voice_package_id - ID
- イタリア料理 : voice_package_it-it
- 日本語: voice_package_ja-JP
- 韓国料理 : voice_package_ko-KR
- ノルウェー料理 : (Bokmå l) voice_package_nb -no
- オランダ料理 : voice_package_nl-nl-nl
- ポルトガル料理(ポルトガル) VOICE_PACKAGE_pt
- ポルトガル料理(ブラジル): VOICE_PACKAGE_pt -BR
- ポーランド料理 : voice_package_pt -pt
- ルーマニア料理 : voice_package_ro-R
- ロシア料理 : voice_package_ru-ru
- スロバキア料理 : voice_package_sk-sk
- セルビア料理 : voice_package_sr-CS
- スウェーデン料理 : voice_package_sv -se
- タイ料理 : voice_package_th-th
- トルコ料理 : VOICE_PACKAGE_tr - TR
- ウクライナ料理 : VOICE_PACKAGE_UK-UA
- ベトナム料理 : voice_package_vi -vn
- 中国語 ( 簡体字 ) : voice_package_zh-CN
- 中国語 ( 繁体字香港 ): voice_package_zh-HK
- 中華料理(台湾料理): voice_package_zh-TW
HERE SDK フレームワークを開き voice_assets
、フォルダーを検索します。 フレームワークのサイズを縮小する場合は、不要な音声パッケージを削除できます。
空間音声操作の通知
ManeuverNotificationListener
で提供されているものvoiceText
と同様に、空間オーディオ情報を使用して拡張することもできます ( 上記を参照 ) 。
空間的な音声操作の通知を使用すると、音声読み上げ文字列のステレオパノラマをリアルタイムで調整できます。 これは、車両に座っているドライバーに対する操作位置に基づいています。
このため には、ManeuverNotificationListener
の代わりに(または並行して)SpatialManeuverNotificationListener
を使用します。 空間的な操作が可能になると通知をトリガーします。 さらに、 SpatialManeuverAzimuthListener
を追加して、 HERE SDK によって定義された空間音声軌跡の 1 つを構成する方位角エレメントをトリガーします。 結果 SpatialTrajectoryData
には、使用する次の方位角が含まれ、空間的な音声の軌跡が終了したかどうかが示されます。
パンニングを開始し、 SpatialManeuver
のestimatedAudioCueDuration
を更新するためにCustomPanningData
を渡し、 およびinitialAzimuthInDegrees
プロパティと sweepAzimuthInDegrees
プロパティをカスタマイズするためにSpatialManeuverAudioCuePanning
を使用します。
ナビゲーションを停止します
が route
設定 されLocationPrivider
、が開始されるとターン・バイ・ターンナビ (矢印ナビ)が自動的に開始されますが、ナビゲーションの停止は可能なシナリオによって異なります。
ナビゲーションを停止し て追跡モードに切り替え ( 以下を参照 ) 、パスを追跡したままマップと一致する位置を受信するか、 または追跡モードに戻らずにナビゲーションを停止します。 最初のケースでは、現在 route
のをに設定するだけ null
で済みます。 これにより、ターン・バイ・ターンナビ (矢印ナビ)関連のすべてのイベントの伝播のみが停止されますが、マップマッチした場所アップデートおよび速度警告情報などを受信できるように、イベントは存続します。 ターン・バイ・ターンナビ (矢印ナビ)イベントの伝播は、目的の宛先に到達すると自動的に停止されます。 を route
再度設定すると、ターン・バイ・ターンナビ (矢印ナビ)関連のすべてのイベントが再度伝播されます。
トラッキングモードに戻らずにナビゲーションを停止 する場合( たとえば、マップに一致しない位置の更新のみをロケーションプロバイダから直接取得する場合) は、VisualNavigator
からすべてのイベントを取得しないことをお勧めします。 このためには、すべてのリスナーを個別にににに設定する必要 null
があります。
アプリで位置情報の更新を利用するために、位置情報プロバイダの実装を再利用できます。 HERE Positioning では、複数 LocationListener
のインスタンスを設定できます。
VisualNavigator
を使用する場合は、stopRendering()
を呼び出します。 MapView
が呼び出されると、VisualNavigator
によって制御されなくなります。
- 地図の向き、カメラの距離、傾きなどの設定は、レンダリング中に変更された可能性がありますが、更新されなくなりました。 コール前の最後の状態が保持
stopRendering()
されます。 たとえば、ガイダンス中に地図が傾いていた場合、地図は傾斜したままになります。 このため stopRendering()
、を呼び出した後で、目的のカメラ設定を適用することをお勧めします。 - 新しい場所をに送り続けても、地図は現在の場所に移動されなくなり
VisualNavigator
ます。 - によって所有されている既定またはカスタムの位置情報インジケータ
VisualNavigator
が再度非表示になります。 RouteProgress
null のリスナーを設定してサブスクライブ解除しない限り、などのすべてのロケーションベースのイベントが配信されます ( 上記を参照 ) 。
注
は VisualNavigator
MapView
インスタンスに対して動作するため、 stopRendering()
を破棄する前にを呼び出すことをお勧め MapView
します。 さらに、停止 LocationSimulator
することをお勧めします DynamicRoutingEngine
。 ただし、が MapView
一時停止している場合は、も停止する必要は VisualNavigator
ありません。 VisualNavigator
が MapView
一時停止すると、は自動的にレンダリングを停止し、 MapView
が再開されるとレンダリングを開始します(が VisualNavigator
以前にレンダリングされていたとき)。
追跡
VisualNavigator
このクラスを使用してターン・バイ・ターンナビ (矢印ナビ) を開始および停止できますが、追跡モードに切り替えて、追跡するルートを必要としないようにすることもできます。 このモードは 、しばしば運転者アシスタンスモードとも呼ばれます。 公共交通機関を除く、すべての交通手段で利用できます。 公共交通機関を利用すると、追跡に安全でない予期しない結果が生じる可能性があります。 他のすべての輸送モードがサポートされていますが、追跡は車およびトラックの輸送モードに最も適しています。
トラッキングを有効にするには、次の番号に電話をかけるだけでよいです。
_visualNavigator.route = null;
もちろん、route
インスタンスを設定せずにVisualNavigator
を初期化できます。トラッキングモードのみに関心がある場合は、ルートを明示的にヌルに設定する必要はありません。
注
追跡モードでは、 NavigableLocationListener
ルート SpeedWarningListener
を追跡することなく起動できる、またはなどのリスナーのイベントのみを取得できます。 RouteProgressListener
ルートが設定されていない場合、などの他のリスナーはイベントを配信しません。
これにより、リスナーをアクティブな状態に保ち、無料のトラッキングとターンバイターンのナビゲーションをその場で切り替えることができます。
トラッキングモードで動作するリスナーを確認するには、 API リファレンス で概要を確認してください。
ドライバーが道順をすでに知っているが、現在の道路名や旅程中の制限速度などの追加情報を取得したい場合は、追跡が便利です。
旅程を準備します
HERE SDK は、マップ データ のルートプリフェッチをサポートしています。 これにより、ターン・バイ・ターンナビ (矢印ナビ) 中などのユーザー体験を改善して、一時的なネットワークの損失を適切に処理できます。
旅程が発生した地域にオフラインの地図がすでにダウンロードされている場合は、この操作は不要です。 この場合、すべてのマップ データ がすでに存在し、ネットワーク接続は必要ありません。 たとえば、専用の OfflineRoutingEngine
とは異なり Navigator
、または VisualNavigator
は、キャッシュされたデータまたはオフライン マップ データにフォールバックする必要があるタイミングを自動的に決定します。 一般に、ナビゲーションにはマップ データ が必要です。マップ ビュー を表示せずにヘッドレスで実行された場合でも同様です。 この理由は、マップマッチングのためのナビゲーション中にマップ データ にアクセスし、たとえば制限速度などの特定の道路属性について通知する必要があるためです。 このデータは、デバイスで利用可能なデータから取得されます。または、利用できない場合は、ナビゲーション中にダウンロードする必要があります。 そのため、今後の道路を見越してより多くのデータをプリフェッチすることが有益です。 プリフェッチを使用しない場合、一時的な接続の損失はあまり適切に処理されません。
注
これはこの機能のベータリリースであるため、バグがいくつか発生したり、予期しない動作が発生する可能性があります。 関連する API は、非推奨プロセスなしで新しいリリースで変更されることがあります。
RoutePrefetcher
コンストラクタには SDKNativeEngine
、パラメータとしてインスタンスのみが必要です。 SDKNativeEngine.sharedInstance
HERE SDK の初期化後、経由で取得できます。
で RoutePrefetcher
は、マップ データ を事前にダウンロードできます。 マップ データ が マップキャッシュにロードされます。 マップキャッシュには独自のサイズ制約があり、すでにデータが含まれている可能性があります。 RoutePrefetcher
は、新しいマップ データ を保存するために、古いキャッシュデータを削除する必要がある場合があります。
-
旅程を開始する前に、 1 回電話routePrefetcher.prefetchAroundLocation(currentGeoCoordinates)
をかけることをお勧めします。 このコールは、半径が 2 km の指定された場所をマップ データ が事前にマップキャッシュにプリフェッチし、ユーザーがルートの追跡を開始したときに十分なマップ データ が存在することを保証します。ただし、ルートがユーザーの現在の場所から開始されていることが前提です。
-
ナビゲーションが開始したら、次の電話番号を 1 回かけてください routePrefetcher.prefetchAroundRouteOnIntervals(navigator)
。 現在指定 Navigator
されているインスタンスに設定されているルートに沿って、経路内のマップ データ をプリフェッチします。 ルートが設定されていない場合、データはプリフェッチされません。 ルートコリドーのデフォルトの長さは 10 km 、幅は 5 km です マップ データ は、不連続の間隔でのみプリフェッチされます。 現在の経路の終点に達する 1 km 前にプリフェッチが開始されます。 プリフェッチは、 RouteProgress
イベントによって示される現在のマップマッチした場所 に基づいて行われます。 最初のプリフェッチは、ルート沿いに 9 km の距離を走行した後に開始されます。 新しいルートがに設定されて navigator
いる場合、このメソッドを再度呼び出す必要はありませんが、このメソッドが 2 回以上呼び出されても、悪影響はありません。
navigation_app に、の使用例 RoutePrefetcher
を示します。
RoutePrefetcher
ルートの開始時にが正常に使用され、その後接続が失われた場合、キャッシュされたデータは、マップキャッシュが削除されるまで、今後の電源サイクルであっても保持されます。 マップキャッシュの削除ポリシーの詳細について は、 HERE を参照してください。
- ナビゲーション を開始する前に、両方のメソッドを同時に呼び出すこともできます。 ただし、トレードオフのために、トリップ開始直後に必要なすべてのデータをプリフェッチするのに十分な時間がない場合があります。
prefetchAroundRouteOnIntervals()
ガイダンス中にネットワークトラフィックが継続的に増加することに注意してください。
もちろん、プリフェッチされたデータがない場合でもガイダンスを利用できますが、エクスペリエンスの最適化はあまり行われない場合があります。
どちらの呼び出しも、キャッシュされたマップ データ を利用する一時的なオフラインの使用例を最適化するのに役立ちます。 は prefetchAroundLocation()
ナビゲーションユースケース の外部でも使用できますが prefetchAroundRouteOnIntervals()
、には進行中のナビゲーションシナリオが必要です。