ガイド変更履歴HERE SDK API references
ガイド

検索を開始する

HERE SDKは世界中の数億のPOI (施設情報) と住所を含むHEREの広範なグローバルデータセットを活用して、高速で簡単な検索機能を提供します。HERE SDKを使うと、1つのSearchEngineで次のさまざまな検索関連タスクを効率的に実行できます。

  • 場所を検出する:カテゴリー別、または検索語を設定して、世界中のHEREの膨大なデータベースから場所を検索して検出します。
  • 自動候補提示を生成する:検索語を入力して場所を検索することでクエリが補完されます。
  • 住所をリバースジオコーディングする:特定の地理座標に属する住所を検索します。
  • 住所をジオコーディングする:住所に関連付けられた地理座標を検索します。
  • IDで検索する:HEREの場所IDで識別される場所を検索します。
  • ルートに沿って検索する:ルート全体に沿った場所を検索します。
  • ルートに沿ったカテゴリーで検索する:ルート全体に沿ったカテゴリーに基づいて場所を検索します。この機能はベータ版です。
  • what3wordsのサポート (Navigateでのみ使用可能):3語の住所で検索できます。
  • オフラインで検索する (Navigateでのみ使用可能):インターネット接続が利用できない場合は、OfflineSearchEngineに切り替えて、すでにキャッシュに保存されたマップデータまたはプリロードされたオフラインマップデータを検索できます。
  • 私の場所 (Navigateでのみ使用可能):実行時に独自の場所を追加して、オフラインで検索します。

すべての検索バリエーションに共通する機能の 1 つは、検索する場所またはエリアを指定できることです。エリアの設定は、GeoBox で指定された長方形エリア、または GeoCircle で指定された円形エリアを渡すことによって行うことができます。指定されたエリア外にある検索結果候補は、関連するグローバル結果を除き、優先順位が低くなります。たとえば、ベルリンの「マンハッタン」を検索する場合です。ベースとなる検索アルゴリズムは、結果のリストを絞り込み、より速く、より意味のある結果をユーザーに提供できるように最適化されています。

検索はHERE Geocoding and Searchに基づいています。 ジオコーディングと検索の例:SearchEngine.searchByAddress(AddressQuery, ...)。 リバースジオコーディングの例:SearchEngine.searchByCoordinates(GeoCoordinates, ...) 検出と検索の例:SearchEngine.searchByText(TextQuery, ...)。 自動候補提示の例:SearchEngine.suggestByText(TextQuery, ...)

これらの機能の価格については、「HERE基本プランの価格表」を参照してください。Navigateライセンスを使用している場合、または価格についてご質問がある場合は、お問い合わせください。

各検索リクエストは非同期的に実行されます。SearchEngine を使用して HERE のバックエンド サービスから結果を取得する場合は、オンライン接続が必要です。

SearchEngine を初期化する

HERE の位置情報サービスで提供する膨大な場所のデータベースは、HERE SDK の SearchEngine を使用して簡単にアクセスし探索できます。例を見てみましょう。まず、新しいSearchEngineインスタンスを作成します。

try {
    searchEngine = new SearchEngine();
} catch (InstantiationErrorException e) {
    throw new RuntimeException("Initialization of SearchEngine failed: " + e.error.name());
}
try {
    searchEngine = SearchEngine()
} catch (e: InstantiationErrorException) {
    throw RuntimeException("Initialization of SearchEngine failed: " + e.error.name)
}

新しいSearchEngineインスタンスを作成すると、上に示したように処理する必要があるInstantiationErrorExceptionがスローされる可能性があります。ApplicationonCreate() ライフサイクル中にエンジンを初期化することはできない点に注意してください。それ以外の時点であれば問題ありません。たとえば、エンジンを初期化するのに適した場所はActivityonCreate()メソッド内である可能性があります。

EV充電検索を拡張する (EVCP 3.0)

EVSearchEngineはオンライン専用であり、Navigateライセンスに加えてHERE EV Charge Points API v3の追加ライセンスが必要です。このエンタイトルメントがない場合、APIは充電メタデータを返しません。

