iOS 開発者ガイド for SDK

オブジェクトとインタラクション

HERE SDK では、特定の目的を持つさまざまなオブジェクトをマップ ビューに追加できます。 使用できるオブジェクトのタイプには、地図のマーカー、ルート、ポリライン、オーバーレイがあります。 これらのオブジェクトについては、以下で詳しく説明します。

GitHub のマップオブジェクトの例

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

NMAMapObject クラス

NMAMapObject クラスは、ほとんどの種類の特殊化されたマップ オブジェクトを継承する汎用ベースクラスを提供します。 これらのすべてのオブジェクトタイプに共通の機能は、にカプセル化 NMAMapObjectされています。 の重要なプロパティとメソッドの一覧を次に示します NMAMapObject

  • zIndex - オブジェクトの重なり順を指定します。重なり合う可能性のある他のオブジェクトを基準にして、マップ上でのオブジェクトの表示方法を制御します
  • visible - マップのレンダリング時にオブジェクトを描画するかどうかを指定します
  • type - マーカー、ポリライン、ルートなどのマップ オブジェクトのタイプが含まれます。 一覧表の全文については NMAMapObject 、『 API リファレンス 』を参照してください
  • parent - NMAMapContainer このオブジェクトを保持しているインスタンス ( 存在する場合 )
  • mapLayerType - NMAMapLayerType このマップ オブジェクトがレンダリングされる表示レイヤーを表します。 デフォルトでは、マップオブジェクトはフォアグラウンドに割り当てられます
  • uniqueId - アプリケーションの起動中にオブジェクトを一意に識別します
注 :
  • NMAMapObject 他のマップ オブジェクトタイプのベースクラスとして機能し、直接インスタンス化しないでください。
  • マップ オブジェクトの視覚的な外観を変更すると、マップオブジェクトがマップ自体の一部として描画されるため、マップ ビュー全体が再描画されます。 最適なパフォーマンスを得るために、必要でない限り、マップオブジェクトを頻繁に更新しないでください。
  • 正の altitude 値を含む NMAGeoCoordinates オブジェクトが NMAMapObject に割り当てられている場合、このマップ オブジェクトはマップの上にフローティングとして表示されます。 地図オブジェクトは常にカメラに面して表示されるため、地図が傾いてしまうまでオブジェクトがフローティング状態になっていることはユーザーにはわかりません。 地図を傾けると、高度の値が高い地図オブジェクトの位置を特定できなくなることがあります。 最適な結果を得るには、 altitude を常に 0 正または負の値に設定します。

NMAMapContainer クラス

マップコンテナは、特定の種類の他のマップオブジェクトをグループ化するために使用できる特殊な種類のマップ オブジェクトです。 許可されているオブジェクトのタイプは NMAMapMarker、、 NMAMapCircleNMAMapPolygonNMAMapPolylineおよびです。 コンテナを使用すると、大量のオブジェクトの重なり順や可視性を簡単に制御できます。

マップコンテナを使用するに addMapObject は、 1 つ以上のマップオブジェクトを作成し、メソッドを使用してコンテナに追加します。 マップ上のオブジェクトを表示するには、 NMAMapViewaddMapObject メソッドを使用してマップコンテナをマップに追加します。

注 : コンテナには、の他のインスタンスが含まれている NMAMapContainer場合もあります。

NMAMapCircle クラス

NMAMapCircle クラスを使用して、地図上の固定された地理的位置に円を描画します。カスタムの枠線と塗りつぶしの色を定義できます。

図 1. MapCircle オブジェクト

NMAMapPolyline クラス

NMAMapPolyline クラスを使用して、 1 つ以上の接続された線分を地図に描画します。 セグメントの頂点は、一連のによって指定 NMAGeoCoordinatesされます。 ポリラインの外観をカスタマイズできます。

図 2. MapPolyline オブジェクト

NMAMapPolygon インターフェイス

