大量の位置情報を地図上でうまく扱う為のデータ構造や描画方法の解説。
位置情報の格納がDBのレコードのような簡単な構造だと検索に時間がかかる。この時間を短縮する為に Quad Tree を採用している。
これは図のようにエリアを4分割して、それを再帰的に保持するデータ構造を持つ。構造体の定義はこう。
typedef struct TBQuadTreeNodeData { double x; double y; void* data; } TBQuadTreeNodeData; TBQuadTreeNodeData TBQuadTreeNodeDataMake(double x, double y, void* data); typedef struct TBBoundingBox { double x0; double y0; double xf; double yf; } TBBoundingBox; TBBoundingBox TBBoundingBoxMake(double x0, double y0, double xf, double yf); typedef struct quadTreeNode { struct quadTreeNode* northWest; struct quadTreeNode* northEast; struct quadTreeNode* southWest; struct quadTreeNode* southEast; TBBoundingBox boundingBox; int bucketCapacity; TBQuadTreeNodeData *points; int count; } TBQuadTreeNode; TBQuadTreeNode* TBQuadTreeNodeMake(TBBoundingBox boundary, int bucketCapacity);
最初が緯度・経度を持つ位置情報、2番めが境界、3番めがノード情報で自領域内の4つの子ノードを保持する。
1次元配列に比べて検索パスが激減するので効率よく目的の位置データを見つけ出せる。
その他、クラスタリングの方法(拡大レベルに応じて複数の位置情報を1つにまとめる)、アノテーション描画の最適化(1度置いたものを再利用)など、いろいろなテクニックについての解説がある。面白い。