任意の地点を中心に据え、
そこから世界を描き直す。

AAE(Arc Algo Engine)は、オフラインで動作する自作の地理空間エンジンである。 地図そのものを公開地理データから直接生成し、商用の地図配信サービスにも API キーにも依存しない。 外部へ地図タイルを取りに行かないのは、公開されている地理データから手元で直接地図を描画しているためである。

1地図をどう作るか

形式の異なるデータを 1 つに畳み、1 枚の世界画像に焼き、球面を回し、対応表で引き直す。この 4 段階でできている。

① 形式を畳む 公開地理データ → 固定形式(点列 + 境界) ② 一枚に焼く 一枚の世界画像 経度 = x / 緯度 = y ③ 球を回す 球面そのものを回転 任意の地点を中心へ ④ 引き直す 対応表から逆引き 出力画素 → 元画像の位置 画面 / 画像 一度だけ実行(中心に依存しない) 中心を変えるたびに実行(画素ごとに独立) ②で作成した世界画像は使い回す。中心を変えても①②はやり直さない。 ④は出力画素ごとに完全に独立した参照処理であるため、GPU で一括して並列計算できる。
① 形式を畳む 海岸線・行政界・河川・地理院タイル——出所も構造もばらばらの公開地理データを、頂点列とリング境界だけを持つ 1 つの固定形式(前処理済みバイナリ)へ統一する。経度 ±180° の継ぎ目をまたぐ図形はこの段階で東西に分割しておく。
② 一枚に焼く 統一したデータから、経度・緯度がそのまま画像の x, y に対応する 1 枚の世界画像(正距円筒図法:equirectangular)を、走査線塗りつぶしで生成する。極をまたぐポリゴンの処理もここで済ませる。
③ 球を回す 地球の球面そのものを回転させ、指定した任意の地点を中心へ持ってくる(SRP=球面回転投影)。
④ 引き直す 出力画素ごとに「②で焼いた 1 枚のどこを見るか」を対応表(LUT)から逆引きする。投影処理は「出力画素 = 中間画像[LUT]」という 1 本の配列参照になる。

2なぜ「逆引き」なのか

球面と平面のあいだに等長写像は存在しない(ガウスの驚異の定理)。どの投影法も、何かを保ち、何かを犠牲にする。

従来の方式は、多角形の頂点を平面へ投影してからポリゴンを塗る「順投影(forward)」である。だが中心を任意に動かせるようにすると、反子午線(±180°)や極をまたぐケースが頻発し、分割された線分を個別に閉じる処理が地図全体の整合性を壊してしまう。

開発当初に実際に出た症状は、「海と陸が反転する」「緯度 65° に水平の直線が走る」「30° に縦線、55° に斜め線が出る」といったもので、 一見すると互いに無関係なバグに見えた。だが原因はすべて1つだった。個別の実装ミスではなく、 「順投影でポリゴンを塗る」という方式そのものが抱える構造的な問題だったのである。

そこで順投影(forward)と逆投影(inverse)の役割を入れ替えた。あらかじめ正距円筒図法の1枚の中間画像に地図を焼き込んでおき、 出力画面の画素から元画像の座標を逆引きする——つまり、3DCG のテクスチャマッピングと同じ構造にしたのである。 これにより画素ごとの参照は完全に独立し、実行時の条件分岐は消える。

正直に書けば、これは継ぎ目や極の特異点を数学的に消す方法ではない。厄介な場合分けを、実行時のポリゴン塗りつぶしから、 中間画像の生成と対応表(LUT)の構築という地図の中心に依存しない前処理へ移動させただけである。 だが、前処理へ移したことで計算は最初の1回だけで済み、中心を変えても再計算は発生しない。 継ぎ目そのものが消えたわけではないが、中心を動かしても継ぎ目が移動しなくなったのである。

ここに来るまで

開発の最初の数か月は、描画の破綻と生成時間との戦いだった。対話的に動かし続けられる地図にするには、2つの条件を同時に満たす必要がある。 中心をどこへ動かしても描画が破綻しないことと、1フレームごとに作り直せるほど高速であることだ。 どちらか片方だけでは、「破綻した地図が高速に出る」か、「正しい静止画が紙芝居のように並ぶ」かのどちらかにしかならない。

時期状態
はじめ簡単にできると思っていた。1 枚作るのに数分かかり、角度を変えるとポリゴンが破綻した。順投影のまま、中心ごとに変わる継ぎ目と極の場合分けを追いかけていた。6 回作り直しても安定しなかった
2026-02 末「面積比の改善・横スクロール・大陸の向き」の 3 つは同時に満たせないと認め、球面回転(SRP)を本命にした
2026-03 中旬対応表(LUT)による逆引きの経路を 3 日で通した。投影が「表の差し替え」になり、破綻の問題は構造ごと消えた。この時点で 1 枚の合成は約 17 秒
その後残ったのは速度だけ。GPU 化・キャッシュ・高精細描画の分離と積み上げて、中心変更から表示まで 16.4 ms(1920 × 1080・RTX 4000 SFF Ada・中央値)
任意の地点を中心にした正距方位図法自体は、無線通信の方位図や航空路線図として昔から使われてきた。 AAE が異なるのは、中心を対話的に動かし続けても地図が破綻せず、変化の過程を連続して観察できる点にある。

