📋 概要
Re:Earth 向け統合プラグイン「geo_suite」の開発基盤です。XYZ タイル管理やレイヤ一覧 UI、位置情報共有(Share)、Terrain/Shadow トグル、HTMLによるインフォメーションなど、Visualizer プラグインとして必要な機能を提供します。
レイヤの管理はインスペクターにより行われ、複数のレイヤを管理可能です。
📏 拡張経路のベクトルデータ容量目安(必読)
基本的にはこの制約を受けません。 geojson: / xyz: / 3dtiles: / base: など URL 指定レイヤーは Re:Earth 正規経路(data.url)で Visualizer ホスト側が直接 fetch・パースするため、後述の 4MB 上限は一切関係ありません。通常のレイヤー追加はこの経路です。
制約が掛かるのはプラグイン拡張経路だけ — geo_suite がブラウザ内 iframe でデコードして data.value として注入する経路(duckdb: / gpkg: / flatgeobuf: / parquet: / ファイル取込・kasczip メンバ)です。Re:Earth のプラグイン拡張は QuickJS (WebAssembly) コンテキストで実行され、全拡張が 1 つの wasm 線形メモリを共有します。iframe ↔ 拡張 ↔ ホスト間のメッセージは全て JSON.stringify → 共有メモリへの文字列コピー → JSON.parse で往復するため、巨大なペイロードは共有ヒープを圧迫し、OOM で拡張コンテキストごと全滅します。つまりCesium やブラウザの性能ではなく、Re:Earth サンドボックス固有の上限です。
このため拡張経路に「横断ペイロード 1回あたり 4MB(JSON サイズ)」のハード上限を設けています。超過したレイヤは追加されずレイヤ一覧に ⚠ グレーアウト行(理由付き)として残ります。
flowchart TB
subgraph R["■ Re:Earth 正規経路(サンドボックス非横断)"]
direction TB
A["geojson: / xyz: / 3dtiles:
URL 指定レイヤー"]
H["Visualizer ホスト
直接 fetch・パース
4MB 制約なし"]
A -- "data.url
URL 文字列のみ ctx 通過" --> H
end
subgraph E["■ プラグイン拡張経路(ctx 横断)"]
direction TB
B["duckdb: / gpkg: / fgb: / parquet:
ファイル取込・kasczip メンバ
(iframe でデコード)"]
L{"結果 ≤4MB ?"}
C["拡張ctx → ホスト
reearth.layers.add"]
T["⚠ トゥームストーン
グレーアウト行 + 理由"]
B -- "data.value
全ペイロードが ctx 横断" --> L
L -- "はい" --> C
L -- "いいえ" --> T
end
H --> OK["地図へ描画"]
C --> OK
style R fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
style E fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
style A fill:#e7f0ff,stroke:#1976d2,stroke-width:2px
style H fill:#e7f0ff,stroke:#1976d2,stroke-width:2px
style B fill:#ffe9d0,stroke:#ef6c00,stroke-width:2px
style L fill:#ffe9d0,stroke:#ef6c00,stroke-width:2px
style C fill:#ffe9d0,stroke:#ef6c00,stroke-width:2px
style T fill:#ffebee,stroke:#c62828,stroke-width:2px
style OK fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
linkStyle 0,4 stroke:#1976d2,stroke-width:2px
linkStyle 1,2,5 stroke:#ef6c00,stroke-width:2px
linkStyle 3 stroke:#c62828,stroke-width:2px
注入方式ごとの推奨容量
| 方式 | 上限 | 推奨の目安 |
|---|---|---|
geojson: <URL>(ホスト側が直接 fetch) |
4MB 制約なし | Visualizer が URL を直接取得するためサンドボックスを通らない。大きな GeoJSON はまずこの方式(検索インデックスは 8MB 上限の対象) |
ファイル取込 / geojson: の kasczip メンバ(デコード注入) |
4MB | iframe でデコード→ctx 注入のため制限あり。超えたら qgis: 外部ホスト参照へ |
duckdb: / sql: / gpkg:(クエリ結果) |
4MB / クエリ | bbox=auto(既定・表示範囲連動)+ where=/limit=/columns=/table= で絞れば 元データは数百MBでも可 |
flatgeobuf: / parquet:(全件デコード) |
4MB | 全件読みのため小〜中規模向き。大規模は duckdb: に置き換え推奨 |
qgis: ZIP ドロップ取込(eager メンバ) |
8MB 合計 | ZIP は URL 参照(ホスト配置)推奨 — メンバは遅延 fetch され本体容量を問わない |
| ベクター検索インデックス | 1ソース 4MB / 合計 8MB | 超過レイヤは検索対象外になるだけで表示は有効 |
運用の推奨
- まず「URL 経由」を選ぶ:
geojson:/3dtiles:/xyz:等の URL 指定レイヤーは Visualizer ホスト側が直接 fetch するため、サンドボックス上限を受けません。ファイルはドロップではなく CMS 等に置いて URL で参照するのが基本です。 - 総量の目安: ハード制約は「ctx を横断する結果 ≤4MB/回」のみ。レイヤ数自体に上限はありませんが、属性検索・一覧を快適に使うなら検索対象のベクトルデータ合計で数10MB 程度を目安にしてください。
- 大規模データは絞り込み前提で: 巨大ファイルは
duckdb:(GeoParquet/CSV/JSON)かgpkg:で、bbox=autoの部分読み込み+属性フィルタを使い、「クエリ結果だけが 4MB 以下」になるよう設計してください。元データのサイズは問いません。 - 配布は URL 参照で: プロジェクト一式は CMS 等に置いた
qgis: <.kasc または .zip の URL>を推奨。ZIP の中身はブラウザが直接 fetch するため容量制限を受けません(ただし ZIP 内 geojson 等は kasczip デコード注入のため 4MB/件)。 - 失敗は可視化されます: 上限超過レイヤは消えず、レイヤ一覧に理由付きのグレーアウト行として残ります(× で削除、条件を直して再読み込みで自動置換)。
技術詳細: docs/payload-limits.md
✨ 主な機能
⚙️ インスペクター一括設定
Inspector の一括設定で行単位(例: xyz: / info: / cam:)の設定が可能。似た構成の複数プロジェクトへの導入と設定作業が飛躍的に楽になります。タブバーの ⚙️(管理)ボタンからも設定テキストの確認・編集・適用ができます。
🗺️ ベースマップ
Inspectorの base: または xyz: 行でベースマップを一括指定できます。UI上部のドロップダウンから一つだけ選択してアクティブ化でき、ユーザーレイヤ一覧には表示されません。
🔧 システムレイヤ制御
Re:Earth側で登録済みのシステムレイヤ(プリセットレイヤ)も、Inspectorで名前を指定して表示/非表示を初期制御できます。
🗺️ レイヤー追加・管理
XYZタイル、3D Tiles、GeoJSONに加え、FlatGeobuf・GeoParquetをInspectorからURL指定で簡単に追加・管理できます(GeoJSONレイヤーとして追加され、属性検索・属性パネルも利用可能)。
🦆 DuckDB-Wasm クエリレイヤー
duckdb: 行で巨大な GeoParquet / CSV / JSON をブラウザ内の DuckDB-Wasm で SQL 絞り込みしてから追加します。初回読み込み時間の注意 →
📑 レイヤー一覧UI
読み込まれたレイヤーを視覚的に管理。表示/非表示の切り替えも直感的に操作できます。
📂 レイヤグループ化
/ (通常) や // (排他) を使ってレイヤを階層化。ラジオボタンのような排他制御も可能です。
詳細仕様書を見る →
🖼️ 凡例表示
legend: 行で画像URLを指定。凡例タブに凡例画像を一覧表示できます。
🔎 住所検索
住所・施設名で検索して該当地点にワンクリックでFlyToできます。Yahoo! ジオコーダ API または 地理院 住所検索 API が利用可能です。Yahoo を使う場合は Inspector に yahooAppId: YOUR_APPID を設定してください。
🧬 ベクトル検索
読み込んだ GeoJSON / CSV レイヤーの属性値をレイヤー・属性・文字列で検索し、該当する地物へ FlyTo できます。
� 属性・値一覧
表示中のベクトルレイヤーの属性と値を一覧表示。レイヤー選択・文字列検索・列ソート・行クリックによる FlyTo に対応します。検索タブと属性タブの両方から開けます。
�📷 カメラプリセット / 現在位置
登録した位置や、現在位置へワンクリックでFlyTo。ターゲットスコープで場所を確認できます。
ℹ️ Info表示
外部HTMLを情報タブに表示。プロジェクト説明やドキュメントを埋め込めます。
🔗 Share(位置情報共有)
タブバーの 🔗 ボタンで共有パネルを開き、現在のカメラ位置や選択地点の座標をURLパラメータとして生成・共有可能です。Kasugai を通じて、Google Earth や Yahoo! Map 等との位置情報連携に対応しています。注視点の Google Street View を開く「Street View」ボタンと、現在のビューを PNG として取得する「Capture」ボタンも備えています。
✈️ Fly モード(ルート飛行)
fly_geojson: 行で GeoJSON ルートを定義し、タブバーの ✈️ ボタンで Fly パネルを開いてルートに沿ったカメラ飛行を再生できます。速度・対地高度・ピッチ・ループ・搭乗/空撮視点の切替に対応し、地形追従(AGL)も可能です。「描画」ボタンで地図上にポリラインを描いてルートを保存することもできます。
🌐 Google Earth 連携
Basemap Selector の 🌐 アイコンをクリックすると、現在の視点(位置・高度・方位・傾き)を Google Earth 形式に変換し、新しいウィンドウで同じ角度から開きます。
🗺️ GeoJSON 3D ドレープ制御
GeoJSONレイヤーが 3D タイルに張り付くか、地面/Terrain に張り付くかをインスペクター行または「表示」タブのドロップダウンで切り替え可能です。
⛰️ Terrain/Shadow
地形表示と影表示のON/OFFをワンクリックで切り替え可能です。
🧭 ナビゲーション
コンパスでカメラ方位を表示・クリックで北にリセット。Visualizerと同期します。2Dはトップダウン表示に切替えをサポート。
📊 属性(Attr)表示
Re:Earth上の地物を選択した際に、その属性情報を一覧表示します。
🤖 AI チャット
Gemini の function calling で地図を自然言語操作できるチャットウィジェットです。詳細・APIキー設定方法 →
🔗 プラグインのインストール
📥 Step 1: プラグインをインストール
- Re:Earth Visualizer を開き、画面右上の「プラグイン」アイコンをクリック
- 「個人インストール済み」タブを選択
- 下記のリポジトリURLを入力
- インストール完了!
⚙️ Step 2: 設定方法
Inspector(歯車アイコン)の「一括設定」を開き、「設定テキスト」に以下の形式で行ごとに入力してください。
layer: 地理院タイル 標準地図 | off
xyz: OpenStreetMap | https://tile.openstreetmap.org/{z}/{x}/{y}.png
base: 地理院タイル 全国最新写真 | https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg | 出典:国土地理院 | max=18
base: OpenStreetMap | https://tile.openstreetmap.org/{z}/{x}/{y}.png | OpenStreetMap contributors | max=19
3dtiles: 東京都/千代田区(建築物LOD1) | https://assets.cms.plateau.reearth.io/assets/0e/e5948a-e95c-4e31-be85-1f8c066ed996/13101_chiyoda-ku_pref_2023_citygml_1_op_bldg_3dtiles_13101_chiyoda-ku_lod1/tileset.json | off
geojson: 東京都/行政区域 | https://assets.cms.reearth.io/assets/ef/b1d062-e44b-4a19-8ebe-5fafeeba05f2/%E8%A1%8C%E6%94%BF%E5%8C%BA%E5%9F%9F.geojson | on | terrain
flatgeobuf: 地名データ | https://example.com/chimei.fgb | on | terrain
parquet: 建物データ | https://example.com/bldg.parquet | off
duckdb: 大規模POI | https://example.com/poi.parquet | where=city='千代田区' | limit=5000 | covering=xmin,xmax,ymin,ymax | bbox=auto
background: #ffffff
lang: auto
info: https://re-earth-geo-suite.vercel.app/ryu.html
cam:東京駅|35.653108|139.761449|h=2200.6|p=-30
fly_geojson: 東京都心ルート | https://example.com/route.geojson | speed=30 | height=100 | pitch=-10 | loop=true | view=camera
legend: 凡例|https://re-earth-geo-suite.vercel.app/image/legend_sample.png
設定行は順不同です。背景色は background: で指定します。
- layer: 既存のシステムレイヤ名を指定し、
|offで非表示(|onで表示)に設定できます(例:layer: 地理院タイル 標準地図 | off)。 - xyz: 追加レイヤ (XYZタイル) です。タイトルとURLを `|` で区切ります。末尾に `|off` を付けると非表示で追加されます。
- base: ベースマップ用レイヤです。UI上部のドロップダウンに追加され、選択した1つだけが有効化されます。
- max=/min=/zoom=: XYZ タイルのズームレベル制限を指定します。例:
max=18、zoom=2-18。地理院タイルや OpenStreetMap には既知の最大ズームを自動で適用します。 - 3dtiles: 3D Tilesレイヤです。
- geojson: GeoJSONレイヤです。末尾に
| terrain/| 3dtiles/| bothを追加すると、3D タイルへのドレープ方法を指定できます(既定は「表示」タブのドロップダウン準拠)。 - flatgeobuf: / fgb: FlatGeobuf レイヤです。
flatgeobuf: 名前 | .fgb URL | on/off | classificationの形式で、ブラウザ内で GeoJSON にデコードして追加します(属性検索・属性パネルも利用可能)。classificationにはterrain/3dtiles/bothを指定できます。 - parquet: / geoparquet: GeoParquet レイヤです。形式は flatgeobuf と同じ
parquet: 名前 | .parquet URL | on/off | classificationで、ブラウザ内で GeoJSON にデコードして追加します。 - duckdb: 巨大ファイル向けの DuckDB-Wasm クエリレイヤです。
duckdb: 名前 | URL | オプション…の形式で、SQL 絞り込み後に GeoJSON レイヤーとして追加します。オプション:where=…(SQL 条件)・limit=…・format=parquet|csv|json・geom=…(ジオメトリ列名)・lon=…/lat=…(経度/緯度列名)・columns=a,b・covering=xmin,xmax,ymin,ymax(covering bbox 列名。指定すると行グループ単位で読み飛ばし)・bbox=auto|off(既定auto:カメラ移動に連動して表示範囲だけ再クエリする部分読込)・on/off・classification。注意: セッション最初のクエリ時に wasm 初期化で約15秒かかります(下記注意事項参照)。 - lang: プラグイン UI の言語を固定します。
lang: en|ja|zh-CN|zh-TW|ko|es|fr|de|it|pt|ru|nl|pl|uk|tr|ar|hi|id|th|vi。lang: autoまたは未指定でブラウザ言語を自動検出し、未対応言語は英語にフォールバックします。 - info: 情報タブに表示するWebページのURLを指定します。
- cam: カメラプリセットを指定します。
cam:タイトル|緯度|経度が最小形式で、オプションとして|h=高度m|d=方位°|p=傾き°を追加できます。 - legend: 凡例画像のURLを指定します。
- fly_geojson: Fly パネル(タブバーの ✈️ ボタン)に登録する飛行ルートを指定します。
fly_geojson: 名前 | GeoJSON URL または route:名前が基本形式で、オプションとしてspeed=km/h(負値で逆再生)・height=対地高度m・pitch=°・loop=true/false・view=camera|center(camera=ルート上を進む搭乗視点、pov/ride等の別名も可。center=後方上空から追う空撮視点、chase/follow/aerial等の別名も可)・step=サンプリング間隔mを追加できます。GeoJSON のproperties.flyに同名オプションを書くこともでき、heightReference: "MSL"で絶対高度ルートにできます。route:名前は Fly パネルで描画・保存したルートを参照します。末尾に| offで無効化。 - attrUrlOpen: 属性パネル内のURLクリック動作を切り替えます。
panel/newtabを指定できます。既定はnewtabです。 - 行プレフィックスの別名:
tile:=xyz:、3d-tiles:=3dtiles:、preset:=layer:、bg:=background:、fgb:=flatgeobuf:、geoparquet:=parquet:として解釈されます。 - geminiApiKey: / geminiModel: AI チャットウィジェットで使う Gemini API キーとモデル名(省略可)を指定します。キーは AI Chat ウィジェット側 Inspector の「Gemini APIキー」欄または ⚙ 設定からも入力できます(優先順: AI Chat Inspector 欄 > 設定テキストの
geminiApiKey:行 > セッション入力 > ブラウザ保存)。注意: Inspector に書いたキーは公開サイトでは全訪問者に配信されます。公開サイトではサーバーサイドプロキシ(環境変数GEMINI_API_KEY→/api/gemini)の利用を推奨します。
🔐 Gemini APIキーのセキュリティ状況
AI チャットの APIキーは設定経路ごとに公開範囲が異なります。ブラウザに届くキーは全て DevTools・通信内容(?key=... の URL)で閲覧可能=事実上公開です。盗用されるとあなたのクォータ・請求が第三者に消費されます。
| 設定経路 | 保存場所 | 誰が見えるか | 評価 |
|---|---|---|---|
環境変数 GEMINI_API_KEY → /api/gemini プロキシ | Vercel サーバー(環境変数) | ブラウザに一切届かない | 最も安全(公開サイトで推奨) |
| ⚙ 設定で「このブラウザに保存」OFF | 拡張メモリのみ | そのタブのみ(リロードで消滅) | 安全寄り |
| ⚙ 設定で「このブラウザに保存」ON | clientStorage(ブラウザ・オリジン単位) | そのブラウザのみ(共有端末では残存) | 中程度 |
AI Chat Inspector 欄 / 設定テキスト geminiApiKey: | Re:Earth プロジェクト | 公開サイトの全訪問者に平文配信 | 公開サイトでは非推奨 |
/api/geminiプロキシ自体は公開エンドポイントです(プラグイン iframe は sandboxed でOrigin: nullを送るためリファラー制限が不可能)。URL を知れば誰でもクォータを消費できるため、Google Cloud でキーに API 制限(Generative Language API のみ)と日次クォータ上限を必ず設定してください。- ブラウザからの直接呼び出しは Referer が付かないため、HTTP リファラー制限は使えません(掛けると全リクエストが拒否されます)。
- キーの送信先は Google(
generativelanguage.googleapis.com)かサイト自身の/api/geminiのみで、第三者へは送信されません。 - チャットの ⚙ 設定画面では、現在使用中のキーの出所(
inspector/storage/session/server proxy)が表示されます。
📦 ZIPファイル(配布用)
安定版の配布用 ZIP はローカルの以下フォルダに配置しています。Marketplace が利用可能になり次第、Marketplace での配布も開始します。
https://github.com/yamamoto-ryuzo/ReEarth_GeoSuite/tree/main/releases
ローカルにある ZIP を Re:Earth のプラグインインポート機能から指定してインストールしてください。
📦 ZIPファイル(開発版)
https://re-earth-geo-suite.vercel.app/artifacts/geo_suite.zip
※ こちらは Vercel による開発版 ZIP です。開発用の配布物であり、本番リリースとは別です。
📖 使い方
👁️ レイヤーの表示/非表示切替
- 左側のプラグインUI内で、各レイヤーの横にチェックボックスがあります。
- チェックボックスをON/OFFすることで、レイヤーの表示/非表示を切り替えられます。
🧩 グループルール
レイヤのグループ化はインスペクター内の区切り文字で指定します。ルールは以下の通りです。
/:一括・折りたたみ — グループ内をまとめてON/OFF。初期表示は折りたたみ。//:排他・折りたたみ — グループ内は排他(ラジオ)で、同時に1つのみON。初期表示は折りたたみ。バックスラッシュ:\:一括・展開 — グループ内をまとめてON/OFF。初期表示は展開(開いた状態)。ダブルバックスラッシュ:\\:排他・展開 — グループ内は排他(ラジオ)で、初期表示は展開。
補足: 単一の / と \ は通常グループとして同一視されますが、二重区切りの // と \\ は排他グループとして区別されます。バックスラッシュ由来の区切りは展開優先となります。
詳細はドキュメントを参照してください: layer-grouping-specification.md
Inspector での初期表示指定
Inspector で初期表示を指定するには、該当行のパイプ(|)で区切った任意の位置に ON / OFF を追記してください(大文字小文字は区別しません)。
xyz: Tokyo Basemap | https://tile.example/{z}/{x}/{y}.png | OFF
geojson: 避難所 | https://example.com/shelters.geojson | ON
3dtiles: 建物LOD | https://example.com/tileset.json | OFF
補足: 現在 visible=true/visible=false 形式は自動的にパースされません。必要であれば対応を追加できますので指示ください。
GeoJSON 3D ドレープ 設定例
geojson: 行の末尾に | terrain / | 3dtiles / | both を追加すると、そのレイヤーだけ 3D タイルへのドレープ方法を指定できます。
geojson: 東京都/行政区域 | https://example.com/行政区域.geojson | on | 3dtiles
geojson: 東京都/行政区域 | https://example.com/行政区域.geojson | on | terrain
geojson: 東京都/行政区域 | https://example.com/行政区域.geojson | on | both
省略時は「表示」タブの「GeoJSON 3D ドレープ」選択が適用されます。
✈️ Fly モードの使い方
- プラグイン UI のタブバーにある ✈️ ボタンで Fly パネルを開きます。
- ルートは
fly_geojson:行で定義したもの、または 「描画」ボタンで地図上にポリラインを描いて保存したもの(route:名前)をドロップダウンから選択します。 - 「ルートを表示」で選択中のルートを黄色ラインでプレビューできます(一時的な可視化のため、レイヤー一覧には表示されません)。
- 速度(km/h、負値で逆再生)・対地高度(m)・ピッチ・視点(搭乗/空撮)・ループを調整し、▶ 再生で飛行開始。⏸ 一時停止/■ 停止で制御します。入力値は再生中でも即時に反映されます。
- 「保存」ボタンで選択ルートの GeoJSON を
<ルート名>.geojsonとしてダウンロードできます。
※ 描画機能(スケッチ)や地形サンプリングは、利用している Re:Earth 環境のプラグイン API が対応している場合のみ有効です。非対応環境では該当ボタンが無効表示になります。
🤖 AI チャットの詳細
Gemini の function calling で地図を自然言語操作できるチャットウィジェットです。「東京駅に飛んで」「○○レイヤーを隠して」などの指示で、カメラ移動・地名検索・レイヤー操作・カメラプリセット・ベースマップ切替・Fly ルート再生・Terrain/Shadow・Street View・スクリーンショットなどを実行します。runCode ツールで複数ステップの処理も可能です。
- API キー(BYO)の指定経路: ウィジェットの ⚙ 設定 / AI Chat ウィジェット側 Inspector の「Gemini APIキー」欄 / Inspector 設定テキストの
geminiApiKey:行。優先順は「AI Chat Inspector 欄 > 設定テキスト > セッション入力 > ブラウザ保存」です。 - サーバーサイドプロキシ(推奨): ホスティング側で Vercel 環境変数
GEMINI_API_KEYを設定すると/api/geminiプロキシ経由になり、ブラウザにキーを配らずに利用できます。 - セキュリティ: Inspector に書いたキーは公開サイトの全訪問者に平文配信されます。公開範囲の比較表は Gemini APIキーのセキュリティ状況 を参照してください。
⚠️ 注意事項
プラグインはレイヤ追加時に一旦 visible: true で追加し、OFF 指定のあるレイヤは UI 側で短時間後に非表示にする仕組みです(Extension 側での遅延タイマーが利用できないための回避)。
システムレイヤはプラグインにて状態確認が制御不可であるため、基本的にはシステムレイヤ表示をONにし、制御は必ず本プラグインで行ってください。
⚠️ Google Photorealistic 3D Tiles 利用時の注意
Google Photorealistic 3D Tiles を使用している場合、追加したユーザーレイヤ(XYZタイルなど)が表示されないことがあります。
これは 3D Tiles が立体物として地面の上に描画され、地表に張り付くユーザーレイヤを覆い隠してしまうためです。
GeoJSON レイヤーについては、「表示」タブの「GeoJSON 3D Drape」ドロップダウンで terrain を選ぶか、インスペクター行に | terrain を指定することで、3D タイルではなく地面/Terrain にドレープさせることができます。
⚠️ duckdb: レイヤーの初回読み込み時間
duckdb: レイヤーは初回クエリ時に DuckDB-Wasm(wasm + worker + httpfs/spatial/parquet 拡張)をダウンロード・初期化するため、セッションの最初の読み込みに約15秒かかります。2回目以降はインスタンスが温存されるため約3〜10秒に短縮されますが、ブラウザ再起動・再訪では必ず再ダウンロードが発生します(Re:Earth プラグイン iframe が allow-same-origin なしのサンドボックスで、HTTP キャッシュ・CacheStorage・Service Worker が一切使えない構造的制約のため回避不可)。
小〜中規模データでは初回読み込みが速い geojson: / flatgeobuf: / parquet: の方が適する場合があります。フォーマットの選び方・実測値は DuckDB-Wasm 永続化検証・フォーマット比較レポート を参照してください。
🛠️ 開発について
本プロジェクトは AI コーディングエージェントによる完全自動開発を前提に設計されています。リポジトリの運用ルール(AGENTS.md)に沿って、エージェントがソース編集・ローカル動作検証・スクリーンショットによる UI 確認・コミットまでを自律的に実行します。人間は「何を作るか」を指示するだけで、ビルドや検証の手作業は不要です。
公開用サイトの配信には Vercel を利用しています。ここで公開しているサイトは 開発版(Developer Preview) として自動デプロイされています。開発版はテストや動作確認を目的としており、本番向けの安定版リリースとは別扱いです。ZIP や公開URLは予告なく更新・上書きされる可能性があります。
🤖 AI 完全自動開発の使い方
- リポジトリをクローンし、AI コーディングエージェント(Devin など)でプロジェクトを開きます。
- エージェントにやりたいことを日本語で指示します(例: 「duckdb: レイヤーに xxx オプションを追加して」)。エージェントは
AGENTS.mdのルールに従いgeo_suite/src/*.tsを編集します。 - ローカル動作検証は
npm run dev一発で全自動です。起動すると TypeScript の watch コンパイル →workbench/plugin-build/への出力 → Inspector テキストの自動反映 → 組込み Workbench(Re:Earth プラグイン開発用スタンドアロン Viewer)の自動リロードまでが回ります。ブラウザでhttp://localhost:8787/を開くと動作確認できます。 - エージェントは
npm run shotでヘッドレス Chrome のスクリーンショットとコンソールログを取得し、UI 変更を自分で目視検証します。node workbench/check_inline_scripts.jsで生成 HTML 内のスクリプト構文も一括検証します。 - 検証が済んだらエージェントがコミットし、
git push origin mainで Vercel が自動ビルド&デプロイします。ローカルでの本番ビルド(npm run build)は不要です(Vercel に任せます)。
git clone https://github.com/yamamoto-ryuzo/ReEarth_GeoSuite.git
cd ReEarth_GeoSuite
npm install
npm run dev # → http://localhost:8787/ で Workbench が自動ライブリロード
npm run shot # → エージェント用スクリーンショット取得(検証用)
※ 詳細な運用ルール・制約は AGENTS.md を参照してください。
自動デプロイ
このリポジトリは Vercel と連携しています。`main` ブランチに push すると Vercel が自動でビルドを実行し、公開用ディレクトリ(`dist/`)をデプロイします。ビルドの概要は次の通りです:
- `npm ci` による依存のインストール(`package-lock.json` を使用)
- `npm run build`(`package.json` の `build`)で TypeScript をコンパイルして `dist/` を生成
- 生成された `dist/` の中身が Vercel により公開される(`vercel.json` の `distDir`= `dist`)
変更を反映するには通常この手順で十分です:
git add .
git commit -m "update plugin"
git push origin main
# → Vercel が自動的にビルド&デプロイします
デプロイで 404 やエラーが出る場合は Vercel のデプロイログを確認してください。特に注目する箇所:
- `npm ci`(依存の取得)
- `npm run build` / `tsc`(TypeScript のビルド)
- `dist/` の生成と静的ファイルのコピー
必要であればエージェントがローカルでビルドし、`dist/` の中身や ZIP(`dist/artifacts/geo_suite.zip`)を作成することも可能です。また、デプロイを即時に反映したい場合は Vercel ダッシュボードの「Redeploy」や `vercel` CLI を使って手動デプロイしてください。