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

HERE Style Editorを使用してスタイルを作成する

地図の最も柔軟なカスタマイズソリューションは、HERE Style Editorで生成された設定ファイルを使用して、独自のMapSchemeスタイルを作成することです。

Web ベースの統合された HERE Style Editor は、HERE プラットフォームで利用できます。これは、Maps API for JavaScript (JSAPI) および バージョン 4.12.1.0 以降の HERE SDK と互換性があります。レガシーのデスクトップエディターで作成されたカスタムマップスタイルは、新しいHERE Style Editor形式に移行する必要があります。レガシーのバージョンからのスタイル更新については、HERE担当者にご相談ください

Screenshot: The HERE Style Editor showing a custom map configuration.

詳細については、HERE Style Editor のユーザー ガイドを参照してください。最新の更新情報は、こちらのブログ記事を参照してください。

HERE Style Editor を使用するには次の手順を実行します。

  1. まだサインアップしていない場合は、HERE プラットフォームのアカウントにサインアップします。
  2. 追加の詳細を入力して、アカウントの生成を確認し確定します。
  3. HERE プラットフォームのランディング ページのランチャーのメニューから HERE Style Editor を選択する、またはサインイン後にこちらの直接リンクを使用してください。
  4. 既存のベース (base) スタイルからカスタマイズするものを 1 つ選択して、HERE Style Editor の利用を開始します。
  5. カスタマイズをマップ スタイルに適用します。
  6. [File](ファイル) -> [Export Map Style](マップスタイルをエクスポート) をクリックして、カスタマイズしたマップスタイルをローカルのコンピューターにエクスポートします。その後、以下の説明のとおりにアプリケーションに読み込みます。

HERE Style Editor v1.13.0以降は、ZIPアーカイブ (.tar.gz) のみがエクスポートされます。このアーカイブには、POIカテゴリーとJSON形式のスタイルファイルが含まれます。MapScene.loadScene(...)を使用してカスタムスタイルをロードする場合、HERE SDKでは、configurationFileにJSONファイルまたはZIPアーカイブを指定できます。

  • HERE Style Editor 1.13.0以降を使用している場合は、次の手順を実行します。
  • 生成されたtar.gzアーカイブを抽出し、ZIPアーカイブに再パッケージします。生成されたZIPファイルをプロジェクトの「assets」ディレクトリにコピーします。
  • フルパスの例:app/src/main/assets/my-custom-dark-style-neon-rds.zip
  • 古いバージョンのHERE Style Editorを使用している場合は、次の手順を実行します。
  • 生成されたJSONファイルをプロジェクトの「assets」ディレクトリにコピーします。
  • フルパスの例:app/src/main/assets/my-custom-dark-style-neon-rds.json

ファイル名とパスをプロジェクトに合わせて調整します。

「asset」フォルダーがまだ追加されていない場合は、Android Studioから追加できます (プロジェクトを右クリックして、[New](新規) -> [Folder](フォルダー) ->[Assets Folder](アセットフォルダー) の順に移動します)。フォルダーは手動で生成することもできます。

次のようにスタイルをマップシーンに読み込みます。

private void loadMapStyle() {
    // Place the style content into the "assets" directory.

    // When using HERE Style Editor >= v1.13.0:
    String fileName = "my-custom-dark-style-neon-rds.zip";

    // When using HERE Style Editor < v1.13.0:
    // String fileName = "my-custom-dark-style-neon-rds.json";

    AssetManager assetManager = context.getAssets();
    try {
        assetManager.open(fileName);
    } catch (IOException e) {
        Log.e("CustomMapStylesExample", "Error: Map style not found!");
        return;
    }

    mapView.getMapScene().loadScene("" + fileName, new MapScene.LoadSceneCallback() {
        @Override
        public void onLoadScene(@Nullable MapError mapError) {
            if (mapError == null) {
                // Scene loaded.
            } else {
                Log.d("CustomMapStylesExample", "onLoadScene failed: " + mapError.toString());
            }
        }
    });
}
private fun loadMapStyle() {
    // Place the style content into the "assets" directory.

    // When using HERE Style Editor >= v1.13.0:
    val fileName = "my-custom-dark-style-neon-rds.zip"

    // When using HERE Style Editor < v1.13.0:
    // val fileName = "my-custom-dark-style-neon-rds.json"

    val assetManager = context.assets
    try {
        assetManager.open(fileName)
    } catch (e: IOException) {
        Log.e(TAG, "Error: Map style not found!")
        return
    }

    mapView.mapScene.loadScene("" + fileName) { mapError ->
        if (mapError == null) {
            // Scene loaded.
        } else {
            Log.d(TAG, "onLoadScene failed: $mapError")
        }
    }
}

上のスニペットでは、AndroidのAssetManagerを使用して、*.json/*.zipファイルが想定する場所にあることを確認します。

Screenshot: Another example for a custom map style configuration.

カスタム マップ スタイルを使用することで、アプリを他の地図アプリケーションから非常に効果的に差別化できます。さらに、アプリの現在の状態に基づいてマップ スタイルをすばやく変更し、ユーザーの注意を特定の地図要素に向けさせることなどができます。

A collection of screenshots showing a variety of custom map style configurations.

スタイルのJSON/ZIPファイルまたはアーカイブに対してローカルで変更を行う場合、mapScene.reloadScene()を呼び出すことを検討してください。そうすることで、キャッシュに保存されたデータは使用されず、シーン全体が再ロードされます。

こちらのブログ記事を参照して、HERE Style Editorを使用してカスタムマップデザインを作成する方法の詳細を確認してください。 Style Editorに関するその他のブログ記事は、こちらを参照してください。

色覚異常ビュー

色覚異常ビューを有効にすると、カスタム地図スタイルが色覚障害を持つユーザーにどのように見えるかを確認できます。HERE Style Editorには、これを切り替えられるスイッチがあります。

次の色覚シミュレーションが用意されています。

第一色覚異常 第二色覚異常 第三色覚異常

このビューの例はこちらを参照してください。

サンプルアプリを試す

上記のコードスニペットは、「CustomMapStyles」サンプルアプリ (Java版およびKotlin版) で使用可能です。このサンプルアプリは、優先するプラットフォームのGitHubにあります。


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