パリ Google Photorealistic 3D Tiles 48.8584° N · 2.2945° E
React 19 · three.js ≥ 0.160 · ESM + CJS + types
React のための
リアルタイム
3D 地図
Real-time 3D cartography for React.
React がマウントしたあとは手を出さない命令型 Three.js エンジン。MapEngine がカメラ・タイル・レイヤーを保持するため、描画ループが再レンダーを待つことはありません。
npm i @pasquelin/map3d three react react-dom
- バージョン
- 0.6.0
- ピア依存
- react 19 · three ≥ 0.160
- ビルド
- ESM + CJS + .d.ts
- ライセンス
- PolyForm Noncommercial
ライブデモ
ブラウザーで試す
インストールもキーも不要。以下のデモはプッシュのたびに本リポジトリからビルドされ、GitHub Pages から直接配信されます。
ギャラリー
軌道上から歩道まで
ひとつのライブラリが降下のすべてを担います。軌道上の地球儀、広域のクラスタリング、屋根の稜線、足元の通り名。
-
12 700 km 地球儀から平面地図へ 楕円体フォールバック、賢いクラスタリング
-
9 km マーカーとクラスタ 再利用される DOM ノード、カテゴリー別に分割
-
3 km スカイラインと地平線 傾きがどうであれ、マーカーは画面上の大きさを保つ
-
900 m 座標グリッド 地表に沿い、画面上の線幅は一定
-
1,7 m 歩行者モード 目線の高さ、重力、衝突判定
機能
最初から入っているもの
ツールバー、コントロール、検索、座標グリッド、クラスタリング —— どの面も <Map> の内部にマウントされ、設定で制御されます。用意するのはデータだけです。
-
フォトリアル 3D、平面 2D
cesiumIonTokenCesium Ion 経由の Google Photorealistic 3D Tiles、トークンがなければ楕円体の地球儀、そして Google または自前の XYZ サーバーから配信される 2D ベースマップ。 -
DOM マーカーとクラスタ
markersLayer()ネイティブの hover・フォーカス・CSS アニメーションが効く本物の DOM ノード。プールされ、単一のtranslate3dパスで書き込まれます。動く対象は作り直されるのではなく滑ります。 -
描画エディタ
draw矩形と投げ縄による選択、リサイズと回転のハンドル、ツールごとのスタイル、取り消しとやり直し、GeoJSON の入出力。 -
ビューポート連動のライブデータ
useLiveData()カメラの移動に合わせたバウンディングボックス単位の再取得と、リアルタイム更新。 -
MIL-STD-2525D 記号
動的インポート9 MB の記号 SDK は必要になったときだけ読み込まれ、記号を表示しないバンドルには決して入りません。 -
型付きテーマとラベル
theme · labelsライトとダーク、prefers-reduced-motionに対応、すべて翻訳可能。ハードコードされた文字列も数値もどこにもありません。
実際の動作
道具が働いているところ
以下のスクリーンショットはすべて、上で開けるデモそのものです。モックアップはありません。
-
描画と選択リサイズと回転のハンドル、リアルタイムの選択パネル、取り消しとやり直し
-
MIL-STD-2525D パレット友軍・敵性・中立・不明 —— SDK は必要時に読み込み
-
カタログとデータソースソースを 1 つ有効にすると 252 地点が届き、クラスタが組み直される
-
ライトテーマ設定ひとつ —— 地図を含む UI 全体がそれに従う
クイックスタート
十数行でクラスタ付きの地図を
import { Map, markersLayer, type MarkerData } from '@pasquelin/map3d'
type Alert = { title: string }
const alerts: MarkerData<Alert>[] = [
{ id: 1, type: 'critical', position: { lat: 48.8566, lng: 2.3522 }, title: 'Intrusion', data: { title: 'Intrusion' } },
{ id: 2, type: 'info', position: { lat: 48.8606, lng: 2.3376 }, title: 'Patrol', data: { title: 'Patrol' } },
]
export function App() {
return (
<div style={{ height: '100vh' }}>
<Map
center={{ lat: 48.8566, lng: 2.3522 }}
zoom={13}
layers={[markersLayer<Alert>({ points: alerts, cluster: { enabled: true } })]}
/>
</div>
)
}
任意のプラグイン —— IGN Géoplateforme、Windy、屋内フロアプラン —— は別リポジトリにあり、プラグイン API で自作もできます。