UI ビルディング ブロックを追加する
このセクションでは、HERE SDKのサービスの一部としてすでに利用可能なさまざまなUI要素と関連するコードスニペットについて説明します。運転操作手順や運転操作アイコンアセットから、視覚的なルート表現まで、これらの要素をアプリケーションインターフェースに統合する方法を確認します。今後、再利用可能なUIビルディングブロックの追加が計画されています。
運転指示を取得する
Routeオブジェクトの各Sectionには、目的地に到達するためにユーザーが従う必要がある運転指示が含まれています。それぞれの右左折では、Maneuverオブジェクトに運転操作を実行する必要がある場所とアクションが含まれます。アクションは、「出発」などのアクションや「左折」などの指示を示す場合があります。
let sections = route.sections
for section in sections {
logManeuverInstructions(section: section)
}
セクションごとの運転指示にアクセスするコードは次のとおりです。
private func logManeuverInstructions(section: heresdk.Section) {
print("Log maneuver instructions per route section:")
let maneuverInstructions = section.maneuvers
for maneuverInstruction in maneuverInstructions {
let maneuverAction = maneuverInstruction.action
let maneuverLocation = maneuverInstruction.coordinates
let maneuverInfo = "\(maneuverInstruction.text)"
+ ", Action: \(maneuverAction)"
+ ", Location: \(maneuverLocation)"
print(maneuverInfo)
}
}
これは、ルート全体を書面で説明する運転指示リストを簡単に作成するのに役立ちます。たとえば、ManeuverAction列挙型を使用して、独自のルート検索エクスペリエンスを構築できます。
注 (Navigateにのみ適用)ナビゲーション中の
Maneuver指示テキスト (maneuverInstruction.text) は、NavigatorまたはVisualNavigatorから取得された場合は空になります。これには、Routeインスタンスから取得された場合のローカライズされた指示のみが含まれます。ManeuverAction列挙型は、ナビゲーション中に視覚的なインジケーターを表示するために使用されることが想定されており、テキストによる指示は、移動を開始する前に運転指示をプレビューするリストに適しています。反対に、
maneuverInstruction.roadTexts、maneuverInstruction.nextRoadTexts、maneuverInstruction.exitSignTextsは、ナビゲーション中に経路誘導運転操作の一部として表示されることを意図しているため、ManeuverがNavigatorまたはVisualNavigatorから取得された場合には空になりません。Routeインスタンスから取得した場合は、これらの属性は常に空になります。
注 (Exploreにのみ適用)属性
maneuverInstruction.roadTexts、maneuverInstruction.nextRoadTexts、maneuverInstruction.exitSignTextsはナビゲーション中に経路誘導運転操作の一部として表示されることを目的としているため、Navigateなどのライセンスを持つユーザーのみが使用できます。Routeインスタンスから取得した場合は、これらの属性は常に空になります。
「APIリファレンス」では利用可能な運転操作アクションの概要を確認できます。
以下の表は、すべてのManeuverActionアイテムとプレビューの説明およびアセットの例をまとめたものです。HERE SDK 自体には運転操作アイコンが付属していないことに注意してください。アセットは、オープンソースのHERE Icon Libraryの一部として、さまざまな密度のSVGまたはソリッドPNGとして利用できます。
利用可能な運転操作アクションは、「APIリファレンス」に記載されている順序で並べ替えられています。
現時点では、leftRoundaboutPassとrightRoundaboutPassのHEREアセットはSVGとしてのみ利用可能であり、一部の運転操作アセットはサブフォルダー「wego-fallback-roundabout」でのみ利用できます。
道路標識アイコンを取得する
iconProvider.createRoadShieldIcon(...)を使用すると、「A7」や「US-101」などの道路番号がマップ ビューにすでに表示されているように、非同期でBitmapを作成できます。
道路標識アイコンの作成はオフラインで行われ、インターネット接続は必要ありません。アイコンの作成に必要なデータは、Route自体から取得されますが、手動で入力することもできます。
運転操作プレビューに表示される道路標識の実装例は「Rerouting」サンプルの一部です。入手するには、GitHubのサンプルアプリリポジトリにアクセスします。これにはHERE SDK (Navigate) が必要ですが、IconProviderのコードは他のライセンスでも使用でき、たとえば、ルートプレビューの一部として道路標識アイコンを表示できます。
地図にルートを表示する
以下のコードスニペットは、出発地と目的地を含むルートの各座標間に描画されるMapPolylineを使用して地図にルートを表示する方法を示しています。
let routeGeoPolyline = route.geometry
let widthInPixels = 20.0
let polylineColor = UIColor(red: 0, green: 0.56, blue: 0.54, alpha: 0.63)
do {
let routeMapPolyline = try MapPolyline(geometry: routeGeoPolyline,
representation: MapPolyline.SolidRepresentation(
lineWidth: MapMeasureDependentRenderSize(
sizeUnit: RenderSize.Unit.pixels,
size: widthInPixels),
color: polylineColor,
capShape: LineCap.round))
mapView.mapScene.addMapPolyline(routeMapPolyline)
} catch let error {
fatalError("Failed to render MapPolyline. Cause: \(error)")
}
mapView.mapScene.addMapPolyline(routeMapPolyline)
以下の最初のスクリーンショットは、追加の経由地のないルート、つまりルートセクションが1つだけのルートを示しています。出発地と目的地は、緑色の丸のマップ マーカーで示されています。円で囲まれたオブジェクトを描画するコードはここには示されていませんが、興味があればサンプルのソースコードから確認できます。
2 番目のスクリーンショットは上記と同じルートを示していますが、赤丸のマップ マーカーで示された 2 つの追加の stopover 経由地があります。このため、ルートには3つのルートセクションが含まれています。
stopoverで経由地を追加すると、ルートが複数のセクションに分割され、ルートはこれらのポイントを通過して、各ポイントで運転操作指示を生成するように強制されます。
内部的には、MapPolylineのレンダリングが非常に長いルート向けに最適化されていることに注意してください。たとえば、ズームレベルが高ければすべての座標をレンダリングする必要はありませんが、ズームレベルが低いとルート全体が表示されません。このためのアルゴリズムは公開されていませんが、基本原理はHEREのflexible-polylineオープンソースプロジェクトで見ることができます。
ルートにズームする
ユースケースによっては、計算されたルートにズームすると便利な場合があります。カメラクラスには、ルートが収まるようにビューポートを調整する便利なメソッドが用意されています。
let routeGeoBox = route?.boundingBox
camera.lookAt(area: routeGeoBox!,
orientation: GeoOrientationUpdate(bearing: nil, tilt: nil))
ここでは、ルートオブジェクトの囲みバウンディング ボックスを使用します。これを使用すると、カメラを即座に更新できます。指定されたバウンディング長方形がビューポートに正確に収まるように、カメラのズームレベルとターゲット ポイントが変更されます。さらに、方向を指定してさらに多くのカメラパラメーターを指定することもできます。ここではデフォルト値をそのまま使用します。lookAt()を呼び出すとビューが即座に変更されることに注意してください。
ほとんどのユースケースでは、アニメーションを使用してルートにズームすると、ユーザーエクスペリエンスが向上します。以下に、GeoBoxに50ピクセルの追加のパディングを加えてズームする例を示します。
func animateToRoute(route: Route) {
// Untilt and unrotate the map.
let bearing: Double = 0
let tilt: Double = 0
// We want to show the route fitting in the map view with an additional padding of 50 pixels.
let origin:Point2D = Point2D(x: 50.0, y: 50.0)
let sizeInPixels:Size2D = Size2D(width: mapView.viewportSize.width - 100, height: mapView.viewportSize.height - 100)
let mapViewport:Rectangle2D = Rectangle2D(origin: origin, size: sizeInPixels)
// Animate to the route within a duration of 3 seconds.
let update:MapCameraUpdate = MapCameraUpdateFactory.lookAt(area: route.boundingBox, orientation: GeoOrientationUpdate(GeoOrientation(bearing: bearing, tilt: tilt)), viewRectangle: mapViewport)
let animation: MapCameraAnimation = MapCameraAnimationFactory.createAnimation(from: update, duration: TimeInterval(3), easing: Easing(EasingFunction.inCubic))
mapView.camera.startAnimation(animation)
}
CameraKeyframeTracksサンプルアプリでは、これがどのように見えるかを示しています。
ルートに交通情報を表示する
ルート上に交通状況を視覚化する方法については、交通流に沿ってポリラインをレンダリングする方法やカスタムの交通情報オーバーレイなど、「ルート上の交通状況を視覚化する」参照してください。
7 日前の更新
















































