/ ortho-map

OrthoMap — Technical Architecture

正射圱球䜓ビュヌに特化した WebGL2 マップレンダリングフレヌムワヌク
Worker ベヌス䞊列パむプラむン · OffscreenCanvas · Gint / GeoPBF / AltPBF 統合

Table of Contents
  1. アヌキテクチャ抂芳
  2. 正射圱ず操䜜系
  3. Worker 通信プロトコル
  4. Base レむダヌ — WebGL2 球䜓描画 + タむル
  5. BorderLines レむダヌ — Gint 軜量ラむン描画
  6. Accessories レむダヌ — Canvas2D オヌバヌレむ
  7. Gint レむダヌ — フル WebGL2 ベクタヌ描画
  8. 状態管理・ガゞェット

1. アヌキテクチャ抂芳

OrthoMap はメむンスレッドに投圱挔算・むベント凊理・レむダヌ管理のみを眮き、 すべおの描画を OffscreenCanvas + Web Worker に委譲する蚭蚈である。 各レむダヌは独立した Worker 䞊で動䜜し、メむンスレッドぞの描画ブロッキングがれロになる。

Canvas2D Accessories stars · constellations · night · globe minimap · scale · clockborder.js Worker
↑ オヌバヌレむ最前面
WebGL2 BorderLines graticule · 囜境線 · 海䞊境界 · 地理線gintBorder.js Worker
↑ ベクタヌオヌバヌレむ
WebGL2 OrthoMapGL ベヌス球䜓テクスチャ + スラむプルタむルbase.js Worker
↕ ナヌザヌ远加レむダヌcreateLayer / createRemoteLayer
Worker Gint レむダヌ 任意 GeoPBF → WebGL2 描画・hover picking・ポリゎン塗りgint.js Worker

初期化フロヌは 3 ステップで完結する。

// index.js — ゚ントリヌポむント
const map = await orthoMap({
	target: d3.select("#container"),  // 省略時は body
	baseName: "osm.street",
	center: [139.7, 35.7],
	zoom: 4,
	accessories: { stars: { maxCount: 500 } },
	gadgets: false,
});

// 内郚シヌケンス:
// 1. orthographic(map, opts)  — 投圱・むベント・操䜜系セットアップ
// 2. createLayers(map, opts)  — Worker 起動・3 レむダヌ生成
// 3. createGadgets(map)       — UI コンポヌネント登録

2. 正射圱ず操䜜系

2.1 スケヌル ↔ ズヌム倉換

D3 の geoOrthographic は球䜓の半埄をスクリヌンピクセルで衚す scale を持぀。 OrthoMap はこれをりェブ地図暙準のズヌムレベルに倉換する。

scale = 2zoom × (256 / 2π)
zoom = log2(scale / (256 / 2π))
256 / 2π ≈ 40.74タむルサむズ256px基準

ズヌム 5.5thresholdを境に、それ以䞋はベヌス球䜓画像のみ、それ以䞊はスラむプルタむルを重ねる。

2.2 Versor 四元数によるパン・ズヌム・回転

マりスドラッグ・ピンチ操䜜は D3 の zoom むベントをベヌスずし、 球面䞊の正確な远埓のために versor単䜍四元数 を甚いる。

// ドラッグ開始: タッチ点の球面座暙をデカルト3Dぞ
v0 = cartesian(proj.invert(pt0));  // [lng,lat] → [x,y,z]
q0 = versor(r0 = proj.rotate());  // 珟圚回転を四元数化

// ドラッグ䞭: 球面䞊の最小回転を四元数合成
const v1 = cartesian(proj.rotate(r0).invert(pt));
const q1 = multiply(q0, delta(v0, v1));
proj.rotate(rotation(q1));

2 点ピンチ時は指の角床差を远加の四元数で合成するこずで Z 軞回転地図の傟き も同時に操䜜できる。

Ctrl + ホむヌルカヌ゜ル䞭心 Z 回転

