ガイド変更履歴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では、JSONファイルまたはZIPアーカイブに設定されたファイルを指定できます。

  • HERE Style Editor 1.13.0以降を使用している場合は、次の手順を実行します。
  • 生成されたtar.gzアーカイブを抽出し、ZIPアーカイブに再パッケージします。Xcodeのプロジェクトナビゲーターから新しいフォルダーを生成します。ドラッグアンドドロップなどでカスタムスタイル用のZIPファイルをそのディレクトリにコピーします。または、すべてのコンテンツを含む新しいフォルダー全体をプロジェクトにドラッグアンドドロップします。
  • 古いバージョンのHERE Style Editorを使用している場合は、次の手順を実行します。
  • Xcodeのプロジェクトナビゲーターから新しいフォルダーを生成します。カスタムスタイル用に生成されたJSONファイルをドラッグアンドドロップなどで、そのディレクトリにコピーします。または、すべてのコンテンツを含む新しいフォルダーをプロジェクトに完全にドラッグアンドドロップします。

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

private func loadCustomMapStyle() {
    let styleResourceString = getResourceStringFromBundle(filename: "my-custom-dark-style-neon-rds",
    // When using HERE Style Editor >= v1.13.0:
                                                         type: "zip")
    // When using HERE Style Editor < v1.13.0:
    //                                                   type: "json")

    // Load the map scene using the path to the JSON / ZIP resource.
    mapView.mapScene.loadScene(fromFile: styleResourceString, completion: onLoadScene)
}

private func getResourceStringFromBundle(filename: String, type: String) -> String {
    let bundle = Bundle.main
    guard let resourceUrl = bundle.url(forResource: filename, withExtension: type) else {
        fatalError("Error: Resource not found!")
    }

    return resourceUrl.path
}

// Completion handler when loading a map scene.
private func onLoadScene(mapError: MapError?) {
    guard mapError == nil else {
        print("Error: Map scene not loaded, \(String(describing: mapError))")
        return
    }
}

上に示したスニペットでは、*.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を使用してカスタムマップデザインを作成する方法の詳細を確認してください。その他の関連ブログ記事はこちらを参照してください。

色覚異常ビュー

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

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

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

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

サンプルアプリを試す

上に示したコードスニペットは「CustomMapStyles」サンプルアプリから取得できます。このサンプルアプリは、優先するプラットフォームの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); })();