Free Word Search

この章では目的地を設定するためにフリーワードにより施設を検索(フリーワード検索)するための方法を紹介します。

おおまかな処理の流れ

フリーワード検索の処理の流れは以下の通りです。

  1. SearchJP.FreewordSearchRequestのインスタンスを生成します。
    • 検索したいワードを設定します。
    • 検索したい場所の緯度経度、半径(指定しない場合は全国が対象)を設定します。
  2. 設定済みのSearchJP.FreewordSearchRequestオブジェクトを引数に、SearchJP.search()を呼び出します。
  3. 検索が完了すると、Listenerにて検索結果が通知されます。これで検索完了です。
SearchJP.FreewordSearchRequest request = new SearchJP.FreewordSearchRequest();

request.setKeyword("都庁");

GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);
request.setPosition(position);

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		// searchResultに検索結果が格納されています
	}
});
検索ワード例期待できる検索結果
パイオニアパイオニアに関連のある施設を検索します。
03-6634-8777該当の電話番号を持つ施設を検索します。ハイフン記号がない10桁の数字も電話番号とみなします。

高度な検索

ソート順を指定する

SearchJP.FreewordSearchRequest.SortType で検索結果のソート順を指定することができます。 指定可能なソート順は以下の通りです。

  • RECOMMENDED(おすすめ順)
  • DISTANCE(距離順)
注意:

DISTANCE(距離順)を指定する場合、setRadius() による検索半径指定が必要です。

複数ワード検索

フリーワード検索では、半角スペース区切りでAND検索を行うことができます。

検索ワード例期待できる検索結果
ラーメン 塩ラーメンと塩に関連する施設(塩ラーメンの店舗)を検索します。
カレー インドカレーとインドに関連する施設(インドカレーの店舗)を検索します。
注意:

電話番号で検索する際は、別のキーワードをANDで含めることはできません。
例えば 03-6634-8777 企業 と検索しても検索失敗となってしまいます。

ジャンルキー、エリアキーとの組み合わせ

ジャンルキー

SearchJP.FreewordSearchRequest にジャンルキー(整数値)を設定すると、キーワード × ジャンル のAND検索になります。

エリアキー

SearchJP.FreewordSearchRequest にエリアキー(住所コード)を設定すると、キーワード/ジャンル × エリア のAND検索になります。

注意:ジャンルキー・エリアキーは都度取得してください

ジャンルキーおよびエリアキーは、データ整備の更新やシステム改修によって値が変更される可能性があります。
そのため、アプリ内に固定値としてハードコードせず、下記の方法で取得する設計にしてください。
なお、検索実行ごとに取得するのではなく、アプリ起動時や検索画面表示時などに先行して取得し、一定期間キャッシュする運用が推奨されます。

ジャンルキーとエリアキーを指定したAND検索は以下のようにします。

SearchJP.FreewordSearchRequest request = new SearchJP.FreewordSearchRequest();

request.setKeyword("日産");

// カーディーラーのジャンルキー(※例として209を指定。実際はSearchJP.getGenreList()で取得してください)
List<Integer> genreKeyList = new ArrayList<>();
genreKeyList.add(209);
request.setGenreKeyList(genreKeyList);

// 神奈川県のエリアキー(※例として"14"を指定。実際はSearchJP.search(GetLocationListByAddressRequest, AddressListener)で取得してください)
List<String> areakeyList = new ArrayList<>();
areakeyList.add("14");
request.setAreaKeyList(areakeyList);

GeoCoordinate position = new GeoCoordinate(35.689595, 139.692221);
request.setPosition(position);

SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		// searchResultに検索結果が格納されています
	}
});

駐車場満空情報を取得する

検索結果に駐車場が含まれる場合、その駐車場の混雑(満空)情報を取得することができます。

  1. SearchJP.FreewordSearchRequest.Extensions のインスタンスを生成します。
  2. 設定済みの SearchJP.FreewordSearchRequest.Extensions オブジェクトに、setParkingAvailabilityFlag(true) を設定します。
  3. 生成したインスタンスを SearchJP.FreewordSearchRequestsetExtensions() でリクエストに設定します。
SearchJP.FreewordSearchRequest request = new SearchJP.FreewordSearchRequest();

request.setKeyword("パイオニア");
request.setPosition(map.getCenterCoordinate());

SearchJP.FreewordSearchRequest.Extensions extensions = new SearchJP.FreewordSearchRequest.Extensions();
extensions.setParkingAvailabilityFlag(true);
request.setExtensions(extensions);

設定したリクエストを引数に、SearchJP.search()を呼び出すことで駐車場の混雑情報を取得することができます。取得可能な混雑情報は以下の通りです。

ParkingStatus意味
UNKNOWN不明
EMPTY空車
CONGESTION混雑
FULL満車

駐車場満空情報の提供元の表示

アプリ内で満空情報の 出典(提供元) を表示してください。 表示の詳細については Legal Guideline を参照して下さい。

検索結果から駐車場満空情報と提供元を取得するためには以下のようにします。

private List<String> createParkingList(SearchJP.SearchResult searchResult) {
	List<String> parkingList = new ArrayList<>();
	for (SearchJP.Place result : searchResult.getPlaceList()) {
		if (result.getGenreMList().stream().anyMatch(g -> g.getGenreKey() == 202)) {
			String brand = "";
			if (!result.getGenreSSList().isEmpty()) {
				switch (result.getGenreSSList().get(0).getGenreKey()) {
					case 90801: brand = "タイムズ"; break;
					case 90802: brand = "三井のリパーク"; break;
					case 90803: brand = "名鉄協商パーキング"; break;
					default: break;
				}
			}

			String parkingStatus = "不明";
			if (result.getParkingStatus() != null) {
				switch (result.getParkingStatus()) {
					case EMPTY: parkingStatus = "空車"; break;
					case CONGESTION: parkingStatus = "混雑"; break;
					case FULL: parkingStatus = "満車"; break;
				}
			}

			parkingList.add(String.format("名称:%s, 駐車場混雑情報:%s, 出典:%s",result.getName(), brand, parkingStatus));
		}
	}

	return parkingList;
}

駐車場入口

検索した施設に駐車場入口情報が設定されている場合、それをルート探索時に使用することで、適切な入口まで案内できます。

検索結果の駐車場入口情報をルート探索時に使用するためには以下のようにします。

RoutePlan routePlan = new RoutePlan();
SearchJP.getInstance().search(request, new SearchJP.SearchResultListener() {
	@Override
	public void onCompleted(SearchJP.ErrorCode errorCode, SearchJP.SearchResult searchResult) {
		if (errorCode == SearchJP.ErrorCode.NONE) {
			SearchJP.Place place = searchResult.getPlaceList().get(0);
			RouteEndPoint routeEndPoint = new RouteEndPoint();
			routeEndPoint.setPoint(place.getPosition());
			routeEndPoint.setParkingEntranceList(place.getParkingEntranceList()); // 駐車場入口リストを取得
			routePlan.setRouteEndPoint(routeEndPoint);
			// ルート探索処理はここでは割愛
		}
	}
}

詳しくは New Route を参照して下さい。