iOS 開発者ガイド for SDK

地図

iOS for SDK のコア機能 は、マッピングです。 このセクションで説明する主な概念には、 iOS アプリケーションへのマップの追加、マップによって表示される場所の変更、およびそのプロパティの変更が含まれます。 マッピング API の主なコンポーネントは NMAMapView です。このコンポーネントは、 Cocoa Touch フレームワークと UIView サブクラスとして統合されています。 NMAMapView マップおよびさまざまなプロパティを表示するビューを表します。 NMAMapView は iOS Cocoa Touch フレームワーク UIView から派生したもので、その一部です。

注 : 簡単な地図アプリケーションを作成 するには、「クイックスタート」セクションを参照してください。

マップをアプリケーションに統合する最初の手順は、 Interface Builder を使用して View Controller .xib ファイルまたはアプリケーションのストーリーボードに NMAMapView を挿入することです。 または NMAMapView 、次のようにプログラムで View Controller に追加することもできます。

- (void)viewDidLoad
{
  mapView = [[NMAMapView alloc] initWithFrame:self.view.frame];
  [self.view addSubview:mapView];
}

NMAMapView このクラスは、すべてのユーザーの操作をタッチジェスチャの形式で処理します。 サポートされているジェスチャの種類の詳細については、「マップジェスチャ」セクションを参照してください。

GitHub でのマップレンダリングの例

この機能を示す例について は、 https://github.com/heremaps/ (Obj-C) および https://github.com/heremaps/ (Swift) を参照してください。

NMAMapView の操作

NMAMapView が初期化されると、さまざまな方法で操作および操作できます。 の主な属性に NMAMapView は、その向き、傾き、地理的中心 ()geoCenter、およびズーム レベル () がありzoomLevelます。 これらのプロパティを使用 NMAMapView して、表示をカスタマイズできます。 たとえば、カナダのバンクーバーのビューを表示する方法を次のコードで示します。

NMAGeoCoordinates *geoCoordCenter = [[NMAGeoCoordinates alloc]
  initWithLatitude:49.260327 longitude:-123.115025];
[self.mapView setGeoCenter:geoCoordCenter withAnimation:NMAMapAnimationNone];
前のコードでは、次のようになり
  • [NMAGeoCoordinates] 新しい地図センターの地理的な場所は(id)initWithLatitude:(double)aLatitude longitude:(double)aLongitude 、メソッドを呼び出すことによって作成されます。
  • マップの中心を設定する場合、 NMAMapAnimationLinear または NMAMapAnimationBow 列挙型 (enum) 値を animation パラメータに渡すことで、トランジションをアニメーション化できます。 NMAMapAnimationNone 値を使用してアニメーションを抑制することもできます。

これらのイベントの開始および終了は、 NMAMapView デリゲートプロパティにオブジェクトを割り当てることによって監視できます。 オブジェクトは NMAMapViewDelegate 、受け取るイベントに対応するプロトコルのメソッドを実装する必要があります。 このデリゲートを使用 して、マップ オブジェクトの選択を検出することもできます。

注 : 最適なパフォーマンスを得るには、作成後にマップのサイズを変更しないでください。 サイズを変更する必要がある場合は、使用する最大サイズのマップを作成し、後で縮小します。

地図投影モード

デフォルトでは、地図は地球投影法モードに設定されています。 projectionType プロパティを設定することで、メルカトル図法を使用するように変更できます。 例 :
mapView.projectionType = NMAProjectionTypeMercator;
カスタムラスタタイルなどの特定の種類のマップ情報を予想どおりに表示する必要がある場合は、投影法モードを設定すると便利です。
図 1. 地球儀投影
図 2. メルカトル図法

スナップショットをマップします

