Maprayはベクトルタイルのレンダリングに対応しています。
ですが最新のv0.9.6では動かないので動くようにします。
エラー内容
Shader.ts:92 Uncaught Error: FRAGMENT_SHADER compilation failed: ERROR: 0:126: '[]' : Index expression cannot contain function calls
これは、シェーダー内の配列のインデックス([])指定に、関数呼び出しを含めることができないためです。
実際に原因となっているのは、symbol_sdfield.fragです。
の、以下のような記述。
sdistance[index( 0, 0 )] = texture2D( u_image, tc ).x;
ここでsdistanceとはサンプリングされた距離(3×3グリッド)を示しており、この数字はindex(x,y)で取得しなくても0-8の固定値(x + y * 3)ので、最初から指定してしまいます。
| Y (k1) | X (k0) | 計算式 (k0 + k1 * 3) | 結果 (index) |
|---|---|---|---|
| 0 (1行目) | 0 (左) | 0 + 0*3 | 0 |
| 0 (1行目) | 1 (中) | 1 + 0*3 | 1 |
| 0 (1行目) | 2 (右) | 2 + 0*3 | 2 |
| 1 (2行目) | 0 (左) | 0 + 1*3 | 3 |
| 1 (2行目) | 1 (中) | 1 + 1*3 | 4 |
その下、// 被覆率 ζ_b, ζ_u を計算においても、同様の修正を行います。さらにループも行っているのでそれぞれのパターンで定義してしまいます。
- k1=0, k0=0
- k1=1, k0=0
- k1=0, k0=1
- k1=1, k0=1
すると出るようになる。
地理院ベクターを表示させたサンプル
3DエンジンでMVT等のベクトルタイルを"ベクトル形式のまま"レンダリングできるのは素晴らしいですね。
COGに則った配信・レンダリングが実現でき、私は幸せです。
Cesiumではサードパーティライブラリを使用し"ラスター形式"でのレンダリングはできるのですが、、、まぁはい。またベクトル形式で実現しようと思ったのですがタイルのカリングが辛かったのを思い出しました。
今はポイントのみのサポートですが、ライン・ポリゴンも期待が高まります。