EVSearchEngineは、HERE Place IDを使用してEV充電場所の詳細情報を取得するために単独で実行することも、SearchEngine.setEVInterface(...)を介して**SearchEngineに接続する**こともできます。これにより、標準の場所検索ごとにplace.getDetails().evChargingLocationが自動的に公開されます。ユースケースに応じてモードを選択します。EV固有のペイロード (料金、EVSEステータス、トラックの制限など) のみが必要な場合はEVSearchEngine.search()を直接呼び出します。EVメタデータをより広範なPOIレスポンスに統合したい場合は、既存のSearchEngineインスタンスに組み込みます。

EVSearchExampleは両方の方法に対応しています。エンジンを組み合わせて拡張する方法を示すとともに、SearchEngineのクエリを使用しない場合にはsearchEVChargingLocationsByPlaceIds()を単独で呼び出すこともできます。

public final class EVSearchExample {

    // Provides EVCP 3.0 enrichment; requires an additional EV Charging license beyond Navigate.
    private static final String LOG_TAG = "EVSearchExample";
    private final SearchEngine searchEngine;
    private final EVSearchEngine evSearchEngine;

    public EVSearchExample() throws InstantiationErrorException {
        searchEngine = new SearchEngine();
        evSearchEngine = new EVSearchEngine();
        searchEngine.setEVInterface(evSearchEngine);
    }

    // Works standalone for EV-only lookups or alongside SearchEngine to enrich generic results.
    public void searchEVChargingLocationsByPlaceIds(List<String> placeIds,
                                                    SearchOptions searchOptions) {
        EVSearchOptions evOptions = new EVSearchOptions();
        evOptions.additionalFeatures = Arrays.asList(
                EVChargingLocationFeature.ENERGY_MIX,
                EVChargingLocationFeature.OPENING_HOURS);

        // Direct EVSearchEngine call (can be used without SearchEngine involvement).
        evSearchEngine.setOptions(evOptions);
        evSearchEngine.search(placeIds, (evSearchError, locations) -> {
            if (evSearchError != null) {
                Log.d(LOG_TAG, "EV lookup failed: " + evSearchError);
                return;
            }
            for (EVChargingLocation location : locations) {
                Metadata metadata = new Metadata();
                metadata.setString("id", location.getID());
                metadata.setString("connectorGroups", String.valueOf(location.getConnectorGroups().size()));
                // Attach metadata to dedicated EV UI or map markers.
            }
        }, evOptions);

        // Optional: keep using SearchEngine so every place result surfaces evChargingLocation details.
        searchEngine.searchByText(new TextQuery("charging", new TextQuery.Area(getMapViewGeoBox())),
                searchOptions, (searchError, places) -> {
                    if (searchError != null) {
                        Log.d(LOG_TAG, "Search error: " + searchError);
                        return;
                    }
                    for (Place place : places) {
                        Details details = place.getDetails();
                        EVChargingLocation evDetails = details != null ? details.evChargingLocation : null;
                        // evDetails is populated only when the EV license is active.
                    }
                });
    }
}
class EVSearchExample @Throws(InstantiationErrorException::class) constructor() {

    // Provides EVCP 3.0 enrichment; requires an additional EV Charging license beyond Navigate.
    private val searchEngine = SearchEngine()
    private val evSearchEngine = EVSearchEngine()

    init {
        searchEngine.setEVInterface(evSearchEngine)
    }

