iOS 開発者ガイド for SDK

電子ホライズン

エレクトロニックホライゾンは、 MAP をセンサーとして使用し、現在ドライバーの視界から外れている地図地形を取り込み、今後の道路ネットワークを継続的に予測します。 HERE Electronic Horizon API は、車両の位置およびその他の関連する道路特性とともに、道路前方のシンプルなモデルを作成します。 アダプティブクルーズコントロール( ACC )やカーブ速度警告などの技術を使用すると、ドライバーが燃料を節約し、安全かつストレスの少ないドライブを行うことができます。

HERE Electronic Horizon API が予測できるデータの種類は次のとおりです。

  • 最も可能性の高いパス
  • 代替のサイドパス
  • 制限速度
  • 斜面
  • 曲率の座標
  • ロードクラス
  • 道路タイプ

HERE Electronic Horizon API はオフラインユースケースを完全にサポートし、 ADASISv2 に準拠した車両の先進的なドライバーアシスタンスシステム( ADAS )標準に準拠しています。

作業を開始する前に

HERE SDK のフレーバーが正しいことを確認してください。 エレクトロニックホライゾンは 、バージョン 3.6.0 以降の SDK for iOS に含まれています。

注 : 電子ホライズンは、オンラインおよびオフラインの道路ネットワーク予測をサポートしています。 API はクラウドからマップ データにアクセスできますが、事前に予想される地図エリアをダウンロードすることを強くお勧めします。 オンラインで利用できるすべてのデータは、オフライン モードで完全に利用できます。 オフラインで (ODML 経由 ) 使用する場合 NMAMapDataGroupADASNMAMapDataGroupLinkGDBIdPVId は、目的のマップ データをダウンロードする前に、およびデータグループを有効にしてください。

Electronic Horizon ではユーザーの立場が必要で ACCESS_FINE_LOCATION あるため、権限が必要です。 API はオフライン モードでも動作しますが、ユーザーに少なくとも次の権限を要求することをお勧めします。

<key>NSLocationAlwaysUsageDescription</key>
<string>This is needed to determine your current location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This is needed to determine your current location</string>

最初の Electronic Horizon Events の取得方法

Electronic Horizon にアクセスする前に NMAPositioningManager、次の点を確認してください。

NMAPositioningManager* positioningManager = [NMAPositioningManager sharedPositioningManager];
if ([positioningManager startPositioning]) {
  positioningManager.mapMatchingEnabled = YES;
  positioningManager.mapMatchMode = NMAMapMatchModeCar;
}

次に、 Electronic Horizon インスタンスを作成し、イベントを受け取るようにデリゲートを設定します。 デリゲートが NMAElectronicHorizonDelegate プロトコルに準拠していることを確認してください。 プロトコルは、オプションとしてマークされた複数のコールバックを定義します。 そのため、本当に必要なコールバックを実装するだけで済みます。

self.electronicHorizon = [[NMAElectronicHorizon alloc] init];
self.electronicHorizon.delegate = self;

- (void)electronicHorizon:(nonnull NMAElectronicHorizon *)electronicHorizon
  didReceiveNewPosition:(nonnull NMAEHPosition *)position {
  // handle event here
}

これで、お使いのデバイスの現在の位置に基づいて、道路ネットワークアヘッドを計算するように電子ホライズンエンジンに指示できます。 この操作を行うには、次の番号に電話をかけます

[self.electronicHorizon update];
注 : メソッドの呼び出し update はリソースを大量に消費します。 この機能は頻繁に呼び出さないことをお勧め NMAPositioningManager します。は通常、毎秒新しい位置を提供します。 代わりに、以下の場合にのみ、 Electronic Horizon を更新できます。
  • 特定の距離
  • 一定の時間
  • 特定のイベント