NMAMapView このクラスは、マップのスナップショットを作成するためのクラスメソッドおよびインスタンスメソッドを提供します。 これらのメソッドを使用 すると、開発者は、 HERE SDK の最新データを使用する小さな静的マップ ( サムネイルなど ) を作成できます。
  • +(void)snapshotWithGeoCoordinates:(NMAGeoCoordinates*)coordinates
                zoomLevel:(float)zoom
                orientation:(float)orientation
                size:(CGSize)size
                block:(void (^)(UIImage *snapshot))resultBlock; 
  • -(void)snapshotWithBlock:(void (^)(UIImage *snapshot))resultBlock;
これらのメソッドの使用方法の詳細については、 API リファレンス を参照してください。

NMAMapView のプロパティ

次の例は、の一部のプロパティの操作方法を示し NMAMapViewています。

地図の中央

地図の中央によって、表示する地理的領域が決まります。 NMAMapView geoCenter プロパティを使用して読み取り、いずれかの setGeoCenter: メソッドを使用して設定できます。 タイプはです NMAGeoCoordinates

// Move the map to London
NMAGeoCoordinates *geoCoordCenter = [[NMAGeoCoordinates alloc]
initWithLatitude:51.51 longitude:-0.11];
[self.mapView setGeoCenter:geoCoordCenter withAnimation:NMAMapAnimationNone];

ズーム レベル

地図に表示される地理的領域のサイズは、ズーム レベルを変更して制御できます。 ズーム レベルの範囲は NMAMapView::minimumZoomLevelNMAMapViewMaximumZoomLevelで、ズーム値が高いほど地面に近づきます。 次のコードでは、ズーム レベルを Median ズーム レベルに設定します。

// Set the zoom level to the median
mapView.zoomLevel =
(mapView.minimumZoomLevel + NMAMapViewMaximumZoomLevel)/2.0f;
注意 :NMAMapView::minimumZoomLevel プロパティは、現在のマップおよび表示解像度などのデバイス表示パラメータに応じて、実効最小ズーム レベルを提供します。 これらのパラメータを考慮しない最小ズーム レベルを取得するに NMAMapViewMinimumZoomLevelは、を使用します。

方向

表示方向によって、のどの基本方向がのどの画面方向に対応する NMAMapViewかが決まります。 有効な範囲は 0 ~ 360 度です。 デフォルト値の 0 を指定すると、真の北がビューの上端に向くようにマップの向きが変更されます。 次のコードは、南向きを南向きに設定する方法を示しています。

// Rotate by 180 degrees
mapView.orientation = 180;

傾斜

チルト値は、地図が表示されている角度を表します。 デフォルトでは、地図の傾きの値は 0 です。 これにより、地図の上下の 2 次元ビューが提供されます。 の tilt プロパティを使用してチルト値を設定 NMAMapView できますが、有効なチルト値の範囲は現在のズーム レベルに依存するため、この tilt プロパティは画面で使用される前に変換されます。 maximumTiltProfile のプロパティを使用 NMAMapView して、ブロックを指定し、ズームレベルが最大チルトに与える影響を定義することもできます。

実際に使用されているチルト値を見つけるに clippedTilt は、アクセサメソッドを呼び出します。 特定のズーム レベルのチルト制限を見つけるには、 minimumTiltAtZoomLevel: メソッドおよび maximumTiltAtZoomLevel: メソッドを呼び出します。

// Set the tilt to 45 degrees
mapView.tilt = 45;

アニメーション

NMAMapViewNMAMapAnimation 、 列挙型 (enum) によって定義されたプロパティの変更時に使用される次のアニメーション設定がサポートされています。

  • NMAMapAnimationNone
  • NMAMapAnimationLinear
  • NMAMapAnimationRocket
  • NMAMapAnimationBow
// Rotate by 90 degrees using a linear animation
[mapView setOrientation:90 withAnimation:NMAMapAnimationLinear];
// Move to London using bow animation
NMAGeoCoordinates *geoCoordCenter = [[NMAGeoCoordinates alloc]
    initWithLatitude:51.51 longitude:-0.11];
[mapView setGeoCenter:geoCoordCenter withAnimation:NMAMapAnimationLinear];

複数の属性の設定

