Skip to content

datastore

Daisuke Sato edited this page Oct 5, 2021 · 1 revision

ナビゲーションに関連するデータを保持するヘルパークラス

L.779
- (void)requestRouteFrom:(NSString *)fromID 
                      To:(NSString *)toID 
         withPreferences:(NSDictionary *)prefs 
                complete:(void (^)())complete
  • サーバーにRoute, NodeMap, Featureを問い合わせる
    • Route: ルートGeoJSON
    • NodeMap / Feature: 周囲のPOIやLink、ノードなどを問い合わせる
    • ROUTE_CHANGED_NOTIFICATIONの通知を発行
    • POIのリンクへのマッピング
  • ルートのHTTPリクエストが完了したら、データを解析する

  • - (void) analyzeFeatures:(NSArray*)features L.889

    • 一時保管用のDictionaryとArrayを用意

    • 各HLPObjectについて L.900

      • リンクの場合
        • リンクID->リンクをマップ
        • 両端のノードIDに対して、ノードに接続している全てのリンクへのマップ
        • エスカレーターのリンクの場合、エスカレーターリンクのリストに登録
      • ノードの場合
        • ノードID->ノードをマップ
      • トイレもしくは施設の場合
        • 施設ID->施設のマップ
        • 施設リストへの登録
    • 各出入口情報について L.942

      • 出入口の名前が「#」の場合は、出入口情報として扱わない
        • ドアPOI的な機能を車椅子モードで実現するためのトリック
      • 出入口情報にノードおよび施設のオブジェクトを登録(IDで入っているので、オブジェクトの参照にする)
      • 出入口情報の属するノードIDと出入口情報のマップ
    • プロパティに一時保管データをセットL.955

    • 各リンクのオブジェクトのソース、ターゲットノードをID->オブジェクトに更新 L.964

    • 各ノードに接続しているリンクのリストそれぞれについて L.968

      • ノードから見たリンクの方向でソート。真北(0)から時計回り順。
    • エスカレーターの属性設定 L.979

      • 今から進もうとするエスカレーターに対して
        • 左右のどちらか、もしくは両方に隣接したエスカレーターがあるかチェック(2.5m以内)
        • ある場合には、左右、同じ方向か逆方向か、上に行くか下に行くかを判定
      • エスカレーターを進む場合に注意喚起するため
    • L.1037 ~ L.1079 POIを最も近いリンクにマップする

      • 当初ナイーブに全てのPOIと全てのリンクの距離を計算していたが、マップの肥大化に伴って処理時間が大幅に長くなってしまったため、ある位置の近傍にあるリンクを計算するためにGKQuadTreeを使う
      • https://developer.apple.com/documentation/gameplaykit/gkquadtree
      • L.882 convertFromGlobalは緯度経度をアンカーを基準にメートルに変換する関数
      • データのx,yの最小、最大を求める L.1039
      • GKQuadTreeを生成 L.1056
      • 各リンクについて
        • リンクの両端の位置にリンクを登録
        • 両端の長さが3m以上ある場合、両端を1mずつ縮めた位置でリンクを登録というのを繰り返す
    • 各POI、各出入口情報に対して、最近傍のリンク(同距離で複数ある場合がある)を取得して、それぞれのリンクのpoiリストに追加する L.1082~L.1149

      • 最近傍で同距離: 50cm以内にあれば同距離とする
      • HLPPOIはリンク、HLPEntranceは両端ノードで距離を測る
      • TODO(BUG): リンクがリーフ(片方が終端)の場合に無条件で除外されているが、リーフが3m以上あるとおかしくなる気がする
  • - (NSArray*) nearestLinksAt:(HLPLocation*)loc withOptions:(NSDictionary*)option L.1155

    • 最近傍のリンクを取得するメソッド(上記GKQuadTreeに依存している)
プロパティ 説明
@property NavDestination *to 目的地
@property NavDestination *from 開始地点
@property BOOL previewMode プレビューモード
@property BOOL exerciseMode 練習モード
@property BOOL toolMode ツールモード(NavCogToolのとき)
@property NSString* userID サーバーに送信するuserID
[UIDevice currentDevice].identifierForVendor.UUIDString
@property HLPLocation *mapCenter 現在の地図の中心
@property (readonly) NSDictionary *buildingInfo 現在地の建物情報
@property HLPLocation *loadLocation データを読み込んだ場所
@property (readonly) NSDictionary *idMap オブジェクトのidとオブジェクトのハッシュマップ
@property (readonly)
NSDictionary<NSString*, HLPEntrance*> *entranceMap
HLPEntranceオブジェクトのハッシュマップ
@property (readonly) NSDictionary *poiMap HLPPOIオブジェクトのハッシュマップ
@property (readonly) NSDictionary *nodesMap HLPNodeオブジェクトのハッシュマップ
@property (readonly) NSDictionary *linksMap HLPLinkオブジェクトのハッシュマップ
@property (readonly) NSDictionary *nodeLinksMap あるHLPNodeに関連するリンクのリスト
@property (readonly) NSDictionary *linkPoiMap あるHLPLinkに関連するHLPPOIのリスト
@property (readonly) NSArray *pois 全てのHLPPOI
@property (readonly) NSArray *escalatorLinks エスカレータのリンク
@property NSTimeInterval start ナビゲーション開始時刻
  • 目的地(ナビ開始地点)のオブジェクト
  • プロパティ一覧
プロパティ 説明
@property (readonly) NavDestinationType type タイプ
@property (readonly) NSString* name 名前
@property (readonly) NSString* namePron 名前(よみ)
@property (readonly) NSString* _id identifier
@property (readonly) NSString* singleId 複数のidentifierがある場合に最初のid
@property (readonly) NSDictionary* filter 目的地リスト絞り込みに使う
@property (readonly) NSString* label 目的地リスト絞り込みのラベル
@property (readonly) HLPLandmark* landmark ランドマーク
@property (readonly) NSArray<HLPLandmark*>* landmarks 複数のランドマーク

NavDestinationType

定数 説明
NavDestinationTypeLandmark ランドマークによる目的地
NavDestinationTypeLocation 位置による目的地(現在地)
NavDestinationTypeSelectStart 開始地点を選択(未選択状態)
NavDestinationTypeSelectDestination 目的地を選択(未選択状態)
NavDestinationTypeLandmarks 複数ランドマークによる目的地(複数のトイレなど、一番近くに連れてく)
NavDestinationTypeDialogSearch 対話検索を表示する
NavDestinationTypeDirectoryItem 検索ディレクトリ
NavDestinationTypeFilter 検索フィルタ
Clone this wiki locally