呼び出し update には時間がかかることがあるため、 NMAElectronicHorizonDelegate プロトコルは、予測パスが変更されたときにただちに通知を受け取るように複数のコールバックを提供します。

  • electronicHorizon:didReceiveNewPosition: - 他のコールバックの後、常に最後に呼び出されます。 NMAEHPathTree 位置が前のコールと同じ場合、変更されていないを含むことがあります。 常にフルパスが含まれます。
  • electronicHorizonDidReceiveTreeReset: - 現在の位置がメイン NMAEHPathTree ルックの前方または後方の距離を超えると、 electronicHorizonDidReceiveTreeReset が呼び出さ NMAEHPathTree れ、新しいオブジェクトが作成されます。 それ以外の場合、ユーザーはまだ予想されたパスを移動しており、メイン NMAEHPathTree が拡張されています。
  • electronicHorizon:didReceivelinkAdded:link: - に追加されたリンクを通知 NMAEHPathTreeします。 メイン NMAEHPathTree には親が含まれていないことに注意 NMAEHPathTree してください。ただし、階層内で入れ子になっている深さにかかわらず、に子が含まれている場合と含まれていない場合があります。
  • electronicHorizon:didReceiveLinkRemoved:link: - リンクが親から削除された直後に呼び出さ NMAEHPathTreeれます。 パスツリーに一度追加されたすべてのリンクについて、呼び出されることは保証されていません。
  • electronicHorizon:didReceivePathAdded: - NMAEHPathTree 既存のツリーに新しいが追加されます。 各に NMAEHPathTree は親と子が含まれているため、フル electronicHorizon:didReceiveNewPosition: パスの提供のみが保証されているにもかかわらず、 HERE から道路ネットワークの通過を開始できます。
  • electronicHorizon:didReceivePathRemoved: - electronicHorizon:didReceiveNewPosition:NMAEHPathTree が削除された直後に呼び出されます。 通常は、このマップに属するマップオブジェクトをマップから削除するのに適し NMAEHPathTreeています。
  • electronicHorizon:didReceiveChildDetached:child: - ユーザーがメインパスを離れたが、サイドパスをまだ移動しているため、パスが親から切り離されました。 切り離された子が新しいメインパスになる可能性があります。

update によって有効な位置が提供された後にを呼び出すようにしてください NMAPositioningManager。そうでない場合、イベントは配信されません。 electronicHorizon:didReceiveNewPosition:update 各リクエストの後に、地図と一致する位置が見つからなかった場合でも、必ず電話が入ることに注意してください。 唯一の要件は、更新後に Electronic Horizon によって自動的に取得される有効な位置です。

注 : update バックグラウンドスレッドから呼び出すことをお勧めします。実行にはしばらく時間がかかることがあります。

ユーザーがオフロードを走行している場合、マップの一致する位置が正常に動作するために必要になるため、エレクトロニックホライズンは予測パスを計算できません。 これは、次のコード スニペットで検出できます。

- (void)electronicHorizon:(nonnull NMAElectronicHorizon *)electronicHorizon
  didReceiveNewPosition:(nonnull NMAEHPosition *)position {
  NMAEHPathTree* pathTree = position.pathTree;
  if (pathTree == nil) {
    // we seem to be off-road
  }
}

NMAEHPathTree 、前方の道路ネットワークを表し、デフォルトでは後方にも表示されます。 NMAEHPathTrees 子および親としてネストされたものが含まれてい NMAEHPathTreeますが、ルートパスのみに親が含まれていません。 これを使用 NMAEHPathTree して、がルートパスを表しているかどうかを確認できます。 位置に属するパスは、常にユーザーが現在移動しているメインパスになります。 これはルートパスである可能性がありますが、ユーザーがサイドパスに曲がることを決定した場合もあります。サイドパスは、ルートパスを親として含む新しいメインパスを表します。 パスが分離され、ツリーが再構築されると、新しいメインパスが再びルートパスになります。

NMAEHPathTree* parentPathTree = pathTree.parent;
if (parentPathTree == nil) {
   // pathTree is the main path and the root path
} else {
   // pathTree is the main path, but not the root path
}