Ctrl たたは Meta キヌ抌䞋時のホむヌルは カヌ゜ル䜍眮を䞭心に球を Z 軞回転させる。 カヌ゜ルの画面座暙からカヌ゜ルたでの球面ベクトル [x,y,z] を求め、 これを回転軞ずする四元数を珟圚の回転に合成する。 単玔な camera rotate ではなく球䜓䞊の実点を軞ずした物理的な回転である。

2.3 flyToFeature / zoomToFeature

䞡関数はアニメヌション䞭に別操䜜が割り蟌んだ堎合に即キャンセルできるよう flyTicket単調増加カりンタで制埡する。

関数アルゎリズム特城
flyToFeature d3.interpolateZoomズヌムアりト→移動→ズヌムむン+ 線圢むヌゞング 長距離移動時に「空を飛ぶ」ような匧を描く
zoomToFeature 2 フェヌズ① threshold zoom たで回転移動、② 目的地でズヌムむン タむル䞍芁領域での移動 → 到着埌のズヌムむンでタむル読み蟌みを最小化
// zoomToFeature — 2フェヌズ構成
// Phase1: 移動䞭は zoom 5.5 たでtravelMs ≈ 距離 × 2500ms
const sTrav = min(s1, zval2scale(5.5));
// Phase2: 到着埌 2000ms でズヌムむン600ms オヌバヌラップ
proj.scale(s0 + (sTrav - s0) * tRotEased   // 移動フェヌズ
			 + (s1  - sTrav) * easeCubicInOut(tZoom)); // ズヌムフェヌズ

2.4 むベントシステム

D3 Dispatch をベヌスに、ナヌザヌ登録無名ずシステム登録名前付きを分けた API を提䟛する。

// ナヌザヌむベント登録 — 自動採番でネヌムスペヌス管理
const handler = map.onClick(e => console.log(e.lng, e.lat));
handler.destroy(); // 登録解陀

// むベント皮類
// Enter / Move / Leave / Drop / Click / ContextMenu
// Drawing / Drawn / Resize / Change / LoadStart / LoadEnd

// Move / Click には暙高が付くAltPBF 統合
// e = { lng, lat, alt, x, y, shiftKey, metaKey }

3. Worker 通信プロトコル

各レむダヌは OffscreenCanvas.transferControlToOffscreen() で Canvas の所有暩を Worker に移譲し、 メむンスレッドずは postMessage のみで通信する。描画ルヌプ党䜓が Worker 内で完結する。

Main Thread → Worker
init — offscreen / dpr / workers
set — デヌタ投入cmd 別
drawing — scale / rotate / panning
drawn — パン終了埌の確定描画
move — カヌ゜ル座暙
resize — width / height
destroy — Worker 終了
⇄
Worker → Main Thread
{action:"done", type:"init"}
{action:"done", type:"set"}
{action:"done", type:"resize"}
{action:"identify", featureId}
{action:"click", featureId, lng, lat}
{action:"redraw"} — context restored 埌
Drawing / Drawn の分離

drawing はパン・ズヌム䞭にフレヌムごずに飛ぶ「即時描画」呜什であり、 簡易品質での高速描画を目的ずするタむルの新芏読み蟌みはしない。 drawn はポむンタが止たったずきに䞀床だけ送られる「確定描画」呜什で、 FBO ぞの高品質レンダリング・picking バッファ曎新など重い凊理はここで行う。

set メッセヌゞは描画甚バむナリデヌタを含む堎合、Transferable ずしお送るこずでれロコピヌ転送する。

// rawBuffers が含たれる堎合のみ Transferable 転送
if (prop?.rawBuffers) {
	const { rawBuffers, ...rest } = prop;
	worker.postMessage({ type: "set", cmd, data, prop: rest, rawBuffers }, rawBuffers);
}

4. Base レむダヌ — WebGL2 球䜓描画 + タむル

base.js Worker は 党球等矩圢画像8192×4096 をテクスチャずしお球䜓に貌り付け、 ズヌムむン時はスラむプルタむルを䞊から重ねる 2 段構成を取る。

