New Route

この章では新しくルートを探索するための方法を紹介します。

ルート探索のおおまかな処理の流れ

新しいルートを探索する処理の流れは以下の通りです。

  1. RoutePlan のインスタンスを生成します。
    • 目的地を設定します。
    • 探索して欲しいルートの条件の数だけRouteOptionsインスタンスを生成し、RoutePlanオブジェクトに設定します。
  2. 設定済みのRoutePlanオブジェクトを引数に、Navi.calculateRoute()を呼び出します。
  3. 探索が完了すると、Listenerにて処理結果が通知されます。これで探索完了です。
  4. 探索したルートで案内を開始したい場合、Navi.startGuidance()を呼び出します。

SDKデフォルトのルートを探索する

RoutePlanRouteOptionsは初期値を持っており、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 {
			// ルート探索失敗
		}
	}
});

Note:

ルート探索完了しても探索結果が得られるだけで案内は開始されません。 Navi.startGuidance()を呼び出すことで案内を開始できます。

上記のサンプルコードは下記のサンプルコードと等価です。

RoutePlan routePlan = new RoutePlan();
routePlan.setStartPointCurrent();
routePlan.setEndPoint(new GeoCoordinate(35.932524, 139.471761));
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.setSearchCriteria(RouteOptions.SearchCriteria.RECOMMENDED);
options.setUseToll(true);
options.setUseFerry(true);
options.setUseSmartIC(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 {
			// ルート探索失敗
		}
	}
});

ルート探索が成功すると、自動的に地図にルート線が反映されます。

ルート探索結果

Fig.1 - 探索結果

ルートを削除する場合、 Navi.eraseRoute()を呼び出してください。

Navi.getInstance().eraseRoute(null);

ルート探索結果を確認する

ルート探索結果はRouteResultに格納されます。

代表的なデータは以下のものがあります。

  • RouteResult.getLength() : 総走行距離[m]

  • RouteResult.getRequireTime() : 所要時間[sec]

  • RouteResult.getToll() : 料金[円]

  • RouteResult.getEntranceICName() : 高速道路入口の施設名称

  • RouteResult.getExitICName() : 高速道路出口の施設名称

  • RouteResult.getRouteProfileInfoList() : ルートプロフィール情報
    ルート中の特徴的な地点のリストです。
    通行する道路名や通過する高速道路インターチェンジ名、サービスエリア名、サービスエリア内施設情報などを確認できます。
    例えば、食事処を提供するサービスエリアとパーキングエリアの一覧を抽出するサンプルコードは以下の通りです。

    if (!calcRouteResult.getRouteResults().isEmpty()) {
        List routeProfileInfos = calcRouteResult.getRouteResults().get(0).getRouteProfileInfoList();
        List sapaWithRestaurant = routeProfileInfos.stream().filter( prof -> {
                if (prof.getFacilityName().isEmpty()) return false;
                if (prof.getKind() != RouteResult.RouteProfileInfo.Kind.FACILITY) return false;
                return prof.getFacilityServiceList().stream().anyMatch(facility -> facility.getKind() == HighwayInfo.FacilityInfo.Service.Kind.RESTAURANT);
            })
            .map(RouteResult.RouteProfileInfo::getFacilityName)
            .collect(Collectors.toList());
        for (String name : sapaWithRestaurant) {
            Log.println(Log.INFO, "app", name);
        }
    }
    
  • RouteResult.getUnavoidableInfo() : 回避不能な道路規制
    RouteOptionsで指定した条件通りのルートを探索できなかった場合にtrueになります。
    例えば自車位置が有料道路上に存在する場合にRouteOptions.setUseToll(false)で探索しても、必ず有料道路を使ってしまうのでUnavoidableInfo.isToll()trueになります。

    • RouteResult.UnavoidableInfo.isToll() : 有料道路を回避するルートを探索できなかった
    • RouteResult.UnavoidableInfo.isFerry() : フェリー航路を回避するルートを探索できなかった
    • RouteResult.UnavoidableInfo.isTrafficRegulation() : 通行止めを回避するルートを探索できなかった

    これらのフラグがtrueの場合はユーザーに探索条件通りのルートが見つけられなかった旨を通知するなどの対策を行ってください。

ルートの特徴を変更する

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 - 時間優先

渋滞や規制を考慮するルートを探索する

