Ortho Earth 2.1 を公開しました

文字を GPU へ移し、MapLibre の絵に近づけ、何も壊さなかった

2026-10-23 · Kenji Yoshida · @ortho-earth/globe · @ortho-earth/core

@ortho-earth/globe と @ortho-earth/core を 2.1 にしました。 2.0 で、やりたかった機能はひととおり揃いました。だからこの版は機能を足す版ではなく、今ある機能を磨く版です。 中身は大きく二つあります。長年気になっていた地図の文字の描き方を GPU に移したこと。それと同時に、MapLibre GL JS との互換をもう一段上げたことです。

ただ、この版でいちばん伝えたいのは、変えた量ではありません。これだけ下回りを入れ替えても、使い方は 2.0 のままで、壊れた所が一つも出なかったことです。 この地図エンジンは、思っていた以上にロバストに育っていました。

1. 地図の文字を GPU へ

地名、道路の名前、記号、道路標識。地図の上の文字は、これまでずっと Canvas2D で一字ずつ描いていました。 地球や建物は GPU で描いているのに、文字だけが CPU の 2D の絵を上から重ねている。描く順番も「地図を全部描いてから、最後に文字」と決まってしまうので、文字の上に線や塗りを重ねる MapLibre の style は、そのとおりの絵になりませんでした。文字の多い街では、文字を描くだけで重くもなります。 長いあいだ、ここがこのエンジンのいちばんの懸念でした。

2.1 では、文字を SDF(字の形を「縁からの距離」で持つ画像)の字形アトラスに焼き、WebGPU で一度に描くようにしました。 色・大きさ・縁取りはシェーダで決めるので、字は書体と字の組で一度焼けば済みます。点の注記、線に沿う注記、記号と道路標識、geojson の点の symbol 層、集約(cluster)の件数、星空の星の名前と月まで、文字は全部この同じ道を通ります。 真上から見ている間は、文字を style の層の位置に描くので、「文字の上に線」の style も MapLibre と同じ重なりになります。

文字だけでなく、毎フレーム 2D で上から重ね描きしていた残りの物も GPU へ移しました。集約の丸(map.gadget.cluster)、画面格子(screengrid)、CZML と GPX の軌跡、色が変わる線(line-gradient)、模様の線(line-pattern)です。 2D のまま残したのは、編集の道具と描き方を分け合っている注釈と画像の貼り付けの二つだけです。

2. MapLibre との互換

互換の物差しは、MapLibre 自身の公式例 139 本です。一本ずつ本物の MapLibre と ortho-earth で同じコードを走らせ、絵と答えが同じかを撮り比べて採点しています(採点の対象は 137 本)。結果は /maplibre で一本ずつ見られます。

段前回の撮り比べ(10 月 14 日)2.1(10 月 23 日)
3 同じ絵6679
2 同じ答え5047
1 動く2111
0 動かない00

「同じ絵」が 13 本増え、「動くけれど答えが違う」が半分になりました。効いたのは、文字を層の位置で描けるようになったことのほかに、次のような直しです。

3. 使い方は 2.0 のまま

これだけ中を入れ替えても、公開の口は 2.0 と同じです。2.0 で書いたコードは、そのまま 2.1 で動きます。速さと絵の正しさだけが上がりました。

npm i @ortho-earth/[email protected]
一つだけ名前が変わった所

map.gadget.cluster は、中で MapLibre と同じ集約の source と層を作るようになりました。そのため queryRenderedFeatures が返す層の名前が clusters/unclustered-point から gadget-cluster-clusters/gadget-cluster-unclustered に変わっています。この層名を指定して問い合わせていた場合だけ、書き換えてください。MapLibre と同じ書き方(addSource の cluster: true と addLayer)で作った集約は、自分で付けた層の名前のままです。

4. 試せるように作る:Design For Test

2.1 は、エンジンのいちばん奥にある描画の道を何本も入れ替えた版です。それでも、公式例 137 本の撮り比べで、前回より下がった例は 1 本もありませんでした。

これは運ではなく、設計の結果だと思っています。半導体の世界には DFT(Design For Test)という言葉があります。作ってから試し方を考えるのではなく、試せるように最初から設計に組み込んでおく、という考え方です。この工房のエンジンも、ずっとそうやって作ってきました。

半年かけて積み上げたのは、機能だけではなかったようです。試せるように作ってあるから、大きく変えても壊れない。その手応えを、この版で初めてはっきり感じました。

Kenji Yoshida @ Yokohama