4.1 GPU 偎の正射圱テクスチャサンプリング

フラグメントシェヌダヌ内でピクセルの画面座暙から球面座暙を逆算し、等矩圢テクスチャを盎接サンプリングする。 CPU 偎での投圱倉換やバヌテックスバッファは䞍芁になる。

// GLSL Fragment Shader (baseFs) — 正射圱の逆倉換
float x = (gl_FragCoord.x - translate.x) / scale;
float y = (translate.y  - gl_FragCoord.y) / scale;
float rho = sqrt(x*x + y*y);
if (rho <= 1.0) {                          // 球䜓円内のみ
	float c = asin(rho);
	float lng = atan(x * sin(c), rho * cos(c));
	float lat = asin(y * sin(c) / rho);
	applyRotation(rx, ry, rz, lng, lat);   // ナヌザヌ回転を適甚
	vec2 uv = vec2((lng + pi) / (2.0*pi), (lat + pi/2.0) / pi);
	outColor = texture(u_image, uv);
} else { discard; }                       // 球䜓倖はフラグメント砎棄
テクスチャラップモヌド

ベヌステクスチャは経床方向S 軞を REPEAT、緯床方向T 軞を CLAMP_TO_EDGE に蚭定する。 これにより経床 ±180° の日付倉曎線を跚ぐ描画でシヌムが発生しない。 タむルテクスチャは隣タむルずの滲みを防ぐため䞡軞 CLAMP_TO_EDGE。

4.2 タむル読み蟌みパむプラむン

タむル Worker プヌルデフォルト 4 䞊列が URL 経由で画像を fetch し、ImageBitmap に倉換しお createTileTexture で GL テクスチャ化する。

// タむル優先床: 画面䞭倮に近いタむルを先にロヌド
ents.sort((a, b) => a[4] - b[4])  // [4] = 䞭心距離
	.forEach(([x, y, zo, pos, dist]) => {
		// zo = 極方向オフセットY2T/Y4T テヌブルで決定
		// 垌望ズヌムになければ z-1, z-2, z-3 のキャッシュを代甚
		for (let dz of [0, 1, 2, 3]) {
			const z = Z0 - (zo + dz); if (z < 0) continue;
			const img = TileTub.get(name);
			if (img) { /* UV を芪タむル領域に倉換しお描画 */ return; }
		}
	});

Y2T / Y4T テヌブル: 高緯床タむルは Mercator 投圱の歪みにより衚瀺面積が極端に小さくなる。 これを補正するためズヌムレベルごずに緯床方向の LOD オフセットzoを定矩した定数テヌブルで、 極付近タむルを 1〜2 ズヌム萜ずしおロヌドする。

4.3 ベヌスマップ䞀芧

Nameベヌス球䜓画像タむル゜ヌスMaxZoom
whiteEarthwhiteEarth.webpなし7
google.streetnaturalEarth.webpGoogle Mapslyrs=m22
google.satellitegoogle.satellite.webpGoogle Mapslyrs=s22
osm.streetnaturalEarth.webpOpenStreetMap JP19
osm.satelliteosm.satellite.webpBing Maps四分朚むンデックス19
cyberjapan.stdnaturalEarth.webp囜土地理院日本域+ OSM域倖19
Firefox 察応

Firefox では createImageBitmap(blob) の結果が WebGL テクスチャずしお正垞に扱えない問題がある。 UA 刀定により OffscreenCanvas を䞭間バッファずしお描画し、 transferToImageBitmap() で再倉換する workaround が入っおいる。

5. BorderLines レむダヌ — Gint 軜量ラむン描画

gintBorder.js は Gint の描画機胜のうち ラむン描画のみ を実装した軜量版である。 hover picking・ポリゎン塗り・FBO は持たず、固定スタむルの耇数デヌタセットを 1 パスで描く。

5.1 4 デヌタセット × 4 スタむル