1 つ以上の属性を同時に変更する拡張 API が提供されます。

-(void) setGeoCenter:(NMAGeoCoordinates*) coordinates
           zoomLevel:(float) level
           orientation:(float) orientation
              tilt:(float) tilt
         withAnimation:(NMAMapAnimation) animation

マップ属性を変更しない場合 NMAMapViewPreserveValue は、該当するメソッドパラメータに定数を渡します。

// Move to Vancouver using bow animation, zoom level 17, 180
// degree orientation and preserve tilt
NMAGeoCoordinates* coord = [[NMAGeoCoordinates alloc]
  initWithLatitude:49.1
  longitude:123.0];
[mapView setGeoCenter:coord
  zoomLevel:17.0f
  orientation:180
  tilt:NMAMapViewPreserveValue
  withAnimation:NMAMapAnimationBow];

イベントブロックをマップします

マップイベントブロックを使用すると、マップイベントのカスタム処理を簡単かつ多用途に追加できます。 このメカニズムを使用すると、特定のマップイベントが発生したときにアプリケーションで任意のコードを実行できます。 アプリケーションでは、を使用してこのコードを定義でき NMAMapEventBlockます。 各ブロックは、 1 つ以上のイベントに応答するように登録できます。また、特定のイベントタイプへの応答を継続するかどうかを動的に制御できます。

注 : マップイベントブロックの機能が NMAMapViewDelegate コールバックと重複している可能性があります。 このような状況で NMAMapEventBlock は、を使用してカスタムのマップイベント処理を実装することをお勧めします。
監視できるイベントのタイプは NMAMapEvent 列挙型 (enum) で表され、次のものが含まれます。
  • geoCenter が変更されました
  • zoomLevel が変更されました
  • orientation が変更されました
  • tilt が変更されました
  • ジェスチャーが開始されました
  • ジェスチャーが終了しました
  • アニメーションが開始されました
  • アニメーションが終了しました
  • 変革が開始されました
  • 変換が終了しました

変換とは、ユーザーまたはアプリケーションが変更を行ったかどうかにかかわらず、地図のジオエンター、ズーム レベル、方向、およびチルトの値に対する変更を指します。 1 つの変換開始イベントと変換終了イベントのセットの間に、アニメーション、ジェスチャなど、さまざまなソースからの複数の変換が存在する場合があります。 たとえば、アプリケーションがマップのアニメーションをトリガーし、マップが静止状態の場合、 NMAMapEventTransformationBegan NMAMapEventAnimationBegan イベントが発生します。 ユーザーがアニメーションが完了する前にジェスチャを実行すると、 NMAMapEventAnimationEnded NMAMapEventGestureBegan イベントが発生します。 最後に、ユーザーがジェスチャを終了すると、 NMAMapEventGestureEnded NMAMapEventTransformationEnded イベントが発生します。

マップイベントブロックを登録するに respondToEvents:withBlock: は、メソッドを使用して、ブロックが応答するイベントを設定します。 たとえば、地図のジェスチャまたはアニメーションがあるときにオーバーレイを非表示にするには、次のようにします。

[_mapView respondToEvents:(NMAMapEventGestureBegan | NMAMapEventAnimationBegan) withBlock:^(NMAMapEvent event, NMAMapView *mapView, id eventData) {
  // _myOverlay is an informative overlay on the map
  _myOverlay.hidden = YES;
  return YES;
}];

[_mapView respondToEvents:(NMAMapEventGestureEnded | NMAMapEventAnimationEnded) withBlock:^(NMAMapEvent event, NMAMapView *mapView, id eventData) {
  // _myOverlay is an informative overlay on the map
  _myOverlay.hidden = NO;
  return YES;
}];

イベントブロックが戻ると YES、関連するイベントがトリガーされたときにイベントブロックが引き続き実行されます。 イベントブロックが戻ると NO、その特定のトリガーイベントのイベントブロックが削除されます。 ( 同じブロックが他のイベントタイプにも登録されている場合は、それらのイベントに応答します ) 。 たとえば、次のコードでは、現在のアニメーションが終了したときに 1 回限りのアクションを実行します。