RouteOptionssetCareJam()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_PASSENGER); // 普通乗用車
vehicleInfo.setVehicleHeight(200);
vehicleInfo.setVehicleWidth(175);
vehicleInfo.setVehicleWeight(1645);
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));

routePlan.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(routePlan, 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()で参照できます。

例えば目的地の住所・電話番号の情報を保存するサンプルコードは以下の通りです。

RouteEndPoint routeEndPoint = routePlan.getRouteEndPoint();
routeEndPoint.setInfo(
	new HashMap<String, String>() {{
		put("address":"東京都文京区本駒込2-28-8");
		put("tel":"03-6634-8777");
	}}
);

立ち寄り地を追加する

目的地以外の地点を経由するルートを引きたい場合は RoutePlan に経由したい地点を追加します。
立ち寄り地は最大200地点まで指定可能です。

緯度経度のみを指定して立ち寄り地を追加する

パイオニア川越工場を目的地に、東京スカイツリーを立ち寄り地に設定したルート探索を行うサンプルコードは以下の通りです。

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 {
			// ルート探索失敗
		}
	}
});

立ち寄り地追加

Fig.6 - 立ち寄り地追加

立ち寄り地の駐車場入口座標を指定する

目的地に追加するのと同様に設定可能です。

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 {
			// ルート探索失敗
		}
	}
});
注意:

探索基準ごとに異なるルートになるとは限りません。 例えば、TIMERECOMMENDEDのルートが同じになることもあります。

複数ルート同時探索

Fig.9 - 複数ルート同時探索

有料道路を回避するルートと、有料道路を使うルートを探索する

ある目的地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)に設定していても、有料道路を使わないルートになることがあります。

有料道路使用有無

Fig.10 - 有料道路使用有無

目的地/立ち寄り地が有料道路上か一般道路上かを選択してルート探索する

目的地を緯度経度で指定した場合、その場所から一番近い道路に対してルート探索が行われるため、目的地は一般道路からアクセスすべき場所だが高速道路上にゴールが設定されるなど意図しないルートになることがあります。

そのための関数としてRouteEndPoint.setTollRoadKind() が用意されています。
getNearLink() を使い目的地付近に存在する道路の種別を取得し、目的地の道路種別を指定してルート探索を行うことが可能です。

サンプルコードは以下の通りです。

private void createRouteEndPoint(GeoCoordinate point, RouteEndPointListener listener) {

    // 付近の道路情報取得
    Navi.getInstance().getNearLink(point, null, new GetNearLinkListener() {
        @Override
        public void onCompleted(ErrorCode errorCode, NearLink nearLink) {
            RouteEndPoint routeEndPoint = new RouteEndPoint();
            routeEndPoint.setPoint(point);

            //  有料道路と無料道路の両方がある場合、ユーザーに選択させる
            if (errorCode == ErrorCode.NONE &&
                nearLink.hasToll() && nearLink.hasFree()) {

                new AlertDialog.Builder(NewRoute.this)
                        .setTitle("どちらの道路を選択しますか?")
                        .setPositiveButton("有料道路", (dialogInterface, i) -> {
                            routeEndPoint.setTollRoadKind(Common.TollRoadKind.TOLL);
                            listener.onComplete(routeEndPoint);
                        })
                        .setNegativeButton("無料道路", (dialog, which) -> {
                            routeEndPoint.setTollRoadKind(Common.TollRoadKind.FREE);
                            listener.onComplete(routeEndPoint);
                        })
                        .setOnCancelListener(dialog -> {
                            listener.onComplete(routeEndPoint);
                        })
                        .show();
            }
            else {
                listener.onComplete(routeEndPoint);
            }
        }
    });
}

立ち寄り地の場合も同様に指定することができます。

RouteWayPoint wayPoints = new RouteWayPoint();
wayPoints.setTollRoadKind(Common.TollRoadKind.TOLL);
routePlan.addWayPoint(wayPoints);

推定通過速度表示

推定通過速度表示フラグをtrueで指定することで、推定通過速度表示を伴うルート探索を行うことが可能です。

サンプルコードは以下の通りです。

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);

// 推定通過速度表示を行う場合は、trueを指定する
boolean useSpeedCategory = true

Navi.getInstance().calculateRoute(plan, useSpeedCategory, 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.11 - 推定通過速度表示