交通状況

1 trafficIncidents 行のコードでマップ レイヤー 状態を有効にすることで、地図上の交通事故を視覚化できます。 HERE SDK は trafficFlow 、レイヤーを追加することで現在のトラフィック状況を確認するための別のレイヤーもサポートしています。

また Route、経路 セクションに示されているように、インスタンスに沿ったトラフィックを指定することもできます。

リアルタイムの交通フローとインシデントを地図に表示します

マップ レイヤー状態を有効にする trafficIncidentsと、地図上の交通事故を簡単に視覚化できます。 HERE SDK は、現在のトラフィック状況を確認するための別のレイヤーもサポートしています。 地図上のレイヤーを表示または非表示にする方法については、以下の例を参照してください。

スクリーンショット: 地図上に交通事故が表示されます。

レイヤーを設定すると、地図の表示領域が自動的に更新されます。 そのため、地図をあらゆる方向に自由に移動して、最新の交通事故を確認できます。

多く の状況で、ドライバーは、都市内外での現在の渋滞状況に基づいて最速ルートを探しています。 HERE SDK を使用すると、現在のすべての渋滞を保持しているレイヤーをさまざまな色の線で表示して、渋滞の重大度をリアルタイムで常に更新することができます。 この機能を使用するには、オンライン接続が必要です。また、より多くのデータを消費します。 ただし、交通渋滞ルートは地図のタイルの一部として表示されるため、高性能です。

これらの交通情報は、いくつかのコード行で地図上に表示することも、単独で表示することもできます。

do {
    try mapView.mapScene.setLayerState(layer: MapLayerLite.trafficFlow, newState: LayerStateLite.enabled)
    try mapView.mapScene.setLayerState(layer: MapLayerLite.trafficIncidents, newState: LayerStateLite.enabled)
} catch let mapSceneError {
    print("Failed to enable traffic visualization. Cause: \(mapSceneError)")
}

新しいレイヤー状態の設定は同期的に実行されますが、以前にロードしておく必要がある有効なマップ シーンが必要です。 また、新しいマップ シーンの読み込み中に新しいレイヤーの状態を設定すると、エラーが発生することがあります。 レイヤーを非表示にする場合 LayerStateLite.disabled は、ではなく、で上記のレイヤーを呼び出す LayerStateLite.enabledことができます。

トラフィックフローラインは、次のように色分けされています。

  • 緑 : 通常 の交通状況
  • 黄色 / 黄色 : 渋滞しています
  • 赤 : 交通量が非常に多い
  • 黒 : トラフィックのブロック

トラフィック 例アプリ の一部として、 GitHub で使用例を利用できます。

MapSceneConfig を使用して、複数のレイヤーを新しいマップ シーンで有効にします

を使用してマップ シーンをロードする方が便利な場合 MapSceneConfigLiteがあります。 たとえば、トラフィックインシデント、トラフィックフロー、 および新しいマップ シーンの表示を同時に有効にする場合は、次のように呼び出します。

var mapSceneConfig = MapSceneConfigLite()
mapSceneConfig.mapLayers[MapLayerLite.trafficFlow] = LayerStateLite.enabled
mapSceneConfig.mapLayers[MapLayerLite.trafficIncidents] = LayerStateLite.enabled
mapView.mapScene.loadScene(mapStyle: MapStyleLite.normalDay, sceneConfig: mapSceneConfig, callback: self.onLoadScene)

次に、オプションのコールバックを実装して、シーンの読み込みが成功したかどうかを確認します。

func onLoadScene(errorCode: MapSceneLite.ErrorCode?) {
    if let error = errorCode {
        print("Error: New map scene not loaded: \(error)")
    }
}

HERE mapSceneConfig は、目的のレイヤーと trafficFlow trafficIncidents その新しい状態を保持します。 デフォルトでは、両方のレイヤーの初期状態はです disabled。 新しいマップ シーンをロードする場合 mapSceneConfig 、は、目的のマップスタイルと一緒にパラメータとして渡すことができます。

新しいマップ シーンの設定中に両方のレイヤーを同時に非表示にする場合 .disabled は、では .enabledなく、を使用して上記のレイヤーを呼び出すことができます。 または setLayerState(layer:newState:) 、上記のようにとの同期コールを使用して、マップ レイヤーの状態を個別に制御できます。

TrafficEngine を使用してインシデントをクエリーします