[_mapView respondToEvents:NMAMapEventAnimationEnded withBlock:^(NMAMapEvent event, NMAMapView *mapView, id eventData) {
  // Do something...
  return NO;  // This block will be removed after being called once
}];

respondToEvents:withBlock: メソッドは、登録されているブロックを識別する一意の整数値を返します。 ブロックの登録を解除するに removeEventBlockWithIdentifier: は、この整数値でを呼び出します。

注 : イベントハンドラブロックを作成する場合は、保持サイクルを避けるように注意する必要があります。 ブロック内で強く参照されているオブジェクトは、そのブロックが残っている限り解放されません。 これには、への明示的または暗黙的な(インスタンス変数を介した)参照が含ま selfれます。 ブロック内の厳密に参照されているすべてのオブジェクトが、そのブロック内に存在する限り存続するようにしてください。存在しない場合は、弱い参照を使用してください。

地図表示レイヤー

道路ラベルや公園名などの地図情報は、表示レイヤーにグループ化されます。 これらのレイヤーはカテゴリとしてグループ化 NMAMapLayerCategory され、列挙体で表されます。 デフォルト NMAMapView では、すべてのレイヤーがマップ ビューに表示されるように設定されています。また、次の方法を使用して、非表示にするかどうかを制御できます。

  • isMapLayerCategoryVisible: - マップレイヤーのカテゴリが表示されているかどうかを確認します
  • setVisibility:forMapLayerCategories: - マップレイヤーの指定したカテゴリを表示するかどうかを設定します
  • visibleMapLayerCategories - NSArray マップレイヤーの現在表示されているカテゴリを表すを取得します

地図表示レイヤーカテゴリの全リストについて NMAMapLayerCategoryは、 API リファレンス for を参照してください。

場所のカテゴリ

NMAMapView 地図上の場所のカテゴリを表示または非表示にするには、次の方法を使用します。 場所のカテゴリは NMAMapPoiCategory 列挙型 (enum) で表されます。
  • poiCategories - すべてのプレースカテゴリの名前を取得します
  • setVisibility:forPoiCategory: - 場所のカテゴリを表示するかどうかを設定します
  • isPoiCategoryVisible: - 場所のカテゴリが表示されているかどうかを確認します
たとえば、次の番号を呼び出すことで、すべてのガソリンスタンドを非表示にできます。

[mapview setVisibility:NO forPoiCategory:NMAMapPoiCategoryPetrolStation];

歩行者機能

デフォルト NMAMapViewでは、歩行者アクセス機能(階段やエスカレーターなど)を示すアイコンはに表示されません。 マップ ビューに歩行者機能を表示するには、 NMAMapPedestrianFeatureType 必要に応じて showPedestrianFeature:pedestrianFeature メソッドを呼び出します。 同様 hidePedestrianFeature:pedestrianFeature に、メソッドを呼び出して徒歩機能を非表示にできます。 機能タイプが有効になっているかどうかを確認するに isPedestrianFeatureShown:pedestrianFeature は、メソッドを呼び出します。

図 3. 歩行者機能アイコン

割り込み処理

デフォルト NMAMapView では、 Control Center メニューの表示中やシステム通知の受信中など、アプリケーションがアクティブ状態でなくなったときにマップのレンダリングを一時停止します。 pauseOnWillResignActive この動作を無効にするには、プロパティをに設定し NOます。 自動一時停止が無効になっている場合、アプリケーションは、 renderAllowed プロパティを NO に設定して、バックグラウンドに移動したときにマップ ビューレンダリングを手動で一時停止する必要があります。

注 :applicationDidEnterBackground メソッドから戻る前に、レンダリングを一時停止する必要 UIApplicationDelegateがあります。

このセクションで紹介およびデモンストレーションされた API の詳細については、 API リファレンス のドキュメントを参照してください。