    // Works standalone for EV-only lookups or alongside SearchEngine to enrich generic results.
    fun searchEVChargingLocationsByPlaceIds(
        placeIds: List<String>,
        searchOptions: SearchOptions
    ) {
        val evOptions = EVSearchOptions().apply {
            additionalFeatures = listOf(
                EVChargingLocationFeature.ENERGY_MIX,
                EVChargingLocationFeature.OPENING_HOURS
            )
        }

        // Direct EVSearchEngine call (can be used without SearchEngine involvement).
        evSearchEngine.setOptions(evOptions)
        evSearchEngine.search(placeIds, { error, locations ->
            if (error != null) {
                Log.d("EVSearchExample", "EV lookup failed: $error")
                return@search
            }
            locations?.forEach { location ->
                val metadata = Metadata().apply {
                    setString("id", location.id)
                    setString("connectorGroups", location.connectorGroups.size.toString())
                }
                // Attach metadata to dedicated EV UI or map markers.
            }
        }, evOptions)

        // Optional: use SearchEngine to enrich general search results with EV metadata.
        searchEngine.searchByText(TextQuery("charging", TextQuery.Area(mapViewGeoBox)),
            searchOptions) { searchError, places ->
            if (searchError != null) {
                Log.d("EVSearchExample", "Search error: $searchError")
                return@searchByText
            }
            places?.forEach { place ->
                val evDetails = place.details?.evChargingLocation
                // evDetails is populated only when the EV license is active.
            }
        }
    }
}

同じEVSearchExampleの実装はEVRoutingサンプルアプリにも含まれており、エンドツーエンドで動作を確認できます。

この設定により、使い慣れたSearchEngineのエントリーポイント (カテゴリー、テキスト、またはルート沿い検索) を引き続き使用しながら、該当する場合はコネクター数、料金、オペレーターデータなどのEVCP 3.0情報が自動的に表示されます。EV固有のペイロードのみが必要な場合は、EVSearchEngineのみを使用できます。

場所を検索する

デバイス上に表示されている現在の地図の中心の周囲にあるすべての「ピザ」関連の場所を検索するとします。検索を開始する前に、次のように、さらにいくつかの詳細を指定する必要があります。

SearchOptions searchOptions = new SearchOptions();
searchOptions.languageCode = LanguageCode.EN_US;
searchOptions.maxItems = 30;
val searchOptions = SearchOptions()
searchOptions.languageCode = LanguageCode.EN_US
searchOptions.maxItems = 30

ここでは、必要なデータを格納する新しいSearchOptionsオブジェクトを作成します。

  • LanguageCodeを設定することで、返される検索結果の言語を指定できます。
  • maxItems は、レスポンスに表示される結果アイテムの最大数を定義するために設定されます。

上の例では結果を30件に制限しています。エンジンがリクエストよりも多くの検索結果を検出した場合、最も関連性の高い 30 件の検索結果のみを返します。

現在のビューポート内のすべての結果を検索したいため、エリア検索 (ワンボックス) を実行します。SearchEngine には、検索場所を指定する 3 つの異なる方法が用意されています。

  • GeoCoordinates で検索する:指定された座標の周囲で非同期検索リクエストを実行し、近くで最も関連性の高い検索結果を提供します。
  • GeoCircleエリア内を検索する:上記と似ていますが、中心の地理座標とメートル単位の半径で定義される、指定された円形エリア内の結果を検索します。
  • GeoBoxエリア内を検索する:上記と似ていますが、パラメーターとして渡された South West 座標と North East 座標によって定義される、指定された長方形エリア内の結果を検索します。

ワンボックス検索は、近くの場所を検出するのに最適です。入力として、さまざまな混合言語 (ラテン語、キリル語、アラビア語、ギリシャ語など) で自由形式のテキストを入力できます。

エリアと用語を一緒に指定して検索できます。たとえば、以下では queryString を「ピザ」に設定できます。

GeoBox viewportGeoBox = getMapViewGeoBox();
TextQuery.Area queryArea = new TextQuery.Area(viewportGeoBox);
TextQuery query = new TextQuery(queryString, queryArea);
val viewportGeoBox = mapViewGeoBox
val queryArea = TextQuery.Area(viewportGeoBox)
val query = TextQuery(queryString, queryArea)

ここでは、getMapViewGeoBox() のコードを省略しています。ユースケースに適した任意の GeoBox を作成して渡すことができます。可能な実装は付属のサンプルアプリで確認できます。

まず、指定されたマップエリア内の結果が返されます。結果が見つからなかった場合は、グローバル検索結果が返される場合があります。ただし、指定された検索場所に関係なく、著名な都市や州などの関連するグローバルな結果が含まれる場合があります。

