場所を検索します
HERE SDK for Android では、数億ものジャンル別施設( POI )、ストリート名、および世界中のポイントアドレスのグローバルデータセットを利用して、すばやく簡単に検索できます。 HERE SDK を使用すると、検索に関連するさまざまなタスクを 1 つ SearchEngine
の内から解決できます。
- 場所を探す: この巨大なデータベースの場所を、カテゴリ別、または検索語を定義して、世界中で検索して発見できます。
- 自動提案を生成: 検索条件を入力して検索を完了するときに、場所を検索します。
- 住所を逆引き( Reverse ジオコード an address ): 特定の地理座標に属する住所を検索します。
- ジオコード AN アドレス: 住所に関連付けられている地理座標を検索します。
- ID で検索: HERE の場所 ID で特定された場所を検索します。
- ルートに沿って検索: ルート全体に沿った場所を検索します。
- ルートに沿ってカテゴリで検索: ルート全体のカテゴリに基づいて場所を検索します。 この機能はベータ版です。
すべての検索バリアントに共通する機能の 1 つ は、検索する場所または領域を指定できることです。 領域の設定は、で指定された矩形領域 GeoBox
、またはで指定された円領域を通過することで行う GeoCircle
ことができます。 指定した領域外にある潜在的な検索結果は、関連するグローバルな結果を除いて、優先度の低いものでランク付けされます。たとえば、ベルリンで「 Manhattan 」を検索する場合です。 基本となる検索アルゴリズムが最適化され、結果のリストを絞り込むことができるようになり、ユーザーに迅速でわかりやすい結果が提供されます。
注 : 各検索リクエストは非同期で実行されます。 SearchEngine を使用して HERE のバックエンドサービスから結果を取得する場合は、オンライン接続が必要です。
HERE Location Services が提供する場所の膨大なデータベースは、 HERE SDK で簡単に見つける SearchEngine
ことができます。 例を見てみましょう。 まず、新しい SearchEngine
インスタンスを作成します。
try {
searchEngine = new SearchEngine();
} catch (InstantiationErrorException e) {
throw new RuntimeException("Initialization of SearchEngine failed: " + e.error.name());
}
新しい SearchEngine
インスタンスを作成すると、 InstantiationErrorException
前述のように処理する必要のあるをスローできます。 Application
のonCreate()
ライフサイクル中にエンジンを初期化することはできません。 それ以外の任意の時点で問題はありません。 たとえば、エンジンを初期化する適切な場所が Activity
の onCreate()
メソッドに含まれている可能性があります。
場所を検索します
デバイスに表示されている現在の地図センターの周りにあるすべての「ピザ」の場所を探しているとします。 検索を開始する前に、詳細をいくつか指定する必要があります。
SearchOptions searchOptions = new SearchOptions();
searchOptions.languageCode = LanguageCode.EN_US;
searchOptions.maxItems = 30;
HERE で SearchOptions
は、目的のデータを保持する新しいオブジェクトを作成します。
- を設定する
LanguageCode
ことで、返される検索結果の言語を指定できます。 -
maxItems
は、応答で配信する結果アイテムの最大数を定義するように設定されています。
上の例では、結果を 30 に制限しています。 リクエストよりも多くの検索結果が見つかった場合、最も関連性の高い 30 件の検索結果のみが返されます。
現在のビューポイント内のすべての結果を検索するために、領域検索 (1 つのボックス ) を実行します。 で SearchEngine
は、次の 3 つの方法で検索場所を指定できます。
- 検索場所
GeoCoordinates
: 指定した座標系を中心に非同期の検索リクエストを実行し、近隣で最も関連性の高い検索結果を提供します。 GeoCircle
エリア内を検索 : 上記と似ていますが、指定した円の領域内で結果を検索します。この領域は、中心の地理座標およびメートル単位の半径で定義されます。 GeoBox
エリア内を検索 : 上記と同様ですが、指定した矩形領域内で結果を検索します。この領域は、パラメーターとして渡された南西および北東の座標によって定義されます。
ワンボックス検索 は、近隣の場所を探すのに最適です。 入力すると、さまざまな言語 ( ラテン、キリル、アラビア、ギリシャ料理など ) で自由形式のテキストを提供できます。
検索する領域と用語を同時に指定できます。 たとえば、以下のように queryString
「 pizza 」に設定できます。
GeoBox viewportGeoBox = getMapViewGeoBox();
TextQuery.Area queryArea = new TextQuery.Area(viewportGeoBox);
TextQuery query = new TextQuery(queryString, queryArea);
HERE さんがコードを削除しまし getMapViewGeoBox()
た。 GeoBox
ユースケースに適した任意のを作成して渡すことができます。 実装の可能性については、付属のサンプルアプリを参照してください。
まず、指定した地図範囲内の結果が返されます。 検索結果が見つからなかった場合は、グローバル検索結果が返されることがあります。 ただし、指定した検索場所に関係なく、主要都市や州などの関連するグローバルな結果が含まれる場合があります。
注 : クエリー文字列には、検索するコンテンツの任意のテキスト記述を含めることができます。 複数の検索語を使用して、コンマで区切って検索結果を絞り込むことができます。 「ピザショーシー通り」と「ピザ、ショーシー通り」は同じ結果をもたらします。通り「チャウゼー通り」にあるピザレストランのみが見つかります。 また、空のクエリ文字列を渡すとエラーになります。この場合、検索は失敗します。
最後に、非同期で検索を開始できます。
searchEngine.search(query, searchOptions, querySearchCallback);
...
private final SearchCallback querySearchCallback = new SearchCallback() {
@Override
public void onSearchCompleted(@Nullable SearchError searchError, @Nullable List<Place> list) {
if (searchError != null) {
showDialog("Search", "Error: " + searchError.toString());
return;
}
showDialog("Search", "Results: " + list.size());
for (Place searchResult : list) {
}
}
};
結果を確認する前 SearchError
に、まず可能性を確認する必要があります。 たとえば、デバイスがオフラインの場合、 list
は null になり、エラー 列挙型 (enum) が原因を示します。 この場合、ヘルパーメソッドを呼び出し showDialog()
て、エラーの説明をユーザーに表示します。 の実装の可能 showDialog()
性は、付随する「検索」の例のソースコードからアクセスできます。このコードには、 HERE SDK 固有のコードは含まれていません。
注
検索応答にエラーまたは結果が含まれています : SearchError
および List<Place>
。 両方とも同時にヌルにすることはできません。また、同時にヌルにすることもできません。
ここで、結果を確認しましょう。 一致する結果が見つからない場合は、事前にエラーが検出されている可能性があります。
showDialog("Search", "Results: " + list.size());
for (Place searchResult : list) {
Metadata metadata = new Metadata();
metadata.setCustomValue("key_search_result", new SearchResultMetadata(searchResult));
addPoiMapMarker(searchResult.getGeoCoordinates(), metadata);
}
...
private static class SearchResultMetadata implements CustomMetadataValue {
public final Place searchResult;
public SearchResultMetadata(Place searchResult) {
this.searchResult = searchResult;
}
@NonNull
@Override
public String getTag() {
return "SearchResult Metadata";
}
}
最後に、結果のリストについて反復処理を行います。 各に Place
は、検索結果を説明するさまざまなフィールドが含まれています。
この例では、地図にマーカーを追加するために、その場所に関心があります。 さらに Metadata
、を保存できるオブジェクトを作成します SearchResult
。
注 : Metadata
オブジェクトには、の MapMarker
結果データとの関連付けを容易にするためのさまざまなデータ型を含めることができます。 このようにして、マップ マーカーに関連するすべての情報を 1 つのオブジェクトに保持できます。これは、ユーザーがマップ マーカーをタップした後などに、このデータを表示する場合に便利です。 上記 CustomMetadataValue
のように、インターフェイスを実装することで、複雑なデータオブジェクトも保存できます。
addPoiMapMarker()
の実装方法としては 、付随する「検索」のサンプルソースコードからアクセス できます。このガイドの「マップマーカーについて」も参照してください。 ピックしたマップ マーカーオブジェクトを手元に置いておくと Metadata
、前のステップで設定した情報を取得できます。
Metadata metadata = topmostMapMarker.getMetadata();
if (metadata != null) {
CustomMetadataValue customMetadataValue = metadata.getCustomValue("key_search_result");
if (customMetadataValue != null) {
SearchResultMetadata searchResultMetadata = (SearchResultMetadata) customMetadataValue;
String title = searchResultMetadata.searchResult.getTitle();
String vicinity = searchResultMetadata.searchResult.getAddress().addressText;
showDialog("Picked Search Result",title + ". Vicinity: " + vicinity);
return;
}
}
すべての地図マーカーにが含まれているわけでは Metadata
ありませ Metadata
事前にを設定していない場合 getMetadata()
、は null を返します。 この例では、のために保存されているデータ "key_search_result"
が null でないかどうかを確認するだけで、データに検索データが含まれていることがわかります。 その後、 SearchResultMetadata
目的のを保持するカスタムタイプにダウンキャストでき Place
ます。
利用可能な null 入力可能なフィールドの詳細については、 API リファレンス を参照してください。
スクリーンショット: 選択した検索結果をタイトルと近隣で表示しています。 [ 場所 ] にズームします
上記のコードでは、を使用 GeoBox
して、表示されている地図ビューポイント を直接検索します。そのため、検索結果をズームする必要はありません。 GeoBox
の代わり に、CountryCode
値のリストを渡すことで、 a GeoCircle
の内側、 a GeoCorridor
に沿って、または内側の国を囲む位置を検索することもできます ( 「自分の周りを検索」 ) 。 TextQuery.Area
サポートされているすべてのタイプについては、を参照
検索領域が表示されている地図ビューポイント と異なる場合 は、次のコードを使用してGeoCoordinates
の一覧からGeoBox
を作成し、結果を参照できます。 GeoBox
からを取得 GeoBox.containing(geoCoordinatesList)
します。
mapCamera.lookAt(geoBox, new GeoOrientationUpdate(null, null));
これでカメラが即座に移動します。 必要に応じて、さまざまなアニメーションスタイルを適用して、カメラを目的の領域にフライすることもできます。 このMapCamera
セクションを参照 して、 GitHub の CameraKeyframeTracks サンプルアプリ を確認します。
追加のパディングを適用する場合 は、viewRectangle
を追加のパラメーターとして受け取るオーバーロードされたlookAt()
メソッドを使用します。 矩形は GeoBox
、が表示されている内部のマップ ビュー を参照するピクセル単位で指定されます。
Point2D origin = new Point2D(5, 5);
Size2D sizeInPixels = new Size2D(mapView.getWidth() - 10, mapView.getHeight() - 10);
Rectangle2D paddedViewRectangle = new Rectangle2D(origin, sizeInPixels);
上記のコードでは、 GeoBox
マップビューポイント に表示されている任意の周囲に 5 ピクセルのパディングを追加するために使用できる矩形を作成します。
場所のカテゴリを検索します
TextQuery
上記のようにを使用してキーワード検索を行う代わり Place
に、カテゴリを検索して結果を予想されるカテゴリに限定することもできます。
カテゴリ ID は特定の形式に従い、 HERE platform では 700 を超えるカテゴリを使用できます。 HERE SDK には、カテゴリ検索をより簡単に実行できるように定義済みの値のセットが用意されています。 必要に応じて、 xxx-xxxx-xxxx の形式でカスタムカテゴリ文字列を渡すこともできます。各グループは、 1 、 2 、 3 の各レベルのカテゴリを表します。 1 番目のレベルがメインカテゴリを表し、 2 番目と 3 番目のレベルが論理サブセットで編成されたサブカテゴリを表します。 各カテゴリレベルは 、プレースカテゴリシステムで番号として定義されます。 例 : 100 名様までご利用いただけるこのカテゴリのメインカテゴリには、カテゴリ「 1000 」 ~ 「レストラン」があります。このレベル 2 のカテゴリには、カテゴリ「 0001 」のカジュアルダイニングがあります。カテゴリ ID は次のとおりです。 100-1000-0001
例として、「飲食」カテゴリまたは「ショッピングエレクトロニクス」カテゴリに属するすべての場所を以下から検索します。
private void searchForCategories() {
List<PlaceCategory> categoryList = new ArrayList<>();
categoryList.add(new PlaceCategory(PlaceCategory.EAT_AND_DRINK));
categoryList.add(new PlaceCategory(PlaceCategory.SHOPPING_ELECTRONICS));
CategoryQuery.Area queryArea = new CategoryQuery.Area(new GeoCoordinates(52.520798, 13.409408));
CategoryQuery categoryQuery = new CategoryQuery(categoryList, queryArea);
SearchOptions searchOptions = new SearchOptions();
searchOptions.languageCode = LanguageCode.EN_US;
searchOptions.maxItems = 30;
searchEngine.search(categoryQuery, searchOptions, new SearchCallback() {
@Override
public void onSearchCompleted(SearchError searchError, List<Place> list) {
if (searchError != null) {
infoTextview.setText("Search Error: " + searchError.toString());
return;
}
String numberOfResults = "Search results: " + list.size() + ". See log for details.";
infoTextview.setText(numberOfResults);
for (Place searchResult : list) {
String addressText = searchResult.getAddress().addressText;
Log.d(TAG, addressText);
}
}
});
}
PlaceCategory
を受け入れます String
。 HERE では、事前定義されたカテゴリ EAT_AND_DRINK
およびを使用し SHOPPING_ELECTRONICS
ます。 String
この値には、プレースカテゴリシステムで表されている ID が含まれています。 ここでも、SearchEngine
のオーバーロードされたsearch()
メソッドを使用して、カテゴリリストと場所を探す地理的座標を含むCategoryQuery
オブジェクトを渡します。
自動提案を検索します
ほとんどの場合、「撮影地」検索を提供するアプリケーションでは、ユーザーが希望の検索用語を編集可能なテキストフィールドコンポーネントに入力できます。 入力中に、可能性のある用語の予測を取得すると便利です。
エンジンによって提示された提案がランク付けされ、最も関連性の高い用語が結果リストの一番上に表示されます。 たとえば、最初のリストアイテムを使用して、ユーザーが現在入力している検索語の自動補完を提供できます。 または、ユーザーの入力中に更新された一致候補のリストを表示できます。 ユーザーは、提案のリストから適切なキーワードを選択して、選択した用語の新しい検索を開始できます。または 、タイトル や 近隣などの結果の詳細情報をすでに取得し てユーザーに提示できます。
注
HERE SDKは 、UIや完全に統合された自動補完ソリューションを提供していません。 このようなソリューションは、必要に応じてアプリケーションによって実装できます。 Suggestion
この機能を使用すると、次 Place
の条件に基づいて結果が得られます TextQuery
。 これらの場所から、タイトルテキスト(「Pizza XL」)またはその他の関連する場所情報(住所など)を使用して、ユーザーにフィードバックを提供できます。たとえば、クリック可能な完了結果を提案することができます。 しかし、そのようなソリューションはアプリケーションの個々の要件に依存し、プラットフォームAPIを使用してアプリケーション側で実装する必要があります。
通常のテキストクエリと比較して、候補の検索では、入力したクエリの用語について、優先度でランク付けされた高速な結果が提供されます。
エンジンを使用して提案を検索する方法を確認しましょう。
GeoCoordinates centerGeoCoordinates = getMapViewCenter();
SearchOptions searchOptions = new SearchOptions();
searchOptions.languageCode = LanguageCode.EN_US;
searchOptions.maxItems = 5;
TextQuery.Area queryArea = new TextQuery.Area(centerGeoCoordinates);
searchEngine.suggest(
new TextQuery("p",
queryArea),
searchOptions,
autosuggestCallback);
searchEngine.suggest(
new TextQuery("pi",
queryArea),
searchOptions,
autosuggestCallback);
searchEngine.suggest(
new TextQuery("piz",
queryArea),
searchOptions,
autosuggestCallback);
ヘルパーメソッド getMapViewCenter()
は HERE から削除され、付属のサンプルアプリで確認できます。 GeoCoordinates
マップ ビューの中央に現在表示されているを返すだけです。
新しいテキスト入力ごとに、次のリクエストを作成します。 ユーザーが「 Pizza 」と入力することを計画していると仮定します。まず「 p 」の結果を探し、次に「 pi 」の結果を探し、最後に「 piz 」の結果を探します。 ユーザーが実際に「ピザ」を検索する場合は、 3 度目の呼び出しで十分な興味深い提案があるはずです。
suggest()
メソッドは、 TaskHandle
進行中のコールのステータスを確認するため、またはコールをキャンセルするためにオプションで使用できるを返します。
結果の取得方法を確認しましょう。
private final SuggestCallback autosuggestCallback = new SuggestCallback() {
@Override
public void onSuggestCompleted(@Nullable SearchError searchError, @Nullable List<Suggestion> list) {
if (searchError != null) {
Log.d(LOG_TAG, "Autosuggest Error: " + searchError.name());
return;
}
Log.d(LOG_TAG, "Autosuggest results: " + list.size());
for (Suggestion autosuggestResult : list) {
String addressText = "Not a place.";
Place place = autosuggestResult.getPlace();
if (place != null) {
addressText = place.getAddress().addressText;
}
Log.d(LOG_TAG, "Autosuggest result: " + autosuggestResult.getTitle() +
" addressText: " + addressText);
}
}
};
HERE では SuggestCallback
、で見つかったリストアイテムをログに記録するを定義します Suggestion
。 エラーがない場合、エンジンは結果のリストを保証します。エラーがない場合は null になります。
すべての提案があるわけではありません。 たとえば、「シスコ」などの一般的な用語を使用して、新しい検索に入力できます。 generic キーワードを使用すると、Suggestion
結果にPlace
オブジェクトは含まれませんが、特定の場所を参照せずにテキストを表すのは a title
だけです。 Suggestion
結果の使用可能なすべてのフィールドについては、『 API リファレンス 』を参照してください。
結果の順序はランク付けされますが、コールバックが到着する順序については保証がありません。 そのため、まれに、「 PI 」の結果よりも前に「 Piz 」の結果が表示されることがあります。
地理座標から住所を反転( Reverse ジオコード)します
これまでに、地図上の特定の場所または地域で場所を検索する方法を確認しました。 しかし、地理座標のみがわかっている場合はどうすればよいですか。 このユースケースで最も一般的なのは、マップで何らかのアクションを実行しているユーザーです。 例えば、長押しジェスチャーです。 これにより、ユーザーが地図を操作する場所の緯度および経度座標が提供されます。 ユーザーは地図上の場所を参照できますが、その場所に属する住所情報などの他の属性は把握していません。
リバースジオ コーディング が役立つ場所です。
関心のある場所は GeoCoordinates
インスタンスで表されます。たとえば、マップをタップしたユーザーから取得できます。 その場所で「ジオコードを反転」する方法については、次の方法を参照してください。
private void getAddressForCoordinates(GeoCoordinates geoCoordinates) {
SearchOptions reverseGeocodingOptions = new SearchOptions();
reverseGeocodingOptions.languageCode = LanguageCode.EN_GB;
reverseGeocodingOptions.maxItems = 1;
searchEngine.search(geoCoordinates, reverseGeocodingOptions, addressSearchCallback);
}
private final SearchCallback addressSearchCallback = new SearchCallback() {
@Override
public void onSearchCompleted(@Nullable SearchError searchError, @Nullable List<Place> list) {
if (searchError != null) {
showDialog("Reverse geocoding", "Error: " + searchError.toString());
return;
}
showDialog("Reverse geocoded address:", list.get(0).getAddress().addressText);
}
};
SearchEngine
によって提供される他の検索機能と同様 に、必要なLanguageCode
を設定するためのSearchOptions
インスタンスを提供する必要があります。 結果の住所の言語を指定します。 その後、エンジン search()
のメソッドを呼び出して、渡された座標のアドレスをオンラインで検索できます。 デバイスがオフラインのときなど、エラーが発生 SearchError
した場合は、エラーの原因が保持されます。
注
リバースジオ コーディング応答にエラーまたは結果が含まれています : SearchError
また、結果リストは一度にヌルにすることも、ヌル以外にすることもできません。
Address
各 Place
インスタンス内に含まれるオブジェクトはデータクラス String
で、国、市区町村、番地などの生の場所の住所を記述する複数のフィールドが含まれています。 詳細については、 API リファレンス を参照してください。 読み取り可能なアドレス表現の受信のみに関心がある場合 addressText
は、上の例に示すようにににアクセスできます。 String
これは、その場所のタイトルを含む、最も関連性の高い住所の詳細を含むです。
スクリーンショット: 住所に解決された印刷機の長い座標を表示しています。 Reverse ジオ コーディングでは、特定の検索領域は必要ありません。 世界中の住所に座標を解決できます。
ジオコード住所を特定の場所に移動します
Reverse ジオ コーディング を使用すると、未加工の座標から住所を取得できますが 、 Forward ジオ コーディング では逆の処理が行われ、道路名や都市名などの住所の詳細を入力するだけで、未加工の座標やその他の位置情報を検索できます。
注 : ほとんどの場合、リバースジオ コーディングでは 1 つの結果しか得られませんが、ジオ コーディングでは 1 つ以上の結果が得られます。
HERE がその方法をご案内します。 まず、検索する場所の近くの座標を指定し、 queryString
正確な場所を検索する住所を設定します。
AddressQuery query = new AddressQuery(queryString, geoCoordinates);
SearchOptions options = new SearchOptions();
options.languageCode = LanguageCode.DE_DE;
options.maxItems = 30;
searchEngine.search(query, options, geocodeAddressSearchCallback);
...
private final SearchCallback geocodeAddressSearchCallback = new SearchCallback() {
@Override
public void onSearchCompleted(SearchError searchError, List<Place> list) {
if (searchError != null) {
showDialog("Geocoding", "Error: " + searchError.toString());
return;
}
for (Place geocodingResult : list) {
}
showDialog("Geocoding result","Size: " + list.size());
}
};
この例では、 HERE の Berlin HQ "Invalidenstra ß e 116" の通りの名前をクエリー文字列として渡します ( 任意で都市名を入力します ) 。 これはドイツ語の通り名な DE_DE
ので、ドイツ語の言語コードを使用します。 これにより、返される結果の言語も決まります。
注
結果は指定した場所から遠く離れていてもかまいませんが、指定した座標に近い結果が高い順にランク付けされ、できれば返されます。
が SearchCallback
エラーなしで完了したことを確認した後 Place
、エレメントのリストを確認します。
注
searchError
が null の場合、結果 list
は null ではないことが保証され、その逆も同様です。
結果は 、未加工の座標を含むPlace
オブジェクトにラップ されます。また、Address
オブジェクトや、 HERE Places API 内の位置を特定する場所 ID など、その他の住所の詳細情報もラップされます。 以下では、一覧表について繰り返し、住所のテキストと座標を取得します。
for (Place geocodingResult : list) {
GeoCoordinates geoCoordinates = geocodingResult.getGeoCoordinates();
Address address = geocodingResult.getAddress();
String locationDetails = address.addressText
+ ". GeoCoordinates: " + geoCoordinates.latitude
+ ", " + geoCoordinates.longitude;
}
ユーザーがマップからこのような結果を選択した場合の表示例については、以下のスクリーンショットを参照してください。 ご希望の場合は、添付の「検索」の例アプリを参照してください。この例では、住所のテキストを検索し、地図上で見つかった場所に地図マーカーを配置する方法を示します。
スクリーンショット: 選択したジオ コーディング結果を表示しています。 ルート沿いを検索します
SearchEngine
は、長方形または円の領域で検索せずに、GeoPolyline
および他のパラメーターで定義できるより複雑なGeoCorridor
領域で検索する場合に、特殊な検索ケースをサポートします。
このような場合の最も一般的なシナリオ Route
は、を検索してレストランを探すことです。 ルートオブジェクトがすでに計算されているとします。 経路の計算方法については、経路のセクションを参照してください。 を指定すると TextQuery
、ルート全体を含む長方形の領域を簡単に定義できます。
TextQuery textQuery = TextQuery("restaurants", route.getBoundingBox())
ただし、より長いルートの場合、およびルートの形状によっては、が route.boundingBox
ルート全体を長方形の領域に包含する必要があるため、結果が実際のルートパスから非常に離れている場合があります。
HERE SDK は GeoCorridor
、ルートの実際の形状から検索領域を判断できるクラスを提供することで、より正確なソリューションを提供します。 この方法 では、パスの上または下にある検索結果のみが含まれます。
以下に、ルートに沿ってチャージステーションを検索する方法の例を示します。
private void searchAlongARoute(Route route) {
int halfWidthInMeters = 200;
GeoCorridor routeCorridor = new GeoCorridor(route.getGeometry().vertices, halfWidthInMeters);
TextQuery.Area queryArea = new TextQuery.Area(routeCorridor, mapView.getCamera().getState().targetCoordinates);
TextQuery textQuery = new TextQuery("charging station", queryArea);
SearchOptions searchOptions = new SearchOptions();
searchOptions.languageCode = LanguageCode.EN_US;
searchOptions.maxItems = 30;
searchEngine.search(textQuery, searchOptions, new SearchCallback() {
@Override
public void onSearchCompleted(SearchError searchError, List<Place> items) {
if (searchError != null) {
if (searchError == SearchError.POLYLINE_TOO_LONG) {
Log.d("Search", "Route too long or halfWidthInMeters too small.");
} else {
Log.d("Search", "No charging stations found along the route. Error: " + searchError);
}
return;
}
Log.d("Search","Search along route found " + items.size() + " charging stations:");
for (Place place : items) {
}
}
});
}
ご覧 のように、GeoCorridor
はルートGeoPolyline
と halfWidthInMeters を必要とします。 この値は、ポリライン上の任意のポイントから廊下の端までの最も遠いエッジを定義します。 小さな値を指定すると、実際のルートに沿って非常に近いエリアが結果の廊下によって定義されます。
スクリーンショット: ルートに沿って見つかった充電ステーションを表示しています。 ルートの始点と終点の座標では、廊下は丸い形になります。一定の厚さのスネークが頭と尾に丸いエッジを持つようなものを想像してください。 上記のスクリーンショットと混同しないでください。ルートの始点と終点を示す緑色の円が表示されます。
特に長いルートの場合、内部的に検索アルゴリズムが検索経路の最適化を試行します。 ただし、ポリラインが長すぎる可能性があります。 上記のコード スニペットに示されているように、このケースをキャッチして、最終的にはより複雑でないルートの検索を再トリガすることにします。 これは halfWidthInMeters
パラメータで制御できます。値を大きくすると、廊下の複雑さが軽減され、結果の精度が低下しますが、少なくともこの方法ではより多くの結果が得られます。
ルートの複雑さは、フードの下の複数の要因によって決まります。そのため、ルートの明確な長さは一般に指定できません。
エラーが発生しなかっ Place
た場合は、上記のセクションにすでに示されているように結果を処理できます。