CustomLayerを定義して、自前のシェーダで実装する方法が一番低レベルで処理することができる。頂点シェーダにおいて、x座標とy座標はウェブメルカトル次数0のときの座標に変換すれば位置が決まる(0から1の範囲の小数)。
z座標の変換にはy座標を使う。xyはウェブメルカトルのポイント座標、zはメートルで与えられると仮定する。
- 出力xy座標は入力xy座標を当該ウェブメルカトル次数でのポイント座標の最大値(2**ウェブメルカトル次数)で割り算する。
- y座標を緯度に変換する。
- 当該緯度で地球を輪切りにした円周を求める(単位メートル)。
- 出力z座標は入力z座標を上記の円周で割り算して求める。
理屈としてはこれであっているはずだが、微妙に位置がズレている気がする。
3次元点群と言っても単にデータを一括ロードするのではなく、タイル分割した点群データを使いたい。その場合はDeck.glと組み合わせることで実現できるらしい。
https://dev.to/hfu/how-to-use-maplibre-gl-js-with-3d-tiles-pnts-g4h
ただしこれは3D Tilesの利用。点群PNGタイルを適用するためにはDeck.glのコードを読んで点群PNG用のコードを書く必要がある。かなりの作業量になりそう。