各パスツリーには、 NMAEHLink少なくとも 1 つのが含まれています。このツリーは、 API 経由でアクセスできる道路上の最小のセグメントを表します。 通常、のメインパス NMAEHPathTrees は複数に分割 NMAEHLink され、 ID によって一意に識別できます。 道路区間は、複数のリンクのシーケンスと見なすことができます。

最も可能性の高いパスの予測 (MPP)

電子ホライズンでは、追跡ルートを指定せずに、ユーザーが取る可能性が最も高いパス(ルートまたはメインパスとして機能)を予測します。 以前の位置が反映される場合があります。 以前の位置が利用できない場合、 API は利用可能な道路属性のみに基づいて、最も可能性の高い経路を提示します。

各パスの確率は、次のように抽出できます。

- (void)electronicHorizon:(nonnull NMAElectronicHorizon *)electronicHorizon
  didReceiveNewPosition:(nonnull NMAEHPosition *)position {
    NMAEHPathTree* pathTree = position.pathTree;
    if (pathTree == nil) {
      // off-road
      return;
    }

    NMAEHPathTree* parentPathTree = pathTree.parent;
    if (parentPathTree == nil) {
       // pathTree is the main path
    }

    // Main path is expected to have a probability of 1 (= 100%)
    float probability = pathTree.probability;
    NSLog(@"Probability of main path: %f", probability);

    for (NMAEHPathTree* childPathTree in pathTree.children) {
      NSLog(@"Probability of side path: %f", childPathTree.probability);
    }
  }

パスツリーが 0 の確率で予測される場合、ドライバーがこの方向に曲がる可能性は非常に低くなります。 しかし、電子ホライズンにはこのような道路が含まれてい 一方通行の道路の場合など、アプリケーションがユーザーにこのような情報を提示する場合があります。 メインパスを除くすべての確率が 0.5 (=50%) 未満であることに注意してください。これは、ドライバーがより高い確率でメインパスを追従することが予想されるためです。

ルートを設定しています

通常は、 Electronic Horizon が MPP になるルートを追跡するようにします。 電子ホライズンインスタンスへのルートを直接設定できます。

NMARoute* myRoute = [self getRoute];
[self.electronicHorizon setRoute: myRoute];

nil ルートを設定するとにつながるため、ルートを設定解除するオプションはあり NSErrorません。 ただし、ユーザーがルートのパスを離れるとすぐに、新しい位置に基づいて MPP が再計算されます。

注 : トランスポートモード NMATransportModeCar のルートのみ NMATransportModeTruck がサポートされます。 他のタイプはをスロー NSErrorします。

電子ホライズンを前後にカスタマイズできます

通常は、 Electronic Horizon が予測できる走行距離を定義します。 NSArray これを行うには、を設定して最大 n 個のネストされたサイドパスを定義します。

int trailingDistanceInMeters = 200;
[self.electronicHorizon setTrailingDistanceInCentimeters: trailingDistanceInMeters * 100];

int mainPathDistanceInMeters = 1000;
int sidePathDistanceInMeters = 500;
NSArray *distances = [NSArray arrayWithObjects:
  [NSNumber numberWithInt: mainPathDistanceInMeters * 100],
  [NSNumber numberWithInt: sidePathDistanceInMeters * 100], nil];
[self.electronicHorizon setLookAheadDistancesInCentimeters: distances];

古いリンクとパスツリーの子は、現在の位置から定義されたトレーリング距離よりも完全に遅れている場合にのみ削除されます。 リンクがトレーリング距離よりも長い場合、リンクの開始ノードと終了ノードが定義済みのしきい値を超えるまで、リンクは削除されません。 そのため、末尾の距離の設定がすぐには有効ではない可能性があります。これは、長いリンクで特に有効です。 最小トレーリング距離は 1 cm です。