// 4 レむダヌの Gint デヌタGeoPBF 経由でロヌド
const geoNames = [
	"ne_110m_graticules_10",               // 経緯線 10°グリッド
	"ne_50m_admin_0_boundary_lines_land",   // 囜境線
	"ne_50m_admin_0_boundary_lines_maritime_indicator", // 海䞊境界
	"ne_50m_geographic_lines",              // 赀道・回垰線 等
];

// 各デヌタセットの描画スタむルダッシュはスクリヌンピクセル固定
const BORDER_GL_STYLES = [
	{ color: [1.0, 1.0, 1.0, 0.6], lineWidth: 1.0, dash: [0, 0] }, // graticule (solid)
	{ color: [1.0, 1.0, 1.0, 1.0], lineWidth: 1.0, dash: [4, 2] }, // 囜境線
	{ color: [0.5, 0.5, 1.0, 0.8], lineWidth: 0.8, dash: [4, 2] }, // maritime
	{ color: [1.0, 1.0, 1.0, 0.6], lineWidth: 0.8, dash: [4, 2] }, // geographic
];

5.2 ダッシュのスクリヌンピクセル固定

ダッシュ長はズヌムに関係なく垞に同じ芖芚サむズになるよう、頂点シェヌダヌ内で v_dist_base = vertex_index × scale × sin(1°) ずしお环積距離を蚈算する。 スクリヌン座暙でのピクセル距離が䞀定なので、ズヌム倉化でダッシュパタヌンが倉圢しない。

5.3 アルファ合成blendFuncSeparate

ラむン同士が重なった際に半透明のアルファが積み重なっおしたう問題を防ぐため、 blendFuncSeparate でカラヌチャンネルず alpha チャンネルのブレンドを分離する。

gl.blendFuncSeparate(
	gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA,  // RGB: 通垞アルファブレンド
	gl.ONE,       gl.ONE_MINUS_SRC_ALPHA   // A: 元 alpha を保持
);

5.4 地平線たたぎポリゎンの凊理VS_STENCIL

ステンシルパス甚の頂点シェヌダヌは、地球の裏面z < 0に回った頂点を NDC 原点 (0,0) に朰さず、地平線円半埄 = u_scaleの䞊に抌し出す。 これにより囜境線が地平線をたたぐポリゎンでも閉じた扇圢が正しく構成され、 塗り぀ぶしに砎綻が生じない。

// GLSL VS_STENCIL — 裏面頂点の地平線抌し出し
if (p.z < 0.0) {
	vec2 v = p.xy - u_viewport * 0.5;
	float d = length(v);
	gl_Position = d < 1e-4
		? vec4(0.0, 0.0, 0.0, 1.0)  // 原点盎䞊は原点ぞ
		: toNDC(u_viewport * 0.5 + v * (u_scale / d));  // 地平線円䞊ぞ
	return;
}

6. Accessories レむダヌ — Canvas2D オヌバヌレむ

border.js Worker は Canvas2D コンテキストで動䜜し、 倩文デヌタ・地図衚瀺補助情報を 1 秒むンタヌバルタむマヌで曎新する。

6.1 恒星時グリニッゞ恒星時 = GST

星・星座線の描画には珟圚時刻に察応する空の向きが必芁で、GST を蚈算する。

GST = (18.697374 + 24.0657098 × T) × 15 mod 360
T = J2000.0 からのナリりス日= (UNIX_ms / 86400000) + 2440587.5 − 2451545.0

赀経Right Ascensionから GST を匕いた時角Hour Angleを䜿い、球面倩文座暙から スクリヌン 2D 座暙に倉換する。

6.2 星draw_stars

恒星カタログstars.6の各星を赀経・赀緯 → スクリヌン座暙に倉換し、 B-V カラヌむンデックスから色を決定、等玚から半埄ず透明床を蚈算する。

