New Route
この章では新しくルートを探索するための方法を紹介します。
ルート探索のおおまかな処理の流れ
新しいルートを探索する処理の流れは以下の通りです。
RoutePlan
のインスタンスを生成します。- 目的地を設定します。
- 探索して欲しいルートの条件の数だけ
RouteOptions
インスタンスを生成し、RoutePlan
オブジェクトに設定します。
- 設定済みの
RoutePlan
オブジェクトを引数に、Navi.calculateRoute()
を呼び出します。 - 探索が完了すると、Listenerにて処理結果が通知されます。これで探索完了です。
- 探索したルートで案内を開始したい場合、
Navi.startGuidance()
を呼び出します。
SDKデフォルトのルートを探索をする
RoutePlan
とRouteOptions
は初期値を持っており、set関数にて設定されない限りは初期値が用いられます。
最低限設定が必要な項目は、
RoutePlan
の目的地 (setEndPoint
)RouteOptions
のRouteID (setRouteID
)
の2つです。
以下に例を示します。
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場
RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
ルート探索完了しても探索結果が得られるだけで案内は開始されません。
Navi.startGuidance()
を呼び出すことで案内を開始できます。
上記のサンプルコードは下記のサンプルコードと等価です。
RoutePlan routePlan = new RoutePlan();
routePlan.setStartPointCurrent();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761));
routePlan.setPersonalize(false);
routePlan.setVehicleInfo(null);
routePlan.setEnergyInfo(null);
routePlan.setWayPoints(null);
routePlan.setRouteWayPoints(null);
routePlan.setDesignationTimeUsage(RoutePlan.DesignationTimeUsage.None);
RouteOptions options = new RouteOptions();
options.setRouteID(1);
options.setAddAlternative(false);
options.setPriorityRank(1);
options.setSearchCriteria(RouteOptions.SearchCriteria.RECOMMENDED);
options.setUseToll(true);
options.setUseHighway(true);
options.setUseFerry(true);
options.setUseSmartIC(true);
options.setUseLearnData(true);
options.setCareJam(true);
options.setCareRegulation(true);
options.setCareTimeRegulation(true);
options.setCareUnpavedRoad(false);
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
ルート探索が成功すると、自動的に地図にルート線が反映されます。
ルートを削除する場合、 Navi.eraseRoute()
を呼び出してください。
Navi.getInstance().eraseRoute(null);
ルートの特徴を変更する
RouteOptions.SearchCriteria
を設定することで、探索するルートの特徴を変更できます。
RouteOptions.SearchCriteria | 特徴 | 使用上の注意 |
---|---|---|
RECOMMENDED | 主に時間を考慮した標準的なルート。 | |
TIME | 時間を最優先で考慮し、早く目的地に到着することができるルート。 | |
DISTANCE | 主に距離を考慮して、なるべく距離が短くなるルート。 | |
MAIN_ROAD | 主に道幅と時間を考慮し、広い道(高速道、国道など)を優先的に使用するルート。 | |
TOLL | 時間と有料道料金のバランス(コストパフォーマンス)を考慮したルート。 | |
ECO | 主に推定消費燃料(推定消費電力)を考慮し、なるべく推定消費燃料(推定消費電力)の少ないルート。 | 立ち寄り地点は最大5つまでに制限されます。 燃料/電力情報が未設定の場合、「推奨」の探索基準での探索となります。 |
COST1 | 時間と有料道料金と推定燃費(推定電費)から算出するガソリン代(電気代)のバランス(コストパフォーマンス)を考慮したルート。 | 立ち寄り地点は最大5つまでに制限されます。 燃料/電力情報が未設定の場合、「推奨」の探索基準での探索となります。 |
COST2 | コスト1と同様に、コスト1に比べて時間のコストを下げてコストパフォーマンスを考慮したルート。 | 立ち寄り地点は最大5つまでに制限されます。 燃料/電力情報が未設定の場合、「推奨」の探索基準での探索となります。 |
パイオニア川越工場を目的地に、距離を優先したルート探索を行うサンプルコードは以下の通りです。
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場
RouteOptions options = new RouteOptions();
options.setRouteID(1);
options.setSearchCriteria(RouteOptions.SearchCriteria.DISTANCE);
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
パイオニア川越工場を目的地に、時間を優先したルート探索を行うサンプルコードは以下の通りです。
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場
RouteOptions options = new RouteOptions();
options.setRouteID(1);
options.setSearchCriteria(RouteOptions.SearchCriteria.TIME);
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
Fig.2 - 距離優先
Fig.3 - 時間優先
渋滞や規制を考慮するルートを探索する
RouteOptions
のsetCareJam()
、setCareRegulation()
、setCareTimeRegulation()
を設定することで
trueなら考慮、falseなら未考慮のルートを探索できます。
渋滞情報考慮は渋滞情報契約未定結の場合、プローブ情報のみを考慮した結果となります。
車両に合ったルートを探索する
車両情報を設定することで車両情報を考慮したルート探索を行うことが可能です。
車種、車高、車重、車幅、危険物積載有無をVehicleInfo
で設定します。
例えば車高を200cmに設定した場合、180cmの車高制限がある道を避けてルート探索を行います。
サンプルコードは以下の通りです。
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場
RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);
VehicleInfo vehicleInfo = new VehicleInfo();
vehicleInfo.setVehicleType(VehicleInfo.VehicleType.ORDINARY_AND_MEDIUM_PASSENGER);
vehicleInfo.setVehicleHeight(200);
vehicleInfo.setVehicleWidth(175);
vehicleInfo.setVehicleWeight(1645);
vehicleInfo.setDangerousLoaded(false);
routePlan.setVehicleInfo(vehicleInfo);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
燃料/電力情報設定
エコ・コスト優先の探索を実施する場合および推定燃費/電費を算出する場合はEnergyInfo
で燃料/電力情報の指定が必要です。
指定必須な燃料/電力情報は燃料種別や指定する情報によって異なり、以下の通りになります。
条件 | 燃料種別 | 必須情報 |
---|---|---|
型式から設定する場合 | 全種 | 燃料種別,型式 |
型式指定番号から設定する場合 | 全種 | 燃料種別,型式指定番号 |
型式または型式指定番号から設定しない場合 | ガソリン(貨物車除く) | 燃料種別, 車幅, 車高, 車重, 排気量, アイドリングストップのON/OFF |
型式または型式指定番号から設定しない場合 | ガソリン(貨物車の場合) | 燃料種別, 車幅, 車高, 車重, 現在の積載容量, ドライバーを含めた乗員人数 |
型式または型式指定番号から設定しない場合 | ガソリン・電気 | 燃料種別, 車幅, 車高, 車重, 排気量 |
型式または型式指定番号から設定しない場合 | 電気 | 燃料種別, 車幅, 車高, 車重 |
以下がトヨタカローラのガソリン車で燃料情報を設定し燃費を取得するまでの例です。
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場
RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);
EnergyInfo energyInfo = new EnergyInfo();
energyInfo.setModel("6AA-ZWE219-AEXSB");
energyInfo.setEnergyType(EnergyInfo.EnergyType.GASOLINE);
energyInfo.setHeight(144);
energyInfo.setWidth(175);
energyInfo.setWeight(1645);
energyInfo.setDisplacement(1.797F);
energyInfo.setIdlingStop(false);
routePlan.setEnergyInfo(energyInfo);
Navi.getInstance().calculateRoute(routePlan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (CalcRouteListener.ErrorCode.NONE == errorCode) {
// 推定燃費/電力の取得
if (calcRouteResult.getRouteResults().get(0).getEstimatedEnergyInfo() != null) {
float energyConsumption = calcRouteResult.getRouteResults().get(0).getEstimatedEnergyInfo().getEnergyConsumption();
}
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
}
else {
// ルート探索失敗
}
}
});
高度な目的地設定
駐車場を指定してルートを探索する
大型商業施設など、駐車場入り口座標と施設の中心座標が大きく離れている場合、 施設中心座標を目的地に指定すると駐車場入り口ではない道路を通過するルートになることがあります。
このような低品質なルートになるのを避けるため、駐車場の入り口座標を指定したルート探索が可能です。
例えば、東京スカイツリーを目的地に設定し、駐車場を近隣の民間駐車場に指定したルートを探索するサンプルは以下の通りです。
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.7100409, 139.810719));
plan.getRouteEndPoint().setParkingEntranceList(new ArrayList<ParkingEntrance>() {{
// Dパーキング 東京スカイツリー前第1
add(new ParkingEntrance(new ParkingEntrance.Toll(false), new GeoCoordinate(35.709085753910045, 139.80820773937228)));
}});
RouteOptions options = new RouteOptions();
options.setRouteID(1); // 複数ルート同時に探索する際のルートごとの識別子です。任意の値を設定可能です。
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
Fig.4 - 駐車場指定あり
Fig.5 - 駐車場指定なし
目的地やルートのメタデータを設定する
目的地の検索結果などは検索直後に参照するのは容易ですが、アプリケーション再起動後に参照するには工夫が必要です。
そのための関数としてRouteEndPoint.setInfo()
が用意されています。
この関数で設定された文字列はサーバーに保存され、RouteResult.RouteProfileInfo.getInfo()
で参照できます。
例えば目的地名, 目的地名のカタカナ読みの2つの情報を保存するサンプルコードは以下の通りです。
RouteEndPoint routeEndPoint = routePlan.getRouteEndPoint();
routeEndPoint.setInfo(
new HashMap<String, String>() {{
put("destination name", "ファミリーマート 本駒込六丁目店");
put("destination yomi", "ファミリーマート ホンコマゴメ ロクチョーメ テン");
}}
);
立ち寄り地を追加する
目的地以外の地点を経由するルートを引きたい場合は RoutePlan
に経由したい地点を追加します。
緯度経度のみを指定して立ち寄り地を追加する
パイオニア川越工場を目的地に、東京スカイツリーを立ち寄り地に設定したルート探索を行うサンプルコードは以下の通りです。
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761)); // パイオニア川越工場
List<GeoCoordinate> waypoints = new ArrayList<>();
waypoints.add(new GeoCoordinate(35.7100409, 139.810719)); // 東京スカイツリー
routePlan.setWayPoints(waypoints);
RouteOptions options = new RouteOptions();
options.setRouteID(1);
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(options);
routePlan.setMultiRouteOptions(optionList);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
立ち寄り地の駐車場入口座標を指定する
目的地に追加するのと同様に設定可能です。
List<RouteWayPoint> routeWayPoints = routePlan.getRouteWayPoints();
routeWayPoints.get(0).setAlongside(true);
routeWayPoints.get(0).setParkingEntranceList(new ArrayList<ParkingEntrance>() {{
// Dパーキング 東京スカイツリー前第1
add(new ParkingEntrance(new ParkingEntrance.Toll(false), new GeoCoordinate(35.709085753910045, 139.80820773937228)));
}});
Fig.7 - 駐車場指定あり
Fig.8 - 駐車場指定なし
条件が異なるルートを同時に探索する
最短距離のルートと時間優先のルート、幹線優先のルート、推奨ルートの4本を同時に探索する
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(goal);
List<RouteOptions.SearchCriteria> criteriaList = new ArrayList<RouteOptions.SearchCriteria>() {{
add(RouteOptions.SearchCriteria.DISTANCE);
add(RouteOptions.SearchCriteria.TIME);
add(RouteOptions.SearchCriteria.MAIN_ROAD);
add(RouteOptions.SearchCriteria.RECOMMENDED);
}};
List<RouteOptions> optionList = new ArrayList<>();
int routeId = 1;
for (RouteOptions.SearchCriteria criteria : criteriaList) {
RouteOptions options = new RouteOptions();
options.setSearchCriteria(criteria);
options.setRouteID(routeId);
routeId++;
optionList.add(options);
}
routePlan.setMultiRouteOptions(optionList);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().selectCalculateRoute(getSelectedRouteResult()); // 複数ルート探索した時はどのルートで案内開始したいのか指定してください
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
探索基準ごとに異なるルートになるとは限りません。 例えば、TIME
とRECOMMENDED
のルートが同じになることもあります。
有料道路を回避するルートと、有料道路を使うルートを探索する
ある目的地goal
に対して、有料道路を経由しないルートと有料道路を経由する可能性があるルートを同時に探索するサンプルコードは以下の通りです。
RoutePlan routePlan = new RoutePlan();
routePlan.setEndPoint(goal);
RouteOptions noToll = new RouteOptions();
noToll.setRouteID(1);
noToll.setUseToll(false);
RouteOptions useToll = new RouteOptions();
useToll.setRouteID(2);
useToll.setUseToll(true); // 明示的に設定しなくても初期値はtrueです
List<RouteOptions> optionList = new ArrayList<>();
optionList.add(noToll);
optionList.add(useToll);
routePlan.setMultiRouteOptions(optionList);
Navi.getInstance().calculateRoute(plan, new CalcRouteListener() {
@Override
public void onCompleted(ErrorCode errorCode, CalcRouteResult calcRouteResult) {
if (errorCode == CalcRouteListener.ErrorCode.NONE) {
Navi.getInstance().selectCalculateRoute(getSelectedRouteResult()); // 複数ルート探索した時はどのルートで案内開始したいのか指定してください
Navi.getInstance().startGuidance(new StartGuidanceListener() {
@Override
public void onCompleted(ErrorCode errorCodeOfStartGuidance, GuidePointResult guidePointResult) {
if (errorCodeOfStartGuidance == StartGuidanceListener.ErrorCode.NONE) {
}
}
});
} else {
// ルート探索失敗
}
}
});
setUseToll(true)
に設定していても、有料道路を使わないルートになることがあります。