メインパスには少なくとも 1 つの子がありますが、フルパスツリーには常に n+1 サイドパスが含まれています。 ドライバーはメインパスに従うことが想定されていますが、各ジャンクションで代替パスを使用できます。 メインパスから分岐している道路はすべて、第 1 レベルのサイドパスと呼ばれます。 サイドパスはさらにサイドパスに分岐できるため、 1 番目のレベルのサイドパスから分岐するすべてのサイドパスは、 2 番目のレベルのサイドパスと呼ばれます。

下の図からわかるように、各サイドパスの距離は車両位置から開始されます。 3 つの前方監視距離( MPP 、 1 番目のサイドパス、 2 番目のサイドパス)を設定すると、 2 番目のサイドパスのサイドパスは 1 つのリンクであることになります。 下の水色の矢印を例として参照してください。

図 1. トレーリング距離と先読み距離

ルートパスツリーとその子がどのように生成されるかを理解するには、次に示すように、マップ ビューでプログラムによって 2 つの先行距離のパスを表示すると便利です。 フルパスツリーは electronicHorizon:didReceiveNewPosition: 、コールバックから取得できます。

- (void)electronicHorizon:(nonnull NMAElectronicHorizon *)electronicHorizon
  didReceiveNewPosition:(nonnull NMAEHPosition *)position {
    NMAEHPathTree* pathTree = position.pathTree;
    if (pathTree != nil && [pathTree isEqual: self.previousPathTree]) {
      // same PathTree object, we ignore any added paths
      // and wait for a newly created PathTree
      return;
    }

    self.previousPathTree = pathTree;

    if (pathTree != nil) {
      [self showAllLinksInPathTree: pathTree];
    } else {
      // offroad
    }
}
注 : 実装では、既存 NMAEHPathTree のオブジェクトが拡張された直後に、追加されたパスを処理することが必要になる場合があります。 この例では、フルパスツリーを表示するために新しく作成したパスツリーオブジェクトにのみ関心があります。 ユーザーは通常、想定された経路を走行していることに注意してください。 このパスは、新たに作成されるのではなく、拡張されます。 ツリー全体のリセットの一部としてリセットされるのでは electronicHorizonDidReceiveTreeReset:なく、親パスツリーから削除された、トレーリング距離の背後にあるパスにも同じことが適用されます(を参照)。

有効なパスツリーがあることを確認できたら、ネストされたすべてのリンクのレンダリングを開始できます。 は zIndex 、階層内の上位のパスの上に深いパスがレンダリングされるようにするためにのみ使用されます。

- (void) showAllLinksInPathTree: (NMAEHPathTree *) mainPathTree {
  int zIndex = 0;
  [self addLinksToHereMap: mainPathTree.links
          withColor: [UIColor redColor]
           andIndex: zIndex];

  // comment out the below to show only main path
  for (NMAEHPathTree* firstLevelSidePath in mainPathTree.children) {
    [self addLinksToHereMap: firstLevelSidePath.links
            withColor: [UIColor blueColor]
             andIndex: ++zIndex];

    for (NMAEHPathTree* secondLevelSidePath in firstLevelSidePath.children) {
      [self addLinksToHereMap: secondLevelSidePath.links
              withColor: [UIColor greenColor]
               andIndex: ++zIndex];
      // and so on ...
    }
  }
}

- (void) addLinksToHereMap: (NMAEHLinkRange *) links
         withColor: (UIColor *) linkColor
          andIndex: (int) zIndex {
  for (NMAEHLink* link in links) {
    NMAGeoPolyline* geoPolyline = [self.mapAccessor getLinkPolyline: link];
    if (geoPolyline) {
      NMAMapPolyline* mapPolyline = [[NMAMapPolyline alloc] initWithPolyline: geoPolyline];
      [mapPolyline setLineColor: linkColor];
      [mapPolyline setLineWidth: 10];
      [mapPolyline setZIndex: zIndex];
      [self.mapView addMapObject: mapPolyline];
    }
  }
}