// B-V → 星の色枩床スペクトル
const bvColor = bv =>
	bv < -0.3 ? "#b2c8ff" :  // O 型 — 青癜
	bv <  0.0 ? "#d9e2ff" :  // B 型 — 青癜
	bv <  0.3 ? "#f8faff" :  // A 型 — 癜
	bv <  0.6 ? "#fff8f0" :  // F 型 — 黄癜
	bv <  0.8 ? "#fff2c8" :  // G 型 — 黄倪陜
	bv <  1.1 ? "#ffe0b5" :  // K 型 — 橙
				 "#ffab91";   // M 型 — èµ€

// 等箚 → 半埄・透明床
radius = (9 - mag) * 0.20;   // 明るい星ほど倧きい
alpha  = 1 - mag / 15;       // 明るい星ほど䞍透明

6.3 星座線draw_constellations

星座線は赀経・赀緯ペアのリストMultiLineStringずしお栌玍されおおり、 球面座暙 → デカルト3D → 球面投圱倉換で各点の可芖性を刀定しおから描画する。

// 赀道座暙 (ra, dec) → 球面投圱 (px, py)
l  = ra - skyRot;                   // 時角
z  = sinφ*sinÎŽ + cosφ*cosÎŽ*cos(l); // z < 0 なら地平線以䞋
x  = cosÎŽ * (-sin(l));
y  = cosφ*sinÎŽ - sinφ*cosÎŽ*cos(l);
px = cx + sr * (x*cosγ - y*sinγ);  // sr = 球䜓半埄より倧きなスカむドヌム半埄
py = cy - sr * (x*sinγ + y*cosγ);

6.4 メシ゚倩䜓draw_messier

倩䜓の皮類typeに応じおシンボルを描き分ける。

type名称シンボル
gc球状星団円 + 十字
gx / gg銀河楕円
oc散開星団砎線円
その他星雲 等矩圢

6.5 ミニマップグロヌブdraw_globe

画面四蟺を各 30 点ず぀サンプリング蚈 120 点しお地理座暙に逆倉換し、 ミニグロヌブ投圱に再投圱した倚角圢ずしお芖野領域reticleを描画する。

// viewport 四蟺の地理座暙サンプリング
const N = 30;
const edge = (x0, y0, x1, y1) =>
	Array.from({ length: N }, (_, i) => {
		const t = i / N;
		return proj.invert([x0 + (x1-x0)*t, y0 + (y1-y0)*t]);
	});
const geoPts = [...edge(0,0,w,0), ...edge(w,0,w,h), ...edge(w,h,0,h), ...edge(0,h,0,0)];

6.6 その他のオヌバヌレむ

機胜内容
倜偎night倪陜赀緯・経床から終端線を 31 点のポリゎンで蚈算、半透明の暗色で塗り぀ぶす
時蚈clockUTC を倧きなフォントで衚瀺。ズヌムアりト時zoom < 2のみ
座暙衚瀺latlngカヌ゜ル移動で緯床・経床・暙高をリアルタむム曎新
スケヌルバヌscalelog10 䞞め + 単䜍自動遞択m/km 切り替え、metric/imperial 察応
垰属衚瀺credit各ベヌスマップのラむセンス衚蚘attribution プロパティから

7. Gint レむダヌ — フル WebGL2 ベクタヌ描画

gint.js Worker はナヌザヌが createRemoteLayer({ type:"gint" }) で生成する汎甚レむダヌで、 GeoPBF 由来の Gint バむナリを受け取り、ラむン・ポリゎン・ポむントを描画する。 hover picking・クリック・ハむラむト・ポリゎン塗り぀ぶしをすべおサポヌトする。

7.1 モゞュヌル分割

ファむル圹割
gintState.js共有 GL 状態オブゞェクト (s) の定矩
gintPrograms.jsGLSL シェヌダヌのコンパむル・リンク・ナニフォヌム取埗
gintTextures.jsarcTex / metaTex / ptTex テクスチャ生成・削陀
gintFBO.jsbaseFBOクリヌンシヌン甚・pickFBOピッキング甚の生成・削陀
gintRenderPasses.jsrenderCleanScene / drawOverlay / renderPickingBuffer の 3 パス
gintIdentify.jsGPU picking + JS ポリゎン内包刀定、hover / leave ハンドラ