3中心と投影法を、独立に選ぶ

対応表(LUT)を作り直せば、中心も投影法も切り替わる——すべて同じ 1 枚の中間画像から。

現在 20 種類の投影法を実装しており、中心と投影法は独立に選べる。エンジン側に図法ごとの条件分岐を持たず、各図法が申告する属性(背景面を持つか・既定の中心経度など)で処理を切り替える。新しい図法を足しても、既存の経路には一切触れない。

この方針はコードの形にも出ている。20種類の図法クラスは1つの基底クラスから1段階で派生しており、 本番コード全体を見てもクラス継承は最深 2 段、3 段以上は 0 件に抑えられている。 分岐を深い継承階層で表現していないので、構造が複雑にならない。
マドリードの経度を中央に置いた通常のメルカトル図法。

赤道が水平のまま。等角航路(破線)が直線になる。

マドリードを投影の赤道に置いた斜軸メルカトル図法。大陸の配置が通常の世界地図と大きく異なる。

同じ図法・同じ路線。球面を回してからメルカトル図法に通すと、マドリード周辺が最も歪みの小さい場所になる。

2 枚の違いは投影前の球面回転 R だけである。図法のコード自体はまったく同じものが走っている。 衛星画像: NASA Blue Marble

20 の投影法を見る →

4N × M → N + M

中間表現を挟む構造は、ベースマップの描画だけでなく、上に重ねる動的データの側にも同じように効く。

入力 N(データ源)と出力 M(図法・画像・動画・他システム)を直接結べば N × M 本の配線が要り、追加のたびに組み合わせが増える。 間に共通の中間表現を挟めば N + M 本に収まり、追加コストが「積」から「和」に下がる。 コンパイラの IR(中間表現)が複数の言語と複数の CPU をつなぐのと同じ構図である。

入力(N) 中間表現 出力(M) 航空機 船舶 地上局 衛星 サイバーイベント 次の軸 1 つのレコード型 に正規化する 画像 動画 他システム 直接つなぐと 5 × 3 = 15 本の配線が要る。中間表現を挟むと 5 + 3 = 8 本になり、どちらを足しても線は 1 本ずつしか増えない。

通信方式も中身も異なるデータ——航空機や船舶の位置報告、地上局の発信、軌道要素から計算した衛星の位置、 ファイアウォールのログに由来するサイバーイベント——は、すべて種別(kind)を付与して同じ 1 つのレコード型に正規化される。 現在は 5 軸を実装している(詳細は移動体・イベントを参照)。 新しい機器やプロトコルが来ても、種別を足して受信部を書くだけでよい。

中間表現は 1 層ではない。地理データは頂点列とリング境界からなる固定形式へ、 移動体・イベントは種別付きの共通レコード型へ、地図投影は1枚の正距円筒画像と対応表(LUT)へ—— これら3つの層すべてが「共通の形に畳んでから、変換する」という同一の思想で設計されている。

55 系統のモジュール体系

エンジンの中核(基盤)は凍結し、その周りを差し替え可能にする。

差し替え可能 CORE 凍結 GEO PROJ RT SEC 周囲の 4 系統は追加しても差し替えてもよい。中央の CORE は凍結してあり、外側で何が増えても手を触れない。
系統役割差し替え
CORECore球面回転・LUT 逆投影・レイヤー合成・描画の基盤(=中間表現の処理系)不可(凍結)
GEOGeographic地理データの前処理・構築(海岸線・地形・タイル → 固定形式)可
PROJProjection投影法・視点制御(任意中心・20 図法)可
RTTracks移動体の位置(航空機・船舶・地上局・衛星)可
SECSecurityサイバーイベント(ログ収集 → GeoIP による地理化 → 人の承認を経たファイアウォール制御)可
本サイトで主に説明しているのは地図を描く部分——CORE・GEO・PROJ・RT である。SEC は入力の 1 軸として同じ中間表現に乗る。基盤を凍結して周囲を差し替え可能にしておくと、描画の外側で何が増えても中間表現より下には触らずに済む。

6オフラインであること

外部のタイルサーバーに問い合わせない。地図はすべて手元で焼く。

これは単なる利便性のためではなく、アーキテクチャから導かれる必然の帰結である。地図の中心を任意の場所へ滑らかに動かすには、 中心が移動するたびに画面の全画素を引き直す必要がある。その参照先が手元のメモリに無ければ、対話的な速度にはならない。 外部へタイルを取りに行かないのは、ネットワーク越しに取りに行けないほど高速に動かしたいからである。