NMAMapPolygon クラスはに似 NMAMapPolyline ていますが、直線の最初と最後の点が自動的に結合され、閉じたシェイプが作成されます。 多角形オブジェクトには、異なる枠線と塗りつぶしの色を使用できます。

図 3. MapPolygon 透明な塗りと枠線が設定されたオブジェクト
注 : パスが交差するポリゴンはサポートされていません。 たとえば、 1 つの線分が別の線分と交差する 4 つの線分を使用して " ボウタイ " 図形を作成することはできません。 ただし、 2 つの三角形を使用してシェイプを作成できます。

NMAMapMarker クラス

NMAMapMarker クラスは、地図上の固定された地理的位置にカスタムアイコンを表示するために使用されます。

カスタムアイコンは、次のいずれかのファイル形式にすることができます。
  • bmp
  • SVG
  • JPEG
  • PNG
NMAImage これらのファイル形式の操作の詳細については、 API リファレンス を参照してください。
図 4. NMAMapMarker オブジェクト

draggable プロパティを YES に設定することで、 NMAMapMarker ドラッグ可能に設定できます。 マーカーの位置の変更などのドラッグイベントをリッスンするには、 NMAMapViewrespondToEvents:withBlock: メソッドを使用します。

NMAMapLocalModel

NMAMapLocalModel は、ローカル座標(地理座標ではなく)メッシュを使用して描画される任意の 3D マップ オブジェクトです。 カスタムを作成 NMAMapLocalModel するには、モデルのメッシュ、テクスチャ、地理的な位置を設定してからマップに追加します。 例 :


NMAFloatMesh *mesh = [[NMAFloatMesh alloc] init];
float size = 40.f;
float vertices[6 * 3] = {0.0f,  0.0f,   0.0f,
  -size,  -size,  2 * size,
  size,   -size,  2 * size,
  size,   size,   2 * size,
  -size,  size,   2 * size,
  0.0f,   0.0f,   4 * size};
[mesh setVertices:vertices withCount:6];
float textureCoordinates[6 * 2] = {0.5,   0.5,
  0.5,   1,
  1,   0.5,
  0.5,   0,
  0,   0.5,
  0.5,   0.5};
[mesh setTextureCoordinates:textureCoordinates withCount:6];
short triangles[8 * 3] = {0, 2, 1,
  0, 3, 2,
  0, 4, 3,
  0, 1, 4,
  5, 1, 2,
  5, 2, 3,
  5, 3, 4,
  5, 4, 1};
[mesh setTriangles:triangles withCount:8];
NMAMapLocalModel* _diamond = [[NMAMapLocalModel alloc] initWithMesh:mesh];
NMAImage *image = [NMAImage imageWithUIImage:[UIImage imageNamed:@"flag.png"]];
[_diamond setTexture:image];
[_diamond setCoordinates:geoCoordCenter];
[self.mapView addMapObject:_diamond];

3D モデルメッシュをマップに平行移動している間 1.0f 、の単位は実際の 1 メートルを表します。 たとえば、の頂点のセット {100, 200, 300} は、 x 軸 ( 東 ) では +100 メートル、 y 軸 ( 北 ) では +200 メートル、 z 軸方向では +300 メートルのオフセットを表します ( 上 ) 。 scale プロパティでスケール係数を設定することで、 3D モデルメッシュのサイズをさらに制御できます。

図 5. NMAMapLocalModel オブジェクト

テクスチャの設定以外 NMAMapLocalModel に、指向性光源を追加してをカスタマイズすることもできます。 たとえば、次のコード NMAMapLocalModelでは、光源をに設定します。

NMAVector3d vec3d;
vec3d.x = 0.f; vec3d.y = 0.5f; vec3d.z = -1.f;