クエリ文字列には、検索するコンテンツのテキストによる説明を含めることができます。カンマ区切りの有無にかかわらず、複数の検索語を渡して検索結果を絞り込むことができます。したがって、「Pizza Chausseestraße」と「Pizza, Chausseestraße」はどちらも同じ結果になり、「Chausseestraße」通りにあるピザ レストランのみが検索されます。また、空のクエリ文字列を渡すとエラーとなり、この場合、検索は失敗することにも注意してください。

最後に、非同期で検索を開始できます。

searchEngine.searchByText(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;
        }

        // If error is null, list is guaranteed to be not empty.
        showDialog("Search", "Results: " + list.size());

        // Add new marker for each search result on map.
        for (Place searchResult : list) {
            // ...
        }
    }
};
searchEngine!!.searchByText(query, searchOptions, querySearchCallback)

...

private val querySearchCallback =
    SearchCallback { searchError, list ->
        if (searchError != null) {
            showDialog("Search", "Error: $searchError")
            return@SearchCallback
        }
        // If error is null, list is guaranteed to be not empty.
        showDialog("Search", "Results: " + list!!.size)

        // Add new marker for each search result on map.
        for (searchResult in list) {
            val metadata = Metadata()
            metadata.setCustomValue("key_search_result", SearchResultMetadata(searchResult))
            // Note: getGeoCoordinates() may return null only for Suggestions.
            addPoiMapMarker(searchResult.geoCoordinates!!, metadata)
        }
    }

結果を調べる前に、まずSearchErrorの可能性があるかどうかを確認します。たとえば、デバイスがオフラインの場合、list は null になり、エラー列挙型が原因を示します。この場合、ヘルパーメソッドshowDialog()を呼び出して、エラーの説明をユーザーに表示します。showDialog() の実装例には、付属の「検索」サンプルのソース コードからアクセスできます。これには HERE SDK 固有のコードは含まれません。

検索レスポンスには、エラーまたは結果 (SearchErrorList<Place>) が含まれています。両方を同時に null にしたり、同時に非 null にしたりすることはできません。

結果を地図に表示する

それでは結果を見てみましょう。一致する結果が見つからなかった場合は、事前にエラーが検出されているはずです。

// If error is null, list is guaranteed to be not empty.
showDialog("Search", "Results: " + list.size);

// Add new marker for each search result on map.
for (Place searchResult : list) {
    Metadata metadata = new Metadata();
    metadata.setCustomValue("key_search_result", new SearchResultMetadata(searchResult));
    // Note: getGeoCoordinates() may return null only for Suggestions.
    addPoiMapMarker(searchResult.getGeoCoordinates(), metadata);
}

...

// Class to store search results as 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";
    }
}
// If error is null, list is guaranteed to be not empty.
showDialog("Search", "Results: " + list!!.size)

// Add new marker for each search result on map.
for (searchResult in list) {
    val metadata = Metadata()
    metadata.setCustomValue("key_search_result", SearchResultMetadata(searchResult))
    // Note: getGeoCoordinates() may return null only for Suggestions.
    addPoiMapMarker(searchResult.geoCoordinates!!, metadata)
}

...

// Class to store search results as Metadata.
private class SearchResultMetadata(val searchResult: Place) : CustomMetadataValue {
    override fun getTag(): String {
        return "SearchResult Metadata"
    }
}

最後に、結果のリストを反復処理します。各 Place には、見つかった検索結果を説明するさまざまなフィールドが含まれています。

この例では、地図にマーカーを追加するために、その場所の位置情報が重要になります。さらに、SearchResultを保存できるMetadataオブジェクトを作成します。

Metadata オブジェクトにはさまざまなデータ型を含めることができ、MapMarker と結果データを簡単に関連付けることができます。このようにして、マップマーカーに関連するすべての情報を1つのオブジェクトに格納できます。これは、たとえばユーザーがマップマーカーをタップした後など、このデータを表示するときに便利です。複雑なデータ オブジェクトでも、上に示したように CustomMetadataValue インターフェースを実装することで保存できます。

