マップデータにリアルタイムでアクセスする
地図セグメントのデータにアクセスして取得するには、SegmentDataLoaderを使用できます。制限速度や道路属性など、OCMマップで使用可能なマップデータにアクセスするためのインターフェースを提供します。
SegmentDataLoaderではまず、データがプリフェッチされた (キャッシュされた) かどうかを確認し、使用できない場合はリモートサーバーからのダウンロードを試行します。操作は同期しており、呼び出し元のスレッドをブロックします。メインスレッドから呼び出された場合はメインスレッドをブロックします。最適なパフォーマンスを得るには、バックグラウンドスレッドからこれらのメソッドを呼び出すか、作業領域周辺のマップデータをプリフェッチすることが推奨されています。
getSegmentsAroundCoordinates()を呼び出すことにより、指定した位置に近いセグメントを表すOCMSegmentIdオブジェクトのリストを取得できます。取得すると、これらのIDは、道路のPhysicalAttributesやSegmentSpeedLimitなどの構造的属性および規制上の属性を含む詳細なセグメントデータを読み込むために使用できます。
位置情報に基づくセグメントクエリを使用する場合に最適な結果を得るには、未加工の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」サンプルアプリで確認できます。
26 日前の更新