代わりに、引き受けたもの

ポリゴンの継ぎ目は、正距円筒図法(equirectangular)の経度 ±180° に一度だけ固定して焼き込む。そのため中心をどこへ動かしても、継ぎ目が暴れて破綻することはない。 その代わり、地図の最大解像度は「中間画像を焼いた時点」で決まる。極端に拡大すれば画像のピクセル(粒)が見える。 「任意の中心」と「対話的な描画速度」を得る代わりに、「無段階の拡大解像度」を手放す——AAE はその明確なトレードオフの上に成り立っている。 なお、手放したのは中間画像の解像度であって、幾何学的な位置関係ではない。どの地点が中心からどの方角・距離にあるかは、対応表(LUT)とベクタ投影が正確に保っている。

7CUDA の採用理由

対応表(LUT)による逆引きは、出力画素ごとに完全に独立した演算である。

1 枚あたり数百万画素を、中心が変わるたびに全画素引き直す。CPU の逐次処理では、 マウス操作に合わせて地図を滑らかに動かす速度には届かない——つまり「任意の中心を対話的に動かす」という要件そのものが、GPU による並列演算を要求しているのである。

GPU 側の処理は 2 層でできている。

層中身使いどころ
配列演算array ops CuPy(NumPy と同じ記述方法で GPU 配列を操作) 対応表(LUT)の生成、観測点を平面座標へ投影する計算
自前のカーネルcustom kernels 手書きの CUDA C(十数本)。コンパイルと起動は CuPy が担う 走査線の塗りつぶし、サンプリング(画素値の取得)、レイヤー合成、点と線の描画

分かれ目は処理の形にある。すべての画素や点に同じ数式を一律に適用する処理であれば、CuPy の配列演算で簡潔に書ける。 一方、走査線塗りつぶしや線分描画のように要素ごとにループ長や手順が変わる処理は配列演算に向かないため、 CUDA C で専用カーネルを書いて CuPy から呼び出している。他の複雑な CUDA 経路は使っていない。

すべての処理を GPU で行っているわけではない。塗りつぶし・LUT 生成・サンプリング・レイヤー合成は GPU で行うが、 前処理でベクタ線を中間画像に焼き込む工程と、地図上の文字ラベルの描画は CPU で行っている。 GPU と CPU は設定で切り替え可能で、GPU を搭載していない環境でも同じ地図を出力できる設計になっている。 ただし現在 CPU モードは一部改修中であり、GPU モードを標準としている。

8なぜ既存の地図サービスは任意中心をやらないのか

技術的にできないからではない。中心を固定した静的タイルを 1 セット焼いて全員に配る方が、桁違いに安いからである。

イコールアース図法のような世界地図であっても、中心を固定すれば投影後の平面は 1 枚の静止画であり、z/x/y のタイルピラミッドに分割すること自体はできる。それにもかかわらず Web メルカトル(EPSG:3857)が基図のタイルに選ばれたのは、「等角(どのズームでも形が局所的に正しい)」「円筒(タイルの正方形格子が経緯線と揃う)」「ズーム間で自己相似」の 3 条件が揃い、どこまで拡大しても破綻しないタイルを作れる図法が他に無かったためである。

理由中身
タイルは「配信」の単位delivery, not rendering 1 つのタイルピラミッドを一度焼けば、全世界のユーザーに同じ静的ファイルを CDN から安価に配れる。中心を変えられる地図は「操作する人ごとに別の絵」になるため、この大量配信モデルが成り立たない
主用途はナビゲーションlocal navigation 地図利用の大半は「今いる街の交差点で右に曲がる」。求められるのは局所の形が正しいこと(等角)と、「北が上」という共通の慣習であり、地球規模で距離や面積を正しく見たい人は少数に限られる
格子が索引を兼ねるgrid as index z/x/y は描画だけでなく、空間データの分割・検索・差分更新・キャッシュの鍵になっている。EPSG:3857 を前提にしたエコシステムが 20 年分積み上がっている
端末の GPU 性能client GPU 端末側で毎フレーム再投影するには、全データをベクタや生タイルで保持し、毎フレーム座標変換する計算力が要る。近年はズームアウト時に地球儀(球体)を表示したり、低ズーム時だけ図法を選べたりするサービスも登場したが、拡大すればすべて通常のメルカトル図法に戻る。
AAE は逆を採る。地図タイルは投影後の平面ではなく投影前の経緯度(球面側)で保持し(詳細は地理院タイルと LOD)、 最後に図法と中心を適用して画面へ引き直す。10億人に同じ地図を配る代わりに、手元の1台の GPU で1人のユーザーが任意の中心へ地球を回す—— 航空・海事・衛星追跡・地球規模の現象解析といった、特定の専門用途に向けた設計である。