addPoiMapMarker()の実装例には、付属の「検索」サンプルのソースコードからアクセスできます。このガイドのマップマーカーに関するセクションも参照してください。

private void addPoiMapMarker(GeoCoordinates geoCoordinates, Metadata metadata) {
    MapMarker mapMarker = createPoiMapMarker(geoCoordinates);
    mapMarker.setMetadata(metadata);
    mapView.getMapScene().addMapMarker(mapMarker);
    mapMarkerList.add(mapMarker);
}

private MapMarker createPoiMapMarker(GeoCoordinates geoCoordinates) {
    MapImage mapImage = MapImageFactory.fromResource(context.getResources(), R.drawable.poi);
    return new MapMarker(geoCoordinates, mapImage, new Anchor2D(0.5F, 1));
}
private fun addPoiMapMarker(geoCoordinates: GeoCoordinates, metadata: Metadata) {
    val mapMarker = createPoiMapMarker(geoCoordinates)
    mapMarker.metadata = metadata
    mapView.mapScene.addMapMarker(mapMarker)
    mapMarkerList.add(mapMarker)
}

private fun createPoiMapMarker(geoCoordinates: GeoCoordinates): MapMarker {
    val mapImage = MapImageFactory.fromResource(context.resources, R.drawable.poi)
    return MapMarker(geoCoordinates, mapImage, Anchor2D(0.5, 1.0))
}

選択したマップマーカーオブジェクトが用意できたら、次のように、前の手順で設定した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;
    }
}
val metadata = topmostMapMarker.metadata
if (metadata != null) {
    val customMetadataValue = metadata.getCustomValue("key_search_result")
    if (customMetadataValue != null) {
        val searchResultMetadata = customMetadataValue as SearchResultMetadata
        val title = searchResultMetadata.searchResult.title
        val vicinity = searchResultMetadata.searchResult.address.addressText
        showDialog("Picked Search Result", "$title. Vicinity: $vicinity")
        return@MapPickCallback
    }
}

すべてのマップマーカーにMetadataが含まれるわけではありません。事前に Metadata を設定していない限り、getMetadata() は null を返します。この例では、"key_search_result"に保存されているデータがnullでないかどうかを単純に確認するだけで、検索データが含まれていることがわかります。次に、目的のPlaceを格納するカスタムタイプSearchResultMetadataにダウンキャストできます。

使用可能な null 許容フィールドの概要については、「API リファレンス」を参照してください。

Screenshot: Showing a picked search result with title and vicinity.

Web画像にアクセスする

HERE SDKには、place.Details内にWebImageオブジェクトのリストが用意されており、各Placeを視覚的に確認できます。

ウェブ画像を使用した検索結果を強化化するには、TripAdvisorからリッチコンテンツを受け取るための有効な資格情報が必要です。アクセスをリクエストするには、HERE営業担当者にお問い合わせください。ライセンスがない場合、画像リストは空になります。

WebImageアクセスは以下の方法で有効にできます。

searchEngine.setCustomOption("discover.show", "tripadvisor");
searchEngine.setCustomOption("discover.show", "tripadvisor")

WebImageアクセスが有効になり、リッチコンテンツの有効な資格情報が設定されると、検索結果に画像が含まれるようになります。PlaceからWebImageにアクセスするには、以下の方法を使用します。

public void handleWebImages(Place searchResult){
    List<WebImage> webImages = searchResult.getDetails().images;
    for (WebImage webImage: webImages){
        Log.i(LOG_TAG,"WebImage found for place :" +
                searchResult.getTitle().trim() +
                ". Link: " + webImage.source.href);
    }
}
private fun handleWebImages(searchResult: Place) {
    val webImages = searchResult.details.images
    for (webImage in webImages) {
        Log.i(LOG_TAG, "WebImage found for place :" +
                    searchResult.title.trim() +
                    ". Link: " + webImage.source.href)
    }
}

ユーザーは、プラットフォーム固有のアプリ内ロジックを使用して、各href内のwebImage.Sourceにアクセスして画像を取得できます。たとえば、hrefリンクは、https://media-cdn.tripadvisor.com/media/photo-f/10/fb/d1/05/panorama.jpgのようになります。