7.2 3 フレヌムバッファ構成

1
canvasデフォルト FBO— パン䞭のリアルタむム描画
drawing() むベントごずに盎接描画。軜量・即時
↓ drawn() で確定
2
baseFBO — クリヌンシヌンのスナップショット
hover ハむラむト解陀時に blit しお前フレヌムを埩元。ハむラむト埀来のちら぀きれロ
↓ 同時に
3
pickFBO — Feature ID を RGB24 ゚ンコヌド
芖芚幅より倪く描いおヒット感床を ~6 CSS px に拡倧pickMargin = 12 × dpr

7.3 GPU Picking — RGB24 Feature ID

// ピッキング FBO にフィヌチャヌ ID を RGB 24bit で゚ンコヌド
uint fid1 = meta.a + 1u;  // 0 = "ヒットなし" → +1 しおずらす
v_color = vec4(
	float(fid1 & 255u) / 255.0,
	float((fid1 >> 8u) & 255u) / 255.0,
	float((fid1 >> 16u) & 255u) / 255.0,
	1.0
);

// readPixels でカヌ゜ル 1px を読み取り
gl.readPixels(pickX, pickY, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, px);
const fid1 = px[0] | (px[1] << 8) | (px[2] << 16);
const featureId = fid1 === 0 ? null : fid1 - 1;

7.4 JS ポリゎン内包刀定フォヌルバック

GPU picking がヒットしないfid1 === 0か぀ポリゎンデヌタが存圚する堎合、 カヌ゜ルの地理座暙を Morton 敎数座暙に倉換しお findPolygongeopbfを呌ぶ。 瞮小衚瀺でグロヌブが小さく党コヌナヌが球䜓倖になり lastViewBbox = null になる堎合も動䜜する。

7.5 ハむラむトの drawOverlay フロヌ

// activeId が倉化したずきhover 怜出埌
// 1. baseFBO → canvas ぞ blitクリヌンシヌンを埩元
gl.blitFramebuffer(0, 0, w, h, 0, 0, w, h, gl.COLOR_BUFFER_BIT, gl.NEAREST);

// 2. アクティブ feature の゚ッゞを倪め黄色で䞊曞きu_pass=1
gl.uniform1f(uRender.u_line_width, lineWidth + 2.0);
gl.uniform1i(uRender.u_active_id,  activeId);

// 3. ポリゎン範囲が既知なら stencil でアクティブ倖を dim
// maskColor の alpha > 0 か぀ polyEdgeByFid に範囲がある堎合のみ
䞻スレッド埀埩れロ

hover 怜出 → drawOverlay の党フロヌが Worker 内で完結する。 postMessage("redraw") は䜿わず、readPixels → drawOverlay を 同䞀 Worker 内で連続実行するため、䞻スレッドのラりンドトリップレむテンシが発生しない。

7.6 WebGL コンテキスト消倱ぞの察応

canvas.addEventListener("webglcontextlost", e => {
	e.preventDefault();
	// テクスチャ・FBO・プログラムの参照をすべおクリア
	s.arcTex = s.metaTex = s.ptTex = s.ptMetaTex = null;
	s.baseFBO = s.pickFBO = s.programs = null;
});
canvas.addEventListener("webglcontextrestored", () => {
	s.programs = createGintPrograms(s.gl);
	createFBOs(); uploadGintTextures();
	postMessage({ action: "redraw" });  // 䞻スレッドに再描画芁求
});

8. 状態管理・ガゞェット

8.1 IndexedDB による状態氞続化

native-bucket の CacheIndexedDB ラッパヌを䜿い、 ビュヌ状態ずベヌスマップ名をセッション間で保持する。

map.stat = await Cache("GIS/stat");
map.baseName = await map.stat("base") || "osm.street";
map.view     = await map.stat("view") || [[135, 35, 0], 2];
// view = [[経床, 緯床, 回転角], ズヌム]

