オブジェクトとインタラクション
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
、、 NMAMapCircle
、 NMAMapPolygon
、 NMAMapPolyline
およびです。 コンテナを使用すると、大量のオブジェクトの重なり順や可視性を簡単に制御できます。
マップコンテナを使用するに addMapObject
は、 1 つ以上のマップオブジェクトを作成し、メソッドを使用してコンテナに追加します。 マップ上のオブジェクトを表示するには、 NMAMapView
の addMapObject
メソッドを使用してマップコンテナをマップに追加します。
NMAMapContainer
場合もあります。 NMAMapCircle クラス
NMAMapCircle
クラスを使用して、地図上の固定された地理的位置に円を描画します。カスタムの枠線と塗りつぶしの色を定義できます。
MapCircle
オブジェクト 
NMAMapPolyline クラス
NMAMapPolyline
クラスを使用して、 1 つ以上の接続された線分を地図に描画します。 セグメントの頂点は、一連のによって指定 NMAGeoCoordinates
されます。 ポリラインの外観をカスタマイズできます。
MapPolyline
オブジェクト 
NMAMapPolygon インターフェイス
NMAMapPolygon
クラスはに似 NMAMapPolyline
ていますが、直線の最初と最後の点が自動的に結合され、閉じたシェイプが作成されます。 多角形オブジェクトには、異なる枠線と塗りつぶしの色を使用できます。
MapPolygon
透明な塗りと枠線が設定されたオブジェクト 
NMAMapMarker クラス
NMAMapMarker
クラスは、地図上の固定された地理的位置にカスタムアイコンを表示するために使用されます。
- bmp
- SVG
- JPEG
- PNG
NMAImage
これらのファイル形式の操作の詳細については、 API リファレンス を参照してください。 NMAMapMarker
オブジェクト 
draggable
プロパティを YES
に設定することで、 NMAMapMarker
ドラッグ可能に設定できます。 マーカーの位置の変更などのドラッグイベントをリッスンするには、 NMAMapView
の respondToEvents: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 モデルメッシュのサイズをさらに制御できます。

テクスチャの設定以外 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
照明を設定できます。 
マップ オブジェクトの選択
ビジュアルリプレゼンテーションを持つすべてのユーザー定義オブジェクトを選択できます。 地図上の表示されているオブジェクトがタップされたときに選択されます。 デフォルトでは、オブジェクトが選択されている場合、マップはアクションを実行しません。 選択処理を実装するには、カスタムクラスが NMAMapViewDelegate
プロトコルとその onMapObjectsSelected
メソッドを実装する必要があります。 クラスのインスタンスは、 addMapViewObserver
メソッドを介してマップ ビューオブザーバとしてインストールする必要があります。 onMapObjectsSelected
コールバックは、 NMAViewObject
のインスタンスを含む配列を返します。この配列は NMAMapObject
のスーパークラスです。
オブジェクトの選択は objectsAtPoint:
、または visibleObjectsAtPoint:
メソッドを使用してプログラムによって呼び出すこともできます。 これらの各メソッドは、 CGPoint
スクリーン座標を取得し、その場所で NMAMapObject
の NSArray
を返します。 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];

コンテンツは、 addSubview
メソッドを使用して、通常 UIView
と同じ方法でマップ オーバーレイに追加できます。 独自のサブビューを持つビューなど、複雑なビューコンテンツが必要な場合は、コンテンツをマップ オーバーレイに追加する前に完全に初期化する必要があります。
追加のパフォーマンスコスト UIViews
がかかるため、アニメーションなど UIView
によって提供される追加の機能が必要な場合にのみ NMAMapOverlay
使用することをお勧めします。 マップ オブジェクトでスタティックイメージを表示するだけの場合は NMAMapMarker
、を使用する必要があります。
-
NMAMapOverlay
はから継承しNMAMapObject
ないため、タップジェスチャからオーバーレイはデフォルトでは選択されません。 この動作を実現するには、適切なジェスチャ処理をNMAMapOverlay
サブクラス内、または標準NMAMapOverlay
へのサブビューとして追加されたカスタムビュー内に実装する必要があります。 詳細について は、「地図ジェスチャ」を参照してください。 NMAMapOverlay
の形状プロパティは、中心やフレームなど、UIView
から継承されたものであっても、直接変更することはできません。
プロキシオブジェクト
交通イベント、公共交通機関、施設などの現実世界の情報を表すために、システムによってマップに追加されるオブジェクトがあります。 これらのオブジェクトは変更できませんが、多数のオブジェクトを選択できます。 すべてのプロキシオブジェクトは、 NMAProxyObject
が NMAViewObject
クラスの祖先を共有するサブクラスです NMAMapObject
。
NMAPoiObject
関心のあるポイントは NMAPoiObject
、プロキシオブジェクトクラスのインスタンスで表されます。

上記のスクリーンショットには、 2 つのショップ、 1 つのレストラン、 1 つのカーディーラーの 4 つの関心事があります。 これらのポイントは、 NMAMapViewDelegate
の mapView:didSelectObjects:
コールバックメソッドからオブジェクトを返すマップをタップするか、 NMAMapView
の objectsAtPoint:
メソッドを呼び出して選択できます。
タップしたからジャンル別施設情報を取得する方法の例を次に示し 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];
}
}
}