カメラを使用
HERE SDK では、マップのビューを変更する方法がいくつか用意されています。 マップのスタイルを使用してマップの外観を変更できますが、カメラを使用してさまざまな視点からマップを表示できます。
たとえば、 HERE SDK では、ターゲットの位置の設定、カメラのチルト、ズームイン / ズームアウト、または方位角の設定を行うことができます。
注
簡単に確認できます
- マップのビューを操作するには、
mapView.camera
によって返されたMapCamera
を使用します。 -
camera.lookAt(point: GeoCoordinates(latitude: 52.530932, longitude: 13.384915))
を呼び出して、新しいターゲットの場所を設定します。 これにより、マップ ビューがただちに新しい場所に切り替わります。 - マップ ビュー の現在の中心位置を取得するには、
mapView.camera.state.targetCoordinates
を呼び出します。 - 距離をメートル単位
camera.lookAt(point: GeoCoordinates(latitude: 52.373556, longitude: 13.114358), zoom: MapMeasure(kind: .distance, value: 1000 * 7))
で設定して、マップをズームします。 カメラの State
プロパティから現在の距離を取得します。 GeoOrientationUpdate()
を設定 して、カメラのチルト角度およびベアリング角度を指定します。 -
MapCamera.principalPoint
を使用してトランスフォームの中心を設定し、マップ ビューを中心とするデフォルトのピボットポイントを変更します。 - 現在表示されている領域の境界をから取得
camera.boundingBox
します。 camera.lookAt(area: geoBox, orientation: GeoOrientationUpdate())
を呼び出して、表示する領域の境界を設定します。 - マップを移動 :
MapCameraAnimationFactory
を使用して、 A ~ B の基本的なアニメーションを実行します。 オーバーロードされたメソッドのいずれかを使用してアニメーションをカスタマイズします。たとえば、高度なアニメーションには flyTo()
を使用します。
デフォルトでは、カメラはマップの中央に配置されます。 バードビューから見てまっすぐ下を見ると、マップは 北を向くになっています。 これは、デバイスの上端がマップの北を指していることを意味します。
カメラの位置を変更
アニメーションを使用してマップを新しい場所に移動する場合は、MapCameraAnimationFactory
の flyTo()
メソッドを使用します。 新しいマップの場所に瞬時に切り替えたい場合は、新しいターゲットを設定して切り替えます。
新しいカメラターゲットを設定することで、カメラの位置を変更し、マップ ビューの中央に表示される位置を効果的に変更できます。 このメソッドlookAt()
は、さまざまなオーバーロードで使用できます。 例をいくつか示します。
camera.lookAt(point: GeoCoordinates(latitude: 52.530932, longitude: 13.384915))
let distanceInMeters = MapMeasure(kind: .distance, value: 1000 * 2)
camera.lookAt(point: GeoCoordinates(latitude: 52.530932, longitude: 13.384915),
zoom: distanceInMeters)
let geoBox = GeoBox(southWestCorner: GeoCoordinates(latitude: 52.373556, longitude: 13.114358),
northEastCorner: GeoCoordinates(latitude: 52.611022, longitude: 13.479493))
let orientation = GeoOrientationUpdate(bearing: 0,
tilt: 45)
camera.lookAt(area: geoBox,
orientation: orientation)
カメラの向き ( 方位、傾き ) を変更しても、マップの位置は変更されません。
注 : 重要
HERE SDK で は、 [0,22] の範囲の専用のズームレベルもサポートされており、必要な詳細レベルをすばやく達成できます。 カメラのメソッドzoomTo()
を呼び出し てズーム レベルを設定し、カメラのプロパティState
から現在のズーム レベルにアクセスします。 重要 : ズーム レベルがDouble
として設定されています。タイプDouble
のdistanceInMeters
パラメーターと混合しないでください。
カメラを変更すると、マップ ビューの遠近法をプログラムで変更することのみが可能ですが、マップをズームしたり、回転したり、マップを傾けたりするためのジェスチャを実行する場合と同様に、マップ ビュー自体を直接制御することはできません。 マップを直接操作するために使用できるジェスチャの概要については、「ジェスチャ」セクションを参照してください。
注 : 情報
MapCamera
は、常にState
で定義済みです 。 たとえば、State
は現在のターゲットの場所を提供しています。 このターゲット位置は、デフォルトの主な点が変更されていない限り、マップ ビューの現在の中心を示します ( 以下を参照 ) 。
または、凹形のリボンアニメーションが表示されている場所に飛びます。
private func flyTo(target: GeoCoordinates) {
let geoCoordinatesUpdate = GeoCoordinatesUpdate(target)
let durationInSeconds: TimeInterval = 3
let animation = MapCameraAnimationFactory.flyTo(target: geoCoordinatesUpdate,
bowFactor: 1,
duration: durationInSeconds)
mapView.camera.startAnimation(animation)
}
カメラの回転
カメラを使用すると、マップを直接回転することはできませんが、代わりにカメラの向きを変更できます。 GeoOrientationUpdate()
のパラメータbearing
を変更する と、マップを回転する場合と同じ効果が得られます。
地図の向きは通常、方位角で指定します。 「ベアリング」とは、北から時計回りに度でカウントされるナビゲーション用語です。
図 : ベアリングの方向。 デフォルトでは、カメラのベアリング値は 0 ° です。 上の図に示すように方位角を 45 ° に設定すると、カメラが 反時計回りに回転するとマップが目に見え マップ上で方位の方向が新しい上向きになり、デバイスの上端を指します。 これは、ハイキング中に特定の方向に紙のマップを保持して回転するのと似ています。 マップの上端が目的の方向を向いている場合は、自分自身の向きを変更する方が簡単です。 ただし、これが必ずしも真の北の方向であるとは限りません( bearing=0 ° )。
現在のカメラの向きに関係なく、方位軸は常に地面に対して垂直であり、カメラを通過することに注意してください。
次のコードは、カメラを 90 ° 回転させます。
let orientation = GeoOrientationUpdate(bearing: 90,
tilt: 0)
let distanceInMeters = MapMeasure(kind: .distance, value: 1000 * 7)
mapView.camera.lookAt(point: GeoCoordinates(latitude: 52.373556, longitude: 13.114358),
orientation: orientation,
zoom: distanceInMeters)
実際には、ビューアではマップを 90 ° 左に回転させて表示できます。
カメラを傾斜
このカメラを使用して、 2Dマップの平坦な表面を 3D の視点に変換し、たとえば、地平線に向かって見える可能性のある長距離道路を確認することもできます。 デフォルトでは、カメラは傾斜していません(チルト = 0 ° )。
カメラのチルト値に加えて、カメラのベアリング角度(上記を参照)を操作できます。 HERE 傾斜値を変更した場合の影響を示します。 以下の図を参照して、利用可能なカメラ軸を確認してください。
傾き値が 0 ° の場合、カメラの光学軸が地面に垂直になっています。 チルト角度は常にこの垂直軸から計算されます。 チルト角はカメラの光軸に関連しています。
図に示されているように、カメラを 45 ° 傾けると、カメラの鳥の視点が 3D の視点に変わります。 カメラのチルト値のみを変更するには、次のコードを使用します。
let orientation = GeoOrientationUpdate(bearing: 0,
tilt: 45)
let distanceInMeters = MapMeasure(kind: .distance, value: 1000 * 7)
mapView.camera.lookAt(point: GeoCoordinates(latitude: 52.373556, longitude: 13.114358),
orientation: orientation,
zoom: distanceInMeters)
次の図に示すように、チルト角はターゲット位置の垂直軸から計算されます。 観測者の真下を直進する方向は 直下視と呼ばれています。 チルト値を設定すると、カメラが効果的に移動し、カメラのターゲットに焦点を当て続けます。
各チルト値は、デルタとしてではなく絶対値として適用されることに注意してください。つまり、後続のチルト値は常にカメラのデフォルトの位置から適用され、前の位置からは適用されません。 したがって、同じチルト値を複数回設定しても、カメラのチルト軸は変更されません。 これは、ほとんどのカメラ操作で共通です。 範囲外の値はクランプされます。
図 : マップを傾ける すべての軸を同時に操作できます。
カメラを傾けたときに、以下に示すようにベアリング値を変更すると、異なる結果が生じることに注意してください。 傾斜したカメラでは、方位値を設定するとターゲットの位置が異なり、傾斜していないカメラではターゲットの位置が維持されます。
図 : ベアリングおよびチルト用のカメラの軸。 既定では、マップのピボットポイントまたは主要ポイントはマップ ビューの中央に配置されます。 ターゲット座標がマップ ビュー内に配置されるポイントを指定します。 新しい主点を設定すると、マップがただちに移動し、現在のターゲット座標が新しい主点にレンダリングされます。 マップビューの原点を左上 (0, 0) から基準にしてピクセル単位で設定されます。
注
主なポイントは、すべてのプログラムマップの変形 ( 回転、軌道、チルト、ズーム ) に影響し、 2 本の指でのパンジェスチャによってマップを傾斜させます。 ピンチ回転などのその他のジェスチャには影響がありません。
通常は、ターン・バイ・ターンナビ (矢印ナビ)実行中にトランスフォームセンターを少し下げるなど、主要なポイントを 1 回だけ設定します。これにより、ユーザーは前方の道路をより多く見ることができます。 これを行うには、マップ ビューのピクセルサイズ ( レイアウトとデバイスの画面サイズに基づいて ) を取得し、mapViewHeightInPixels
で、高さを 3/4 下げて 0.75 倍にする必要があります。 次の例を参照してください。
let scaleFactor = UIScreen.main.scale
let mapViewWidthInPixels = Double(mapView.bounds.width * scaleFactor)
let mapViewHeightInPixels = Double(mapView.bounds.height * scaleFactor)
let newTransformCenter = Point2D(x: mapViewWidthInPixels / 2, y: mapViewHeightInPixels * 0.75)
camera.principalPoint = newTransformCenter
cameraTargetView.center = CGPoint(x: newTransformCenter.x / Double(scaleFactor),
y: newTransformCenter.y / Double(scaleFactor))
print("New transform center: \(newTransformCenter.x), \(newTransformCenter.y)")
上記のコード スニペットは、現在のマップの中央を画面に表示されているマップの 3/4 だけ下に移動する新しい主要ポイントを設定します。 設定すると、以降のすべてのマップ操作がこの新しい主要ポイントを中心にピボットされます。 たとえば、プログラムでマップを回転する場合、マップは常に主軸を中心に回転します。
上の例で cameraTargetView
は、主なポイントを中心にしてカスタムをレンダリングする方法についても説明します。この例の完全なコードは、 カメラ サンプルアプリで確認できます。