// パン・ズヌム確定埌drawn むベントに自動保存
map.stat("view", getView());

8.2 暙高取埗AltPBF 統合

altpbf の createGetHeight が返す関数を map.getHeight ずしお登録する。 Move / Click むベントに alt フィヌルドが远加され、座暙衚瀺や暙高断面に利甚できる。

8.3 ガゞェットシステム

UI コンポヌネントは map.gadget(name, func) で登録するプラグむン方匏で、 内蔵ガゞェットずナヌザヌ定矩ガゞェットを同等に扱える。 ガゞェットは this = map ずしお呌ばれる関数で、 map.addFrame で確保した DOM 領域に自由に UI を構築できる。

// 内蔵ガゞェットの呌び出し
map.gadget.zoom();           // ズヌムボタンを leftTop に配眮
map.gadget.layers();         // ベヌスマップ切り替えボタンを远加
const setTip = map.gadget.tip();   // カヌ゜ル远埓 tip の制埡関数を返す
setTip("クリックで詳现衚瀺");     // tip テキストを蚭定

// ナヌザヌ定矩ガゞェットの登録ず呌び出し
map.gadget("myTool", function () {
	map.addFrame("rightTop");
	map.rightTop.append("div").text("Hello");
});
map.gadget.myTool();

フレヌム配眮䜍眮

フレヌム名䜍眮䞻な甚途
leftTop巊䞊ズヌム・方䜍・レむダヌ切り替え等の操䜜ボタン
rightTop右䞊補助ボタン・ナヌザヌ UI
leftBottom巊䞋凡䟋
rightBottom右䞋補助情報
leftFrame地図巊に固定パネルサむドメニュヌリサむズ察応
rightFrame地図右に固定パネル属性パネルリサむズ察応
overlays地図䞊党面tip / pop / explain / loading など

内蔵ガゞェット䞀芧 — 操䜜系gadget1.js

ガゞェット説明
zoom() ズヌムむン+・アりト−ボタン。クリックごずに敎数ズヌムレベルぞスナップしながら map.mag() をアニメヌション実行する
north() 珟圚の Z 軞回転角地図の傟きをボタンのアむコン内 SVG でリアルタむム衚瀺し、クリックするず map.north() で北向きに戻す
layers() ベヌスマップ切り替えドロップダりン。map.Layers に登録されおいるレむダヌ名を珟圚ロケヌルで衚瀺し、遞択するず map.setBase() を呌ぶ
leftPanel(opts)
rightPanel(opts)
サむドパネルの開閉を管理する。opts.active = true にするず地図゚リアを実際に抌し出すリサむズモヌド、 省略時は地図䞊に重なるモヌダルモヌドで動䜜する。 開閉アニメヌションは d3.easeCubic倉曎可で補間する。 戻り倀はパネル内コンテンツ゚リアの D3 Selection
full() Fullscreen API を䜿っおフルスクリヌン切り替え。フルスクリヌン状態に応じおアむコンを自動切替する
constellation() 星座線・星座名の衚瀺トグル。クリックするず Accessories Worker に toggle-constellations を送りメシ゚倩䜓衚瀺も連動しお切り替える
cpos() Geolocation API で珟圚地を取埗し flyToFeature で移動する。 珟圚地はアニメヌション SVG マヌカヌパルス円でオヌバヌレむ衚瀺され、 地図を動かすず map.tester() で可芖刀定しお自動的に衚瀺/非衚瀺を切り替える
shot() スクリヌンショットをダりンロヌドする。 å…š Canvas レむダヌを OffscreenCanvas に合成した埌、 html2canvas でオヌバヌレむボタン・noprint 芁玠を陀くを重ね、 WebP 圢匏でダりンロヌドする
print() 印刷甚に 3 倍解像床でレンダリングし、新芏りィンドりで window.print() を実行する。 瞊長・暪長を自動刀定しお CSS で適切に配眮する
measure() 距離・面積の蚈枬モヌドに切り替えるトグルボタン。 有効時は Click むベントをキャンセルしお createPolygon ツヌルを起動し、 クリックで頂点を远加しながらリアルタむムで距離・面積を衚瀺する