にアクセスすると NMAGeoPolyline 、上記のように、パスをマップ オブジェクトとしてマップにレンダリングできます。 各リンクのパス形状は NMAGeoPolyline 、を使用して抽出する必要が NMAEHMapAccessorあるによって定義されます。 は NMAGeoPolyline リンク自体の一部ではないため、マップ データから抽出する必要があります。 したがって、必要なマップ データが利用可能であることを確認するには、 nil を確認する必要があります。

各ジャンクションでドライバーが、ドライバーが到着地までドライブバックすることを決定する場合があります。 これらのパスの確率は 50% 未満ですが、有効な選択肢であるため、デフォルトでは Electronic Horizon パスのツリー階層からは除外されません。 ただし、ほとんどの場合、想定外の回転は無視します。 たとえば、次のコード スニペットでは、サイドパスが反対方向の親パスに沿っているかどうかを検出できます。

- (bool) isBackTurn: (NMAEHPathTree *) childPathTree {
  NMAEHPathTree* parentPath = childPathTree.parent;
  if (!parentPath) {
    return false;
  }

  long childPathTreeOffset = [childPathTree offsetCentimeters];
  for (NMAEHLink* parentLink in parentPath.links) {
    if ([parentLink endOffsetCentimeters] == childPathTreeOffset) {
      NMAEHLink* firstInChild = childPathTree.links.nextObject;
      return firstInChild.id == parentLink.id &&
        firstInChild.direction != parentLink.direction;
    }
  }
  return false;
}

まず、親パスのリンクの終了オフセット距離をサイドパスのオフセット(子)と比較します。 次に、子の最初のリンクの ID を、親の最後のリンクの ID と比較できます。 方向が異なる場合、子は反対方向に向かっている必要があります。 各道路セグメントは、 ID によって一意に識別されるリンクで表されます。 方向やオフセットなどの属性のみが、同じリンクで異なる場合があります。 これは単なる例であり、特定のニーズに合わせてさらに最適化および調整する必要があります。

すべて問題が解決した場合は、次のようにフルパスツリーがレンダリングされます。

  • ルートパスが赤色になります
  • 第 1 レベルのサイドパスは青です
  • 2 階のサイドパスが緑色になります
図 2. ルートパスツリー、 1 番目と 2 番目のサイドパスをレンダリングしました

n+1 の子の前方の距離は設定できません。 このため、緑色のサイドパス(第 2 レベルのサイドパス)は、 1 つのリンク(青色のパスのサイドパス上の最初のリンク)に限ります。 メインパス(赤)と 1 次レベルサイドパス(青)には 2 つの距離の値のみが渡されていることに注意してください。 デフォルトでは、この結果、 1 つのリンクで構成される第 3 レベルのサイドパス(緑色)が作成されます。

注 : NMAEHPathTreeelectronicHorizon:didReceiveNewPosition: コールバックで受け取るには、一方向道路やデッドエンド通りなど、ほとんどない経路を含む完全な道路ネットワークが常に前方に含まれています。 ユースケースによっては、確率の低いパスを無視するか、メインパスのみに範囲を制限するか、または上記のように反対方向に続くリンクをフィルタリングすると便利です。 水平線上に追加するサイドパスが多すぎないようにしてください。追加すると、処理時間が長くなるだけでなく、重要度の低いリンクが生じる可能性も高くなります。 ほとんどの場合、 1 つの前方参照距離のみを設定するだけで十分です。これは、デフォルトでは、 1 つのリンクの長さを持つ第 1 レベルのサイドパスが含まれているためです。

道路の属性を取得します

エレクトロニックホライゾンには、利用可能なマップ データから経由でアクセスできるさまざまな道路属性があり NMAEHMapAccessorます。 勾配データなどの一部の属性は NMAEHMetaData 、(ドライビングシステムの側面や単位系など)および NMAEHLinkInformation (ルートの形式など)複数の属性を保持している間、直接アクセスできます。 すべての属性がリンク全体で有効です。