TrafficEngineは、進行中の交通事故に関する詳細情報を取得できます。 経由、 GeoCorridor経由、または GeoBox 経由でルートに沿ってインシデントを検索 GeoCircleできます。

また、複数のオプションを設定して、特定のタイプのインシデントのみを検索することもできます。 その結果、該当する車両タイプ、日付情報、位置情報、ローカライズ可能な説明、概要などの結果が得られます。

まず、 TrafficEngine次のものの新しいインスタンスを作成します。

do {
    try trafficEngine = TrafficEngine()
} catch let engineInstantiationError {
    fatalError("Failed to initialize TrafficEngine. Cause: \(engineInstantiationError)")
}

以下では、の内部で GeoCircle 可能性のあるものを検索します TrafficIncidents

private func queryForIncidents(centerCoords: GeoCoordinates) {
    let geoCircle = GeoCircle(center: centerCoords, radiusInMeters: 1000)
    let trafficIncidentsQueryOptions = TrafficIncidentsQueryOptions()
    // Optionally, specify a language:
    // If the language is not supported, then the default behavior is applied and
    // the language of the country where the incident occurs is used.
    // trafficIncidentsQueryOptions.languageCode = LanguageCode.enUs
    trafficEngine.queryForIncidents(inside: geoCircle,
                                    queryOptions: trafficIncidentsQueryOptions,
                                    completion: onTrafficIncidentsFound);
}

// TrafficIncidentQueryCompletionHandler to receive traffic items.
func onTrafficIncidentsFound(error: TrafficQueryError?,
                             trafficIncidentsList: [TrafficIncident]?) {
    if let trafficQueryError = error {
        print("TrafficQueryError: \(trafficQueryError)")
        return
    }

    // If error is nil, it is guaranteed that the list will not be nil.
    var trafficMessage = "Found \(trafficIncidentsList!.count) result(s). See log for details."
    let nearestIncident = getNearestTrafficIncident(currentGeoCoords: tappedGeoCoordinates,
                                                    trafficIncidentsList: trafficIncidentsList!)
    trafficMessage.append(contentsOf: " Nearest incident: \(nearestIncident?.description.text ?? "nil")")
    showDialog(title: "Nearby traffic incidents",
               message: trafficMessage)

    for trafficIncident in trafficIncidentsList! {
        print(trafficIncident.description.text)
    }
}

見つかった各 TrafficIncident項目について、その説明を記録します。 ドイツで検索する場合、デフォルトではドイツ語で結果が表示されます。 次のように表示されます。

Berlin, Sachsendamm zwischen Gotenstraße und Priesterweg Fahrbahn auf einen Fahrstreifen verengt, Staugefahr, Bauarbeiten, bis voraussichtlich 20.02.2028

別の言語を指定することもできます。たとえば、次のように設定します。

trafficIncidentsQueryOptions.languageCode = LanguageCode.enUs

trafficIncidents は、お問い合わせの場所を示すためにトラフィックのアイコンと行をレンダリングするレイヤーです。

TrafficIncident には GeoPolyline 、その場所を示すが含まれています。 地図上のタップした場所とポリライン に含まれている地理座標を比較することで、地図上のタップした場所に最も近いインシデントを見つけることができます。

private func getNearestTrafficIncident(currentGeoCoords: GeoCoordinates,
                                       trafficIncidentsList: [TrafficIncident]) -> TrafficIncident? {
    if trafficIncidentsList.count == 0 {
        return nil
    }

    // By default, traffic incidents results are not sorted by distance.
    var nearestDistance: Double = Double.infinity
    var nearestTrafficIncident: TrafficIncident!
    for trafficIncident in trafficIncidentsList {
        // In case lengthInMeters == 0 then the polyline consistes of two equal coordinates.
        // It is guaranteed that each incident has a valid polyline.
        for geoCoords in trafficIncident.location.polyline.vertices {
            let currentDistance = currentGeoCoords.distance(to: geoCoords)
            if currentDistance < nearestDistance {
                nearestDistance = currentDistance
                nearestTrafficIncident = trafficIncident
            }
        }
    }

    return nearestTrafficIncident
}

もちろん、を追加する MapPolylineことで、自分自身でインシデントのポリライン をマップに表示することもできます。 MapMarker インシデントのタイプに応じて、別のイメージを選択するように独自のアイコンを追加することもできます。

」に一致する結果は 件です

    」に一致する結果はありません