// This light shines from above in the Z axis
NMADirectionalLight* light = [NMADirectionalLight lightWithDirection:vec3d];
// assume 'model' is an NMAMapLocalModel that is already on the map
[model addLight:light];
注 :
  • 3D オブジェクトは大量のメモリを消費するため、 2D マップマーカーの NMAMapLocalModel NMAMapGeoModel 使用や置き換えは避けてください。 これらのクラスの推奨される使用例として、マップに少数の 3D 構造を追加するか、またはガイダンス中に現実的な自動車モデルを表示することがあります。
  • を使用 NMAMapLocalModel して 2 次元オブジェクトを作成し、高度が未定義またはゼロの値のアンカーを使用する場合、オブジェクトの一部がマップ レイヤーと競合してオブジェクトがちらつく原因となる、 OpenGL の既知のレンダリングの問題があります。 この問題を回避するには、 0 より大きい z 座標のオフセットを使用します。 たとえば、などの小さな浮動小数点数を使用し 0.001て、ユーザーがオブジェクトの高度とマップを区別できないようにすることができます。

NMAMapGeoModel

NMAMapGeoModel は、地理座標頂点を使用して描画される任意の 3D マップ オブジェクトです。 NMAGeoMesh およびテクスチャ NMAImage を使用して、 NMAMapGeoModel を作成できます。 例 :


NMAGeoMesh *geoMesh = [[NMAGeoMesh alloc] init];

double vertices[5 * 3] =
  {   -123.133392, 49.265275, 0,
    -123.127813, 49.265275, 0,
    -123.133392, 49.261803, 0,
    -123.127813, 49.261803, 0,
    -123.130903, 49.263931, 1250
  };
[geoMesh setVertices:vertices withCount:5];

float textureCoordinates[5 * 2] =
{   0.0, 0.0,
  1.0, 0.0,
  0.0, 1.0,
  1.0, 1.0,
  0.5, 0.5
};
[geoMesh setTextureCoordinates:textureCoordinates withCount:5];

short triangles[4 * 3] =
{
  0, 4, 1,
  2, 3, 4,
  0, 2, 4,
  1, 4, 3};

[geoMesh setTriangles:triangles withCount:4];

NMAMapGeoModel* _textureOverArea =
  [[NMAMapGeoModel alloc] initWithMesh:geoMesh];
NMAImage *image =
  [NMAImage imageWithUIImage:[UIImage imageNamed:@"flag.png"]];
[_textureOverArea setTexture:image];

[self.mapView addMapObject:_textureOverArea];
注 : NMAMapLocalModel と同様に、 Using addLight: メソッドを使用して NMAMapGeoModel 照明を設定できます。
図 6. NMAMapGeoModel オブジェクト

マップ オブジェクトの選択

ビジュアルリプレゼンテーションを持つすべてのユーザー定義オブジェクトを選択できます。 地図上の表示されているオブジェクトがタップされたときに選択されます。 デフォルトでは、オブジェクトが選択されている場合、マップはアクションを実行しません。 選択処理を実装するには、カスタムクラスが NMAMapViewDelegate プロトコルとその onMapObjectsSelected メソッドを実装する必要があります。 クラスのインスタンスは、 addMapViewObserver メソッドを介してマップ ビューオブザーバとしてインストールする必要があります。 onMapObjectsSelected コールバックは、 NMAViewObject のインスタンスを含む配列を返します。この配列は NMAMapObject のスーパークラスです。

オブジェクトの選択は objectsAtPoint: 、または visibleObjectsAtPoint: メソッドを使用してプログラムによって呼び出すこともできます。 これらの各メソッドは、 CGPoint スクリーン座標を取得し、その場所で NMAMapObjectNSArray を返します。 visibleObjectsAtPoint メソッドは、 visible プロパティが NO として設定されているオブジェクトを返しません。

詳細については NMAMapView 、 API のマニュアルを参照してください。

注 : ユーザー定義のオブジェクトに加えて、特定の種類の内部マップオブジェクトも選択できます。 詳細については、「プロキシオブジェクト」セクションを参照してください。

NMAMapOverlay クラス