以下に、制限速度を抽出する方法の例を示し NMAEHLinkInformationます。

- (void)logSpeedLimits: (NMAEHPathTree *)pathTree {
  NMAEHMapAccessor* mapAccessor = self.electronicHorizon.mapAccessor;
  for (NMAEHLink* link in pathTree.links) {
    NMAEHLinkInformation* linkInformation = [mapAccessor getLinkInformation: link];
    if (linkInformation) {
      double speedLimitMetersPerSecond = linkInformation.speedLimitMetersPerSecond;
      NSLog(@"Speed limit on path: %ld Km", lroundl(speedLimitMetersPerSecond * 3.6));
    } else {
       NSLog(@"Map data not available");
    }
  }
}

リンクごとに 1 つの制限速度が使用でき、リンクの全長にわたって有効です。 つまり、次のようになります。 速度制限が前のリンクと比較して変更された場合、制限速度の変更場所はリンクの開始座標に等しくなります。

同様の方法で抽出できる、より多くの道路属性(機能的な道路クラスなど)については、 API リファレンス を参照してください。

の一部ではない道路属性 NMAEHLinkInformation は、から直接取得する必要 NMAEHMapAccessorがあります。 以下に、道路の勾配データにこの機能を実装する方法の例を示します。

double lengthInMeters;
NMAEHLinkInformation* linkInformation = [self.mapAccessor getLinkInformation: link];
if (linkInformation) {
  lengthInMeters = linkInformation.lengthMeters;
} else {
  NSLog(@"Map data not available");
  return;
}

NSArray<NMAEHSlopeDataPoint *>* slopeDataPointList = [self.mapAccessor getSlopeDataPoints: link];
if (!slopeDataPointList) {
  NSLog(@"Map data not available");
  return;
}

for (NMAEHSlopeDataPoint* slopeDataPoint in slopeDataPointList) {
  double normalizedPosition = slopeDataPoint.relativePositionOnLink;
  double positionOnLinkInMeters = normalizedPosition * lengthInMeters;
  double percent = slopeDataPoint.slopePercent;
  NSLog(@"Slope data position: %f", positionOnLinkInMeters);

  // if percent is greater/smaller than +/- 100% => Infinity
  if (percent == +INFINITY) {
    NSLog(@"Ascending slope > 45°");
  } else if (percent == -INFINITY) {
    NSLog(@"Downward slope > 45°");
  } else {
    if (percent > 0) {
      NSLog(@"Ascending slope: %f", percent);
    } else {
      NSLog(@"Downward slope: %f", percent);
    }
  }
}

生のスロープデータがから抽出されている間 [self.mapAccessor getSlopeDataPoints: link]NMAEHLinkInformation に、現在のリンクの全長 ( メートル ) などの追加データを取得することもできます。 は NMAEHSlopeDataPoint 、リンクの正規化された位置のみを保持します ( 例 : 0.0 = 開始、 0.5 = 中央、 1.0 = 終了 ) 。 NMAEHSlopeDataPoint リンクの先頭に対する相対的なの位置を見つけるには、その位置に相対的な長さを乗算する必要があります。

double positionOnLinkInMeters = normalizedPosition * lengthInMeters;

勾配自体は、交通標識に表示される割合の値として指定されます。 100% は 45 ° の勾配に相当します。 世界で最も急な勾配が 35 ° 程度ですが、理論的には 45 ° を超える勾配が発生する可能性があります。 これは、上図のように、エレクトロニックホライゾン API によって正または負の無限大として示されています。 100% を超えるパーセント値、または -100 %未満のパーセント値は指定できません。 正の値は上り勾配を示し、負の値は下り勾配を示します。 勾配データ点の座標は NMAGeoPolyline 、その相対位置をリンクのから抽出された曲率データと比較することで見つけることができます(上記を参照)。

ADASIS v2 メッセージデータを取得しています

