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

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

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

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

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

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

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

func loadAndProcessSegmentData() {
    // The necessary SegmentDataLoaderOptions need to be turned on in order to find the requested information. It is recommended to turn on only the fields that you are interested in.
    var segmentDataLoaderOptions = SegmentDataLoaderOptions()
    segmentDataLoaderOptions.loadBaseSpeeds = true
    segmentDataLoaderOptions.loadRoadAttributes = true

    let radiusInMeters = 500.0

    guard let startGeoCoordinates = startGeoCoordinates else {
        showDialog(title: "SegmentDataLoader", message: "You need to add a route beforehand as we use the start coordinates to load segment data.")
        return
    }

    do {
        let segmentIds = try segmentDataLoader?.getSegmentsAroundCoordinates(startGeoCoordinates, radiusInMeters: radiusInMeters)

        guard let segmentDataLoader = segmentDataLoader,
              let segmentIds = segmentIds else {
            print("segmentDataLoader is nil")
            return
        }

        for segmentId in segmentIds {
            let segmentData = try segmentDataLoader.loadData(segment: segmentId, options: segmentDataLoaderOptions)

            if (segmentData.spans.isEmpty) {
                print("SegmentSpanDataList is empty")
                continue
            }

            let segmentSpanDataList = segmentData.spans

            for span in segmentSpanDataList {
                print("Physical attributes of \(span) span.")
                print("Private roads: \(String(describing: span.physicalAttributes?.isPrivate))")
                print("Dirt roads: \(String(describing: span.physicalAttributes?.isDirtRoad))")
                print("Bridge: \(String(describing: span.physicalAttributes?.isBridge))")
                print("Tollway: \(String(describing: span.roadUsages?.isTollway))")
                print("Average expected speed: \(String(describing: span.positiveDirectionBaseSpeedInMetersPerSecond))")
            }
        }
    } catch let MapDataLoaderError {
        print("Error loading segment data: \(MapDataLoaderError)")
    }
}

この実装例は、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); })();