場所にズームする

上記のコードは、GeoBox を使用して、表示されたマップ ビューポート内で直接検索を行うため、見つかった結果にズームする必要はありません。GeoBox の代わりに、CountryCode 値のリストを渡すことで、場所の周囲 (「自分の周囲を検索」)、GeoCircle 内、GeoCorridor 沿い、または国内を検索することもできます。サポートされているすべてのタイプについては、TextQuery.Area を参照してください。

検索エリアが表示されたマップ ビューポートと等しくない場合は、次のコードを使用して、GeoCoordinates のリストから GeoBox を作成することで結果に移動できます。GeoBox.containing(geoCoordinatesList) から GeoBox を取得します。

// Set null values to keep the default map orientation.
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 ピクセルのパディングを追加するために使用できる長方形を作成します。

Search サンプル アプリを試す

上のセクションと次のセクションの完全なコードは、GitHubSearchサンプルアプリに含まれています。

what3wordsを検索する (Navigateでのみ使用可能)

what3wordsは、地球上の3メートル四方の区画に3語の固有の住所を割り当てるジオコーディングシステムです。覚えやすい単語の組み合わせによって正確な場所を識別でき、これらの住所を正確な地理座標に変換することもできます。

例を見てみましょう。新しいW3WSearchEngineインスタンスを次のように作成できます。

try {
    w3wSearchEngine = new W3WSearchEngine();
} catch (InstantiationErrorException e) {
    throw new RuntimeException("Initialization of W3WSearchEngine failed: " + e.error.name());
}
try {
    w3wSearchEngine = W3WSearchEngine()
} catch (e: InstantiationErrorException) {
    throw RuntimeException("Initialization of W3WSearchEngine failed: " + e.error.name)
}

新しいW3WSearchEngineインスタンスを作成すると、InstantiationErrorExceptionがスローされる可能性があります。ApplicationonCreate() ライフサイクル中にエンジンを初期化することはできない点に注意してください。それ以外の時点であれば問題ありません。たとえば、エンジンを初期化するのに適した場所は ActivityonCreate() メソッド内である可能性があります。

W3WSearchEngineのサンプルコードは、「SearchHybrid」サンプルアプリの一部として、GitHubJavaおよびKotlin版で公開されています。

指定されたwhat3words用語の場所を検索する (Navigateでのみ使用可能)

まず、searchWordsを設定します。次に、w3wSearchEngineの検索メソッドを呼び出し、用語を指定します。

検索が完了すると、onW3WSearchCompleted()メソッドは結果を処理します。

// Sample "dizzy.vanilla.singer" used for demonstration purposes. Replace with user input as needed.
String searchWords = "dizzy.vanilla.singer";

/* Finds the location of a known What3Words term.
* This method searches for the geographic location corresponding to a given three-word address
* (e.g., "dizzy.vanilla.singer").
*/
w3wSearchEngine.search(searchWords, new W3WSearchCallback() {
    @Override
    public void onW3WSearchCompleted(@Nullable W3WSearchError w3WSearchError, @Nullable W3WSquare w3WSquare) {
        handleW3WSearchResult(w3WSearchError, w3WSquare);
    }
});

private void handleW3WSearchResult(@Nullable W3WSearchError w3WSearchError, @Nullable W3WSquare w3WSquare) {
    if (w3WSearchError != null) {
        showDialog("W3Words Search Error", "Error: " + w3WSearchError.toString());
    } else if (w3WSquare != null) {
        // If the search was successful, extract the What3Words.
        String W3Words = w3WSquare.words;

        // Retrieve additional details, such as the coordinates of the square.
        GeoCoordinates southWestCorner = w3WSquare.square.southWestCorner;
        GeoCoordinates northEastCorner = w3WSquare.square.northEastCorner;

        // Check if the details are available and display them in a dialog.
        showDialog("W3Words Details",
                "W3Words: " + W3Words + "\n" +
                        "Language: " + w3WSquare.languageCode + "\n" +
                        "southWestCorner coordinates: " + southWestCorner.latitude + ", " + southWestCorner.longitude + "\n" +
                        "northEastCorner coordinates: " + northEastCorner.latitude + ", " + northEastCorner.longitude);
    }
}

