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

マップデータにリアルタイムでアクセスする

SegmentDataLoaderはNavigateライセンスでのみ使用できます。

地図セグメントのデータにアクセスして取得するには、SegmentDataLoaderを使用できます。制限速度や道路属性など、OCMマップで使用可能なマップデータにアクセスするためのインターフェースを提供します。

これはこの機能のベータリリースであるため、いくつかのバグや予期しない動作が発生する可能性があります。関連するAPIは、廃止のプロセスを経ずに、新しいリリースに変更される可能性があります。

  • SegmentDataLoaderはまず、データがインストールされているか、プリフェッチされているか、キャッシュされているかを確認し、使用できない場合は、要求されたタイルのオンラインでのダウンロードを試行します。
  • 操作は同期しており、呼び出し元のスレッドをブロックします。メインスレッドから呼び出された場合はメインスレッドをブロックします。最適なパフォーマンスを得るには、バックグラウンドスレッドからこれらのメソッドを呼び出すか、作業領域周辺のマップデータをプリフェッチすることが推奨されています。

getSegmentsAroundCoordinates()を呼び出すことにより、指定した位置に近いセグメントを表すOCMSegmentIdオブジェクトのリストを取得できます。取得すると、これらのIDは、道路のPhysicalAttributesSegmentSpeedLimitなどの構造的属性および規制上の属性を含む詳細なセグメントデータを読み込むために使用できます。

位置情報に基づくセグメントクエリを使用する場合に最適な結果を得るには、未加工のGPS座標ではなく、マップマッチングした座標の使用を検討してください。MapMatcherは位置情報信号を道路ネットワークに合わせることができるため、正しい道路位置情報のセグメントデータを取得できます。MapMatcherはすでに一定のセグメント情報を提供していますが、完全なセグメントデータが必要な場合は、SegmentDataLoaderを使用してマップマッチングした座標を使用できます。セグメントデータをクエリする前に位置情報の精度を向上させる方法の詳細については、「マップマッチングの場所」を参照してください。

public void loadAndProcessSegmentData() {

    List<OCMSegmentId> segmentIds;
    SegmentData segmentData;

    // The necessary SegmentDataLoaderOptions need to be turned on in order to find the requested information.
    // It is recommended to turn on only the data you are interested in by setting the corresponding fields to true.
    SegmentDataLoaderOptions segmentDataLoaderOptions = new SegmentDataLoaderOptions();

    segmentDataLoaderOptions.loadBaseSpeeds = true;
    segmentDataLoaderOptions.loadRoadAttributes = true;

    double radiusInMeters = 500;


    try {
        segmentIds = segmentDataLoader.getSegmentsAroundCoordinates(startGeoCoordinates, radiusInMeters);

        for (OCMSegmentId segmentId : segmentIds) {
            segmentData = segmentDataLoader.loadData(segmentId, segmentDataLoaderOptions);

            List<SegmentSpanData> segmentSpanDataList = segmentData.getSpans();

            if (segmentSpanDataList == null) {
                Log.e(TAG, "SegmentSpanDataList is null");
                continue;
            }

            for (SegmentSpanData span : segmentSpanDataList) {
                Log.d(TAG, "Physical attributes of " + span.toString() + " span.");
                Log.d(TAG, "Private roads: " + span.getPhysicalAttributes().isPrivate);
                Log.d(TAG, "Dirt roads: " + span.getPhysicalAttributes().isDirtRoad);
                Log.d(TAG, "Bridge: " + span.getPhysicalAttributes().isBridge);
                Log.d(TAG, "Tollway: " + span.getRoadUsages().isTollway);
                Log.d(TAG, "Average expected speed: " + span.getPositiveDirectionBaseSpeedInMetersPerSecond());
            }
        }
    } catch (MapDataLoaderException e) {
        throw new RuntimeException(e);
    }
}
fun loadAndProcessSegmentData() {
        val segmentIds: MutableList<OCMSegmentId>
        var segmentData: SegmentData

        // The necessary SegmentDataLoaderOptions need to be turned on in order to find the requested information.
        // It is recommended to turn on only the data you are interested in by setting the corresponding fields to true.
        val segmentDataLoaderOptions = SegmentDataLoaderOptions()

        segmentDataLoaderOptions.loadBaseSpeeds = true
        segmentDataLoaderOptions.loadRoadAttributes = true

        val radiusInMeters = 500.0

        if (startGeoCoordinates == null) {
            Toast.makeText(context, "You need to add a route beforehand as we use the start coordinates to search for segment data.", Toast.LENGTH_LONG).show()
            return
        }

        Toast.makeText(context, "The app will now load attributes of a map segment. For more details check the logs.", Toast.LENGTH_LONG).show()

        val startGeoCoordinatesNonNull = startGeoCoordinates ?: return logError("StartGeoCoordinates is null. Cannot load segment data.")

        segmentIds = segmentDataLoader.getSegmentsAroundCoordinates(startGeoCoordinatesNonNull, radiusInMeters)

        for (segmentId in segmentIds) {
            segmentData = segmentDataLoader.loadData(segmentId, segmentDataLoaderOptions)

            val segmentSpanDataList = segmentData.spans

            for (span in segmentSpanDataList) {
                Log.d(TAG, "Physical attributes of $span span.")
                Log.d(TAG, "Private roads: ${span.physicalAttributes?.isPrivate}")
                Log.d(TAG, "Dirt roads: ${span.physicalAttributes?.isDirtRoad}")
                Log.d(TAG, "Bridge: ${span.physicalAttributes?.isBridge}")
                Log.d(TAG, "Tollway: ${span.roadUsages?.isTollway}")
                Log.d(TAG, "Average expected speed: ${span.positiveDirectionBaseSpeedInMetersPerSecond}")
            }
        }
    }

この実装例は、GitHubの「RoutingWithAvoidanceOptions」サンプルアプリで確認できます。


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