エレクトロニックホライズン API は、 ADASIS v2 に準拠した車内クライアントに関連するメッセージデータを提供することで、車両データを豊かにすることができます。 クライアントとの通信を準備するには、まずメッセージ設定を提供して、必要なデータタイプを定義する必要があります。 次のステップとして、 NMAAdasisV2Engine その設定を使用するのインスタンスを作成できます。

メッセージを受信するに NMAAdasisV2EngineDelegateadasisV2Engine:didReceiveAdasisMessage: は、デリゲートクラスがコールバックを提供するプロトコルに準拠している必要があります。

- (id)init {
   NMAAdasisV2MessageConfiguration* adasisV2MessageConfiguration =
     NMAAdasisV2MessageConfiguration.createWithAllMessagesEnabled;

   self.adasisV2Engine = [[NMAAdasisV2Engine alloc] initWithConfiguration:adasisV2MessageConfiguration];
   self.adasisV2Engine.delegate = self;
 }

 - (void)adasisV2Engine:(nonnull NMAAdasisV2Engine *)adasisV2Engine
didReceiveAdasisMessage:(nonnull NSData *)message {
   // The ADASIS v2 specification defines messages with 8 bytes payload data
   // where the first three bits define the message type followed by the actual content.
   NSLog(@"ADASIS message received. Length: %lu", (unsigned long)message.length);
 }

上記のコマンドでは、使用可能なすべてのメッセージタイプを有効にする設定が作成されます。 または、を呼び出して、デフォルトのメッセージタイプのみを有効にする設定を作成することもできます。

NMAAdasisV2MessageConfiguration* adasisV2MessageConfiguration =
  NMAAdasisV2MessageConfiguration.createWithDefaultMessagesEnabled;

これ POSITIONSTUBSEGMENTMETA-DATA により、、、、およびのメッセージタイプのみが有効になります。 ADASIS v2 仕様では、合計で 6 種類のメッセージタイプが定義されています。

  • POSITION メッセージは車両の現在の位置を示します
  • STUB メッセージは、既存のパスに起点がある新しいパスの開始を示します
  • SEGMENT message は、パスの一部の最も重要な属性を指定します
  • PROFILE SHORT Message は、値を 10 ビットで表現できるパスの属性を記述します
  • PROFILE LONG Message は、値を 32 ビットで表現できるパスの属性を記述します
  • META-DATA メッセージにユーティリティデータが含まれています

Electronic Horizon API では、メッセージ SEGMENT タイプについて以下に示すように、各メッセージおよびデータを含む部分 ( スロープなど ) を動的に有効または無効にする getter および setter が提供されています。

if (adasisV2MessageConfiguration.segmentEnabled) {
  adasisV2MessageConfiguration.segmentEnabled = false;
}

NMAAdasisV2EngineNMAElectronicHorizion 1 つのインスタンスとともに 1 つのインスタンスを実行できますが [self.adasisV2Engine update] 、現在のデバイス位置に基づいて ADASIS メッセージのシーケンスをトリガーするには、必ずを呼び出す必要があります。 使用方法は NMAElectronicHorizion 、インスタンスについてすでに説明したものと同じパターンに従います。 このため NMAPositioningManager 、最初の ADASIS v2 準拠のメッセージを受信するには、まず最初に開始する必要があります。

ADASIS v2 は、 ADASIS v2 Horizon プロバイダとクライアント間の一方向通信を前提としています。 Electronic Horizon API では、メッセージの受信シーケンスが ADASIS v2 仕様に準拠していることが保証されているため、通常は内容を解析する必要はありません。 ADASIS の仕様は独自のものであることに注意してください。 クライアントとの通信を確立するには、 ADASIS v2 の関係者に連絡してください。 AdasisV2Engine はプロバイダとしてのみ機能するため、コントリビュータクライアントからの情報を受信または解析することはありません。これは、通常、実際の実装の個々のニーズに依存するためです。