NMAMapOverlay クラスは NMAMapObject 、基本クラスから継承しない特殊なマップ オブジェクト型を表します。 代わりに、 Apple UIKit フレームワークの UIView クラスを継承します。 したがって、 UIView 任意のまたは UIView サブクラスを地図上の固定された地理的位置に表示できます。

たとえば、 UILabel 次のコードは、をマップで使用する方法を示しています。


/*
 * 'location' is a CGPoint on screen
 * 'mapView' is an NMAMapView object
 */
NMAGeoCoordinates *coords = [mapView geoCoordinatesFromPoint:location];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.textColor = [UIColor redColor];
label.text = @"overlay";
label.textAlignment = NSTextAlignmentCenter;
label.backgroundColor = [UIColor whiteColor];
label.layer.borderWidth = 2;
label.layer.borderColor = [UIColor redColor].CGColor;

label.frame = CGRectMake(0, 0, 70, 30);

NMAMapOverlay *overlay = [NMAMapOverlay mapOverlayWithSubview:label geoCoordinates:coords];

[mapView addMapOverlay:overlay];
図 7. マップ オーバーレイの例

コンテンツは、 addSubview メソッドを使用して、通常 UIView と同じ方法でマップ オーバーレイに追加できます。 独自のサブビューを持つビューなど、複雑なビューコンテンツが必要な場合は、コンテンツをマップ オーバーレイに追加する前に完全に初期化する必要があります。

追加のパフォーマンスコスト UIViews がかかるため、アニメーションなど UIView によって提供される追加の機能が必要な場合にのみ NMAMapOverlay 使用することをお勧めします。 マップ オブジェクトでスタティックイメージを表示するだけの場合は NMAMapMarker 、を使用する必要があります。

注 :
  • NMAMapOverlay はから継承し NMAMapObjectないため、タップジェスチャからオーバーレイはデフォルトでは選択されません。 この動作を実現するには、適切なジェスチャ処理を NMAMapOverlay サブクラス内、または標準 NMAMapOverlay へのサブビューとして追加されたカスタムビュー内に実装する必要があります。 詳細について は、「地図ジェスチャ」を参照してください。
  • NMAMapOverlay の形状プロパティは、中心やフレームなど、 UIView から継承されたものであっても、直接変更することはできません。

プロキシオブジェクト

交通イベント、公共交通機関、施設などの現実世界の情報を表すために、システムによってマップに追加されるオブジェクトがあります。 これらのオブジェクトは変更できませんが、多数のオブジェクトを選択できます。 すべてのプロキシオブジェクトは、 NMAProxyObjectNMAViewObject クラスの祖先を共有するサブクラスです NMAMapObject

NMAPoiObject

関心のあるポイントは NMAPoiObject 、プロキシオブジェクトクラスのインスタンスで表されます。

図 8. ジャンル別施設の例

上記のスクリーンショットには、 2 つのショップ、 1 つのレストラン、 1 つのカーディーラーの 4 つの関心事があります。 これらのポイントは、 NMAMapViewDelegatemapView:didSelectObjects: コールバックメソッドからオブジェクトを返すマップをタップするか、 NMAMapViewobjectsAtPoint: メソッドを呼び出して選択できます。

タップしたからジャンル別施設情報を取得する方法の例を次に示し NMAPoiObjectます。


-(void)mapView:(NMAMapView *)mapView didSelectObjects:(NSArray *)objects
{
  for(NMAViewObject *object in objects) {
    if ([object isKindOfClass:[NMAPoiObject class]]){
      NMAPoiObject *poiObject = (NMAPoiObject*) object;
      NSString* placeName =
        [poiObject.locationInfo valueForField:NMALocationInfoFieldPlaceName];
      NSString* placeCategory =
        [poiObject.locationInfo valueForField:NMALocationInfoFieldPlaceCategory];
      NSString* placePhoneNUmber =
        [poiObject.locationInfo valueForField:NMALocationInfoFieldPlacePhoneNumber];
    }
  }
}