OpenDrift漂流シミュレーションと暦・潮汐計算アプリの接続: GeoJSONブリッジの設計
JavaScriptで動く旧暦・潮汐計算ツールと、Pythonで動く漂流シミュレーションを、GeoJSONを介して接続する方法の記録。
opendriftpythonjavascriptgeojsondigital-humanities
台本(フルテキスト)
動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。
オープニング
- 旧暦・潮汐計算アプリとOpenDrift漂流シミュレーションを接続
- GeoJSONをブリッジとして使う設計
- うさぎ
- 今日はJavaScriptで動く旧暦・潮汐計算ツールとPythonで動く漂流シミュレーションをGeoJSONで接続した記録を紹介します。
- WhiteCUL
- OpenDriftというのは何ですか?
- うさぎ
- 海流や風のデータを使って物体の漂流経路をシミュレーションするPythonのライブラリです。
- WhiteCUL
- JavaScriptとPythonのシステムをどうやって繋いだんですか?
- うさぎ
- 共通言語は日付と座標だけです。JavaScriptが計算した出航日時をPythonに渡し、漂流経路のGeoJSONを返してもらいます。
- WhiteCUL
- GeoJSONを選んだ理由は何ですか?
設計とGeoJSON選択の理由
- Leaflet・MapLibreがGeoJSONをそのままレンダリング可能
- Python側に追加変換層が不要
- WhiteCUL
- GeoJSONのメリットを教えてください。
- うさぎ
- LeafletやMapLibre GL JS、Mapbox GL JSのような地図ライブラリがGeoJSONをそのままレンダリングできます。Python側に変換層が要りません。
- WhiteCUL
- ブリッジスクリプトはどんな処理をするんですか?
- うさぎ
- 220行強のPythonスクリプトです。CLI引数で日付と座標を受け取り、その月の気候値で漂流計算を回し、軌跡をGeoJSONに整形して出力します。
- WhiteCUL
- 出力にはどんな情報が含まれますか?
- うさぎ
- 各粒子の軌跡LineStringと現在ステータス、漂着・活動中の集計情報が含まれます。出航地点のPointも含まれます。
CLI使用方法と計算量
- 日付・座標・時間をCLI引数で指定
- 200粒子・10日間で約26秒・620KB
- WhiteCUL
- CLIの使い方はどうなっていますか?
- うさぎ
- python bridge.py --date 2025-05-15のように日付を指定して実行します。別の出発点と期間も--lonや--hoursで指定できます。
- WhiteCUL
- 計算にはどのくらい時間がかかりますか?
- うさぎ
- MacBook Pro M1での実測で50粒子・5日間なら約10秒・130KB、200粒子・10日間なら約26秒・620KBです。
- WhiteCUL
- WebAPIとして公開する場合は計算中の待ち時間が必要ですね。
- うさぎ
- そうです。リアルタイム性は高くないので、Web公開する場合は計算中の状態表示が必要になります。
可視化ビューワの実装
- MapLibreで粒子アニメーション再生ビューワを実装
- tails(軌跡)とheads(現在位置)を2ソースで管理
- WhiteCUL
- GeoJSONの動作確認はどうやったんですか?
- うさぎ
- MapLibre GL JSで粒子アニメーションを再生できる簡易ビューワを作りました。月別ボタンで気候値の異なる漂流結果を切り替えられます。
- WhiteCUL
- アニメーションの仕組みはどうなっていますか?
- うさぎ
- 軌跡tailsと現在位置headsの2ソースを使い分けています。毎フレームsetData()で更新する単純なループです。
- WhiteCUL
- ビューワはどれくらいの規模ですか?
- うさぎ
- 単一のHTMLファイルで完結しています。bridge.pyが出力したGeoJSONをdataディレクトリに置けば動きます。
旧暦変換とデータの制約
- 旧暦→新暦変換はJavaScript側でHuTime APIを使用
- 海流・風データは現代の気候値(1990年代以降)
- WhiteCUL
- 旧暦から新暦への変換はどこでやっているんですか?
- うさぎ
- JavaScript側でHuTimeのWeb APIを使って変換しています。Python側は旧暦のことを知らなくてよく、責任分界が明確になります。
- WhiteCUL
- 過去の旧暦日付を入力しても現代の気候値を使うということですか?
- うさぎ
- そうです。OSCARの海流もNCEP/NCARの風も1990年代以降の観測から作られています。時間軸が一致しない点は明示するのが妥当です。
- WhiteCUL
- サーバ配置の選択肢はどう考えていますか?
- うさぎ
- OpenDriftは依存パッケージが多いのでVercelのサーバレス関数は難しいです。FastAPIでラップして常駐型PaaSを利用するのが現実的と思っています。
まとめ
- 日付と座標のみを共通言語にJS⇔Pythonを接続
- GeoJSON出力でそのまま地図ライブラリに投入可能
- WhiteCUL
- 今日のまとめをお願いします。
- うさぎ
- JavaScriptの旧暦・潮汐計算アプリとPythonのOpenDrift漂流シミュレーションを、GeoJSONをブリッジとして接続しました。
- WhiteCUL
- 共通言語が日付と座標だけなのでシステムの分離が明確ですね。
- うさぎ
- 次のステップは暦・潮汐計算アプリ側に漂流地図を呼ぶUIを組み込む作業です。
- WhiteCUL
- ありがとうございました。