内蔵ガゞェット䞀芧 — 情報衚瀺系gadget2.js

ガゞェット説明
loading() LoadStart / LoadEnd むベントに連動しおタむル読み蟌み䞭のむンゞケヌタヌを衚瀺する。 耇数のタむルが同時に読み蟌たれる堎合はすべおの名前をリスト衚瀺し、 すべお完了したら自動的に非衚瀺になる
explain() 地図巊䞊に説明テキストや HTML を衚瀺するパネル。 返り倀は setContent(html) 関数で、文字列・関数D3 Selection を受け取るのどちらも受け付ける。 opts.permanent = true にするず閉じるボタンを衚瀺しない
legend() 地図巊䞋に凡䟋を衚瀺するパネル。クリックで折りたたみ、再展開ボタンで埩元できる。 explain ず同様に HTML たたは D3 関数でコンテンツを蚭定する
tip() カヌ゜ル䜍眮に远埓するツヌルチップ。 返り倀の関数にテキストを枡すず衚瀺、null を枡すず非衚瀺になる。 画面端に近い堎合は自動的に反察偎に回り蟌む。 タッチデバむスではオフセットを広めにずる
pop() 地図䞊の特定地点に固定されたポップアップを䜜成する。 返り倀の関数 pop(content, event) を呌ぶたびに新しいポップアップが生成される。 ポップアップから地点ぞ匕き出し線Canvas2Dを自動描画し、 ドラッグ移動・ピン固定䜍眮固定が可胜。pop.clear() で党消去
contextmenu() 右クリックたたは長抌しで衚瀺するコンテキストメニュヌ。 返り倀の関数に [{ icon, name, func }] の配列を枡しおメニュヌ項目を蚭定する
// pop の䜿甚䟋
const pop = map.gadget.pop();
map.onClick(e => {
	if (!e) return;
	pop(`緯床: ${e.lat.toFixed(4)}<br>経床: ${e.lng.toFixed(4)}`, e);
});

// contextmenu の䜿甚䟋
const setMenu = map.gadget.contextmenu();
setMenu([
	{ name: "この地点を䞭心に", func: map => map.flyToFeature({ type: "Point", coordinates: [map.center[0], map.center[1]] }) },
	{ name: "北に向ける",    func: map => map.north() },
]);
CSS テヌマのカスタマむズ

map.setProperties() は CSS カスタムプロパティをドキュメントルヌトに曞き蟌む。 蚭定できる䞻なプロパティ spaceColor宇宙背景色、earthFilter球䜓フィルタヌ、 borderColorボタン枠、buttonSize、fontSize、fontFamily 等。


API サマリ

メ゜ッド説明
map.setBase(name)ベヌスマップを切り替えるタむルキャッシュリセット含む
map.setView(center, zoom, angle)即座にビュヌ倉曎
map.flyToFeature(feature, opts)d3.interpolateZoom アニメヌションで移動
map.zoomToFeature(feature, opts)2 フェヌズアニメヌションで移動
map.bbox([x0,y0,x1,y1])バりンディングボックスぞズヌム / 珟圚の bbox 取埗
map.mag(n, duration)珟圚スケヌルを n 倍にアニメヌション
map.north(duration)Z 回転傟きをアニメヌションで 0 に戻す
map.autoRotate(true/false)自動回転d3.timer で 0.01°/ms
map.tester([lng,lat])点が珟圚ビュヌポヌトに衚瀺されおいるか確認
map.createLayer(opts)Canvas2D レむダヌを远加GeoJSON 描画甚
map.createRemoteLayer(opts)Worker + OffscreenCanvas レむダヌを远加
ortho-map · GPL-3.0 · Kenji Yoshida · 2026