what3words用語を場所にジオコード化する (Navigateでのみ使用可能)

指定された緯度と経度の値と、指定された言語コードを使って、まず、GeoCoordinatesオブジェクトを初期化します。次に、w3wSearchEngineの検索メソッドを呼び出し、座標、言語、レスポンスを管理するためのコールバックを指定します。

ジオコーディング検索が完了すると、onW3WSearchCompleted()メソッドは結果を処理します。

GeoCoordinates geoCoordinates = new GeoCoordinates(52.520798, 13.409408);
// The language code for the desired three-word address.
// ISO 639-1 code "en" specifies that the three-word address will be in English.
String w3wLanguageCode = "en";

/* Resolves geographic coordinates to a What3Words address (three-word format).
* This method uses the What3Words search engine to find a three-word address based
* on the provided coordinates (latitude and longitude).
*/
w3wSearchEngine.search(geoCoordinates, w3wLanguageCode, new W3WSearchCallback() {
    @Override
    public void onW3WSearchCompleted(@Nullable W3WSearchError w3WSearchError, @Nullable W3WSquare w3WSquare) {
        handleW3WSearchResult(w3WSearchError, w3WSquare);
    }
});

EN 日本語

HERE documentation

Find answers to your product and technical questions

Documentation

What's new

Videos

EN 日本語

HERE ドキュメント

製品や技術に関する質問の答えを見つけましょう。より多くの内容と最新の情報については、英語版をご覧ください。

ドキュメント

ダイナミックマップ

動的コンテンツ関連のAPIをアプリやサービスに活用して、ドライバーが安全・快適かつ予定どおりに目的地へ到着できるよう支援します。

地図とデータ

世界中を走行する多数のマッピング車両から得られる最新の位置情報データを活用し、精度の高い地図やカスタムレイヤーを構築できます。

最新情報

動画

(function () { const input = document.querySelector('input[data-typeahead]'); if (!input) return; // Prevent the form from submitting/navigating input.closest('form')?.addEventListener('submit', e => e.preventDefault()); input.addEventListener('input', function () { const q = this.value.trim().toLowerCase(); document.querySelectorAll('.nav-group-name').forEach(group => { let anyVisible = false; group.querySelectorAll('.nav-group-task').forEach(task => { const text = task.textContent.trim().toLowerCase(); const show = !q || text.includes(q); task.style.display = show ? '' : 'none'; if (show) anyVisible = true; }); // Hide the whole group header if nothing matches group.style.display = anyVisible || !q ? '' : 'none'; }); }); })(); (function () { function onTokenClick(event) { var link = event.target.closest('.sdk-for-ios .item .token'); if (!link) return; event.preventDefault(); console.log('token clicked', link.textContent.trim()); var item = link.closest('.item'); if (!item) return; var content = item.querySelector('.height-container'); if (!content) { console.log('no .height-container found for item', item); return; } var isHidden = window.getComputedStyle(content).display === 'none'; content.style.display = isHidden ? 'block' : 'none'; link.classList.toggle('token-open', isHidden); var href = link.getAttribute('href'); if (href) { if (history.pushState) history.pushState({}, '', href); else location.hash = href; } } function openHashTarget() { var hash = window.location.hash.slice(1); if (!hash) return; var anchor = document.querySelector('.sdk-for-ios a[name="' + hash + '"]'); if (!anchor) return; var item = anchor.closest('.item'); if (!item) return; var link = item.querySelector('.token'); var content = item.querySelector('.height-container'); if (!link || !content) return; content.style.display = 'block'; link.classList.add('token-open'); } function init() { console.log('HERE SDK accordion init'); openHashTarget(); } document.removeEventListener('click', onTokenClick); document.addEventListener('click', onTokenClick); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } window.addEventListener('hashchange', openHashTarget); window.addEventListener('pageLoad', init); })();