可視化の原理

Sakurajima — How It Works

基盤共通アーキテクチャ

このアプリは「Pythonサーバ(データの取得・整形)」と 「ブラウザのGPU(描画とシミュレーション)」の二層でできています。 サーバは気象庁・国土地理院・衛星データの各APIから生データを取り寄せ、 ブラウザが扱いやすいJSONや画像(テクスチャ)に変換して渡します。

気象庁 XML/API 国土地理院 標高タイル 衛星データ (AWS/NOAA) Python (aiohttp) が整形・キャッシュ ブラウザ WebGL2 が毎フレーム描画

3D地形 — 標高タイルの解読

ベースの地形は国土地理院の標高タイル(dem_png)から作ります。これは標高値を PNGのRGB値に符号化した特殊な画像で、1ピクセルごとに 標高 = (R×65536 + G×256 + B) × 0.01 m と解読できます。 鹿児島周辺の約40枚のタイルをつなぎ合わせて解読し、512×512分割の3Dメッシュを持ち上げ、 同じ標高データをGPUにも渡して「粒子が地面に当たったか」の判定に使います。 高さは視覚効果のため2.3倍に誇張しています。

GPUパーティクル — 数十万個を毎秒60回動かす仕組み

降灰52万個・海流26万個という粒子数は、CPUで1個ずつ計算していたら間に合いません。 そこでGPGPU(GPUによる汎用計算)を使います。ポイントは 「粒子の状態を画像として持つ」ことです。

1024×512ピクセルの浮動小数点テクスチャを用意すると、各ピクセルのRGBAに 「粒子1個の位置(x, y, z)と年齢」を記録できます(1024×512 = 524,288粒子)。 毎フレーム、GPUのシェーダ(画像処理プログラム)がこの「状態画像」を読み、 風で流し・重力で沈め・寿命が来たら火口に戻す、という計算をして 新しい状態画像に書き出します。これを2枚のテクスチャで交互に繰り返すので 「ピンポン・テクスチャ」と呼ばれます。描画時は各粒子がこの画像から自分の位置を 読み取って光る点として表示されます。すべてGPU内で完結するため、 52万粒子でも60fpsで動きます。

前提データの時点・更新間隔と、演出との境界

「画面に出ている値はいつ時点のものか」は、可視化を読み解くうえで最初に確認すべき点です。 元データが作られる間隔、サーバのキャッシュ、クライアントの再取得間隔が積み重なって 画面に届くまでの遅れになります。

データ別の一覧

データ提供元元データの間隔サーバのキャッシュ 画面の再取得画面に出る値の時点
降灰予報(定時)VFVO53気象庁 防災情報XML 1日数回の定時発表5分5分ごと 直近の発表(発表時刻をHUDに表示)
アメダス 風向・風速気象庁 bosai API 10分値60秒60秒ごと 概ね5〜15分前の実測(観測時刻をHUDに表示)
標高タイル国土地理院 ほぼ更新なし24時間起動時のみ
Sentinel-2 L2AAWS Open Data (Earth Search) 同一地点は2〜3日おきに撮像6時間起動時のみ 直近の低雲量シーン(撮像日時をHUDに表示)
地表面温度 Landsat 8/9
C2 L2 ST_B10
USGS / Microsoft Planetary Computer 同一地点を8〜16日おきに撮像6時間起動時のみ 直近で桜島上空が晴れていた撮像(日時をHUDに表示)
地表面温度 Sentinel-3 SLSTR
L2 LST
Copernicus / Microsoft Planetary Computer ほぼ毎日通過(昼・夜)3時間起動時のみ 直近の日中(現地9〜15時)の便(日時をHUDに表示)
海面水温 MURNASA JPL / CoastWatch ERDDAP 日次3時間起動時のみ 1〜2日前の解析値
クロロフィルa VIIRSNOAA / CoastWatch ERDDAP 日次(DINEOF)、欠測時は週間合成3時間起動時のみ 1〜3日前
海面流速(地衡流)NOAA CoastWatch(衛星高度計ブレンド) 日次NRT3時間起動時のみ 1〜3日前
海面流速(SMOC)
登録制・任意
Copernicus Marine(CMEMS) 毎時(潮汐流込み)3時間起動時のみ 約1時間前(設定時はこちらが優先)
海面水温(ひまわり9号)
登録制・任意
JAXA ひまわりモニタ(P-Tree) 毎時3時間起動時のみ 約1時間前(雲域はMURで補完)
潮位(鹿児島)気象庁 潮位表 毎正時の推算値・年間表6時間6時間ごと 現在時刻に内挿(推算値なので遅れなし)

下2行は無料登録が必要な任意のソースです。認証情報を設定したときだけ有効になり、 取得できなければ自動的に上の無認証データへ戻ります。 いまどちらを使っているかは、画面右上の「海流」欄と凡例下部の「データ時点」に出ます。

アメダスの風向・風速は「10分ごとに作られるデータ」を、気象庁側の公開に数分の遅れを挟んで 取得しています。したがって画面の風はリアルタイムそのものではなく、直近10分程度の実測です。 HUD右上の「アメダス観測」欄が、いま表示している値の観測時刻です。

「黒潮・海況」は同時刻の姿ではない — 合成表示であること

海況タブの3つの層(海面水温・クロロフィルa・海面流速)は、 別々の衛星が別々のタイミングで観測したものです。それぞれ「取得できる最新」を使うため、 重ね合わせた画は厳密には同時刻には存在しなかった合成になります。

観測の仕組み典型的な遅れなぜその遅れになるか
海面水温 MUR複数衛星の日次解析1〜2日 複数センサを統合して格子化する処理に時間がかかる
クロロフィルa VIIRS極軌道衛星の可視光1〜3日 昼間・雲なしでしか測れない。1日1回の通過を待ち、欠測はDINEOFで補完する
海面流速衛星高度計から計算する地衡流1〜3日 複数の高度計の軌道データを集めて日次で合成する
画面右上の「層どうしの時刻差」に、そのときの最大の開きを表示しています。 12時間を超えると琥珀色で警告し、凡例下部にも 「3層は別々の時刻の観測を重ねた合成表示で、ある一瞬の海の姿ではありません」と明示します。

新しさを取るか、時刻の整合を取るか — ?ocean=

この2つは同時には満たせません。URLパラメータで切り替えられるようにしています。

モード取得の仕方実測例(2026-08-22 12時時点)向いている用途
?ocean=latest
(既定・省略可)
各層それぞれの最新 水温 8/20 09Z / 藻類 8/19 12Z / 海流 8/19 00Z
時刻差 33時間
できるだけ新しい海況を見たいとき
?ocean=aligned 3層に共通して存在する最新日に揃える すべて 8/19(09Z / 12Z / 00Z)
時刻差 12時間(水温は1日古くなる)
展示で「同じ日の海」として説明したいとき

整合モードは、まず3データセットの時間軸の末尾を問い合わせて (?time[last-7:last])、日付集合の共通部分の最大値を取り、 各データセットのその日の時刻を指定して本取得します。 共通日が見つからないときは自動的に既定の動作へ戻ります。

整合モードでは登録制データソース(CMEMS・P-Tree)を使いません。 毎時のデータを日単位に丸めても意味がないためです。 毎時のリアルタイム性が欲しい場合は、既定モードと登録制データソースを組み合わせてください。

海洋分野では、こうした合成(コンポジット)は水温分布や渦の位置を見るうえで 一般的な手法です。水温場や中規模渦は数日スケールでしか変わらないため、 1〜2日の開きは大きな構造の把握を妨げません。問題になるのは 「合成であることを明示せずに、瞬間の観測であるかのように見せる」場合です。 そのため本アプリでは各層の観測時刻と時刻差を常時表示しています。

より実時間に近づける手段(登録制データソース)

無認証で使えるデータには上表の遅れがありますが、無料登録すれば毎時のデータに置き換えられる 層が2つあります。実装済みで、環境変数に認証情報を与えたときだけ有効になります (RUNNING.md §5.5)。

登録なし登録あり提供元
海面水温日次MUR(1〜2日遅れ) ひまわり9号 毎時SST(雲域はMURで補完) JAXA ひまわりモニタ(P-Tree)
海面流速日次の地衡流(1〜3日遅れ) SMOC 毎時・潮汐流込み(約9km格子) Copernicus Marine(CMEMS)
クロロフィルa日次DINEOF(変更なし) NOAA CoastWatch
2層を毎時化すると時刻差はクロロフィルaの遅れ(1〜3日)で決まるようになります。 クロロフィルaだけは原理的に毎時化できません — 海色の観測は太陽光の反射を測るため、夜間と雲の下では観測できないからです。 毎時のデータで塗り替えられるのは水温と流れだけ、という点は変わりません。 なお、潮汐流を含むSMOCを使うと湾内の渦を演出で足す必要がなくなるため、 実データの比率も上がります(curTidal が真のとき演出の振幅を下げています)。

実データ・モデル計算・演出の切り分け

降灰フローの噴煙と火山灰の粒子は、常時流している演出です。 実際に噴火が起きているかどうかとは無関係に、粒子は火口から出続けます (噴出量はスライダー、「噴火バースト」は手動ボタンです)。 実際に噴火速報等が発表されている間は、画面左上のバッジが 「噴火速報 発表中」に変わり赤く点滅します。 「噴火速報 なし」と出ている間の噴煙は演出です。
画面の要素種別根拠・時点
地上付近の風(矢印・低高度の粒子の流れ)実測 アメダス48地点(10分値)
内挿した推定風(くすんだ色の矢印)実測からの補間 観測点の逆距離加重(IDW)。観測値そのものではない
降灰予想域の琥珀色ライン予報 「いま噴火したら」という条件付き予測。実際の降灰の観測ではない
上空の風向・風速(プルームの向き)予報からの逆算 選択中の3時間区間の予想域の重心方向と最遠距離÷3時間
噴火警戒レベル・見出し文実データ 気象庁の発表そのまま
噴煙柱・火山灰の粒子・灰の堆積演出 常時噴出。現在の噴火状況ではない
干渉縞(震源・地殻変動・熱タブ)モデル計算 茂木モデルによる理論計算。実際のInSAR観測画像ではない
地表の熱異常(ネオンレッド)実測+演出 Sentinel-2 SWIRの実データに、火口モデルの発光を重ねている
海面水温・クロロフィルの色実測 衛星解析値(1〜3日前)
湾内の渦・微細な流れ演出 実測海流に、水温場から合成した細かい構造を重ねている

画面上でも、降灰フロータブのタイトルパネル下部に 「噴煙・火山灰は常時流している演出」「灰の向き=どの時間帯に噴火した場合の予報か」 「地上の風=アメダス何時の実測か」を常時表示しています。

タブ①降灰フロー — 降灰予報 × 流体パーティクル

使っているデータ

データ内容可視化での役割
降灰予報(定時)VFVO53
気象庁 防災情報XML
「いま噴火したら、3時間ごとにどこへ灰が降るか」の予想ポリゴン×6区間 琥珀色の予想域ライン/上空の風(プルームベクトル)の推定
アメダス実況(10分毎)鹿児島・宮崎圏 約48地点の風向・風速 地上付近の風の場(明るいシアンの矢印が実測ベクトル。 くすんだ青灰色の矢印は、観測点の間をIDW補間した推定風です。 アメダスの風速計は地上約10mの高さですが、この縮尺では地面に埋もれるため 矢印は視認できる程度に浮かせて描いています)
国土地理院 標高タイル地形の高さ3D地形・粒子の着地判定

風の場のつくり方 — 高度で2つのデータをブレンド

火山灰は高度によって違う風に流されます。このアプリでは:

風ベクトルの見せ方 — 実測と内挿を色で分ける

画面上の矢印は2種類あり、どちらが観測値でどちらが計算値かが一目で分かるように 描き分けています。本数は毎分の更新ごとに凡例へ表示されます。

種類本数の決まり方見た目
アメダス実測風 領域内で風向・風速が有効な観測所の数そのもの(現在48地点)。 1地点=1本なので、これが実測の上限です 明るいシアン・太い
内挿した推定風 粒子を動かしているのと同じIDW内挿場を約15km間隔で格子サンプル。 観測点から42km以上離れた格子点は内挿の根拠が乏しいので描きません(現在134本) くすんだ青灰色・細い
遠近法で大きさが変わる3Dビューでは、太さだけでは実測か推定かを見分けられません。 そこで色味を主たる手がかりにしています。

高さと、視点による自動調整

粒子の一生

① 火口から噴出
初速20〜75m/s+浮力で上昇
② 噴煙柱
乱流ノイズで渦巻く
③ 風に乗って移流
高度別の風の場
④ 沈降
粒径ごとに0.4〜3.4m/s
⑤ 着地・堆積
数秒光って再生成へ

それぞれの粒子は乱数で「粒の大きさ」を持ち、大きい粒ほど速く落ちます。 そのため火口の近くには重い粒が、遠くには軽い粒が届く——という実際の降灰の性質が 自然に再現されます。渦巻きの表現にはシンプレックスノイズ(滑らかな乱数場)を使っています。 時間は現実の約180倍速(可変)で進みます。

「降灰の蓄積」ヒートマップ

地表付近まで降りた粒子は、その位置を専用の堆積バッファ(上空から見た地図画像)に 少しずつ焼き込みます。バッファは毎フレームわずかに減衰するため、 「最近たくさん灰が積もった場所」ほど明るく残ります。これを インフェルノ配色(暗赤→橙→黄。量が増えるほど単調に明るくなる知覚均等な配色)で 地形に重ねることで、鹿児島市街や垂水・鹿屋方面への降灰集中が一目で分かります。

蓄積 少
実データと演出の区別 — 予想域ポリゴン・風・地形・警戒レベルはすべて実データです。 一方、粒子の噴出そのもの(常時噴火しているような表現・噴火バースト)は 「もし噴火したら」を体感するための演出です。

タブ②震源・地殻変動・熱 — 震源カタログ × 熱赤外 × GNSS

熱の分布 — 熱赤外で「地面そのものの温度」を°Cで測る

あらゆる物体は温度に応じた強さの赤外線を放っています(プランクの法則)。 波長10µm前後の熱赤外は、常温(0〜50°C程度)の地面がいちばん強く放つ帯域です。 衛星がこの放射の強さを測り、プランクの法則を逆に解いて温度に直したものが 地表面温度(LST: Land Surface Temperature)です。 このタブでは2つの衛星を切り替えられます。

Landsat 8/9Sentinel-3 SLSTR
1マスの大きさ30m(細かい熱源が見える) 1km(周りとならされる)
同じ場所を通る間隔8〜16日ほぼ毎日
画面に出るデータ数週間前になりやすい数日前
プロダクトCollection 2 Level-2 ST_B10Level-2 LST

この2つは「細かさ」と「新しさ」のトレードオフの関係にあります。 どちらも°Cに校正された同じ量なので、同じ温度目盛りで色を比べられます。

ST_B10(DN) × scale + offset − 273.15 = 地表面温度[°C] scale/offsetはシーンのメタデータに入っている。ケルビンから摂氏に直すため273.15を引く

雲を必ず取り除く理由

衛星が測るのは「上から見えた面」の温度です。雲があればそれは雲頂の温度で、 高い雲ほど冷たく、−20°C前後になります。これをそのまま描くと 「非常に冷たい地面」として色がつき、完全な誤読を生みます。そのため:

除外後に桜島周辺の有効画素が半分を切ったシーンは採用せず、次に新しいシーンへ移ります。 シーン全体の雲量ではなく桜島の上が晴れているかで判定するので、 「九州全体は曇りだが桜島だけ晴れ」という回も拾えます。

昼の便だけを使う

Sentinel-3は昼と夜の両方で同じ場所を通りますが、 晴れた日の地面は昼と夜で20°C近く違います。実測では同じ8月19日でも 夜間便の最高が28.9°C、日中便は41.4°Cでした。 色の比較が成り立たなくなるため、現地9〜15時の便だけを選んでいます。

地表面温度は気温ではありません。 晴れた日中のアスファルトや裸地は気温より20°C以上高くなります。 画面に出る「30〜50°C」は地面そのものの温度であって、その日の気温ではありません。
現在の桜島は、衛星の熱赤外に火口の高温面が写るほど強い赤熱状態ではありません。 短波長赤外(Sentinel-2 B12−B11)による高温面検出のコードは残していますが、 実測値が閾値に届かずほぼ常に「検出なし」になるため、既定では非表示にしています。 かつて火口位置に置いていた脈動する熱モデル演出も、実測と誤認される恐れがあるため廃止しました

震源の3D分布 — なぜここに火山があるのか

このタブの主役は地下の震源分布です。USGSの震源カタログ(FDSN Event Web Service、 登録不要・JSON)から鹿児島周辺の地震を取り、3D空間にそのまま置いています。 「地下ビュー」を押すと地形が半透明になり、地面の下を覗けます。

深さは誇張していません。 地形の起伏は2.3倍に誇張していますが、 震源の深さは1シーン単位=1km の実寸です。 誇張を掛けるとスラブの沈み込む角度が嘘になるためで、 地形の起伏(最大1.7km)は震源の深さ(250km)に比べれば無視できる大きさです。

深さ分布に現れる構造

実際に取得したデータ(2011年以降・M2.5以上・802件)の深さヒストグラムです。

深さ件数正体
0〜50 km619地殻内の地震。活断層や火山周辺の活動
50〜125 km96相対的に少ない空白帯
125〜180 km74 沈み込むフィリピン海プレート(和達–ベニオフ帯)
180〜250 km13さらに深部へ続くスラブ

画面を回して斜め下から見ると、深部の群れが面をなして北西へ傾いているのが分かります。 これが桜島の存在理由そのものです:

フィリピン海プレートが沈み込む 深さ約150kmで
水が絞り出される
マントルの
融点が下がって融ける
マグマが上昇
姶良カルデラへ
桜島の噴火

同じ画面に地表のGNSS実測変位も出しているので、 「地下で起きていること」と「地表に現れていること」を一枚で対比できます。

色は深さ(浅い=橙 → 中間=桃 → 深い=青)、大きさはマグニチュードです。 操作パネルの「震源の期間」で1〜30年を切り替えられます。
制約: USGSの世界カタログはM2.5程度以上しか収録していません。 桜島直下の微小地震(月に数百回)を見るには気象庁の一元化震源が必要です。

地殻変動 — GNSSの実測値で「いつからいつまで」を示す

現在このタブに表示している地殻変動は、国土地理院 GEONET の実測データです (日々の座標値・F5.1解)。干渉SARの縞と違い、本物の観測で、期間もはっきりしています

項目内容
データ電子基準点の日々の座標値(F5.1解)。1996年以降、毎週更新
観測点桜島・垂水・姶良・鹿児島2/3・鹿屋・喜入・大隅など16点
遅れ約6週間(IGS最終暦を待つため。速報のR5解より遅いが精度が高い)
表示水平変位=矢印(長さ=移動量)/上下変位=柱(暖色=隆起、寒色=沈降)

なぜ「相対変位」にするのか

.posファイルの座標は ITRF2020の絶対位置で、 アムールプレートの運動(年3〜4cm)がそのまま入っています。 実際、2026年1〜6月の桜島は絶対値で東へ約21mm動いていましたが、 これはほぼ全てプレート運動です。

表示する変位 = (観測点の変位)−(基準点の変位) 基準点は串木野(桜島の西約45km)。共通のプレート運動が打ち消され、 その地域だけの変動が残る

ばらつきへの対処

日々の座標値は1日ごとに水平で数mm、上下で1cm前後ばらつきます。 「ある1日」と「別の1日」の差を取ると、変位よりノイズが大きくなることがあります。 そこで両端それぞれ15日を平均してから差を取っています(ばらつきは約1/4に減ります)。

期間の選び方で「何が見えるか」が変わります。 数ヶ月なら火山性の変動が相対的に見えますが、量が小さく観測のばらつきに近づきます。 数年にすると量は大きくなりますが(3.5年で最大73mm)、 九州全体の広域なひずみが主成分になり、火山性の変動だけを見ていることにはなりません。 画面では期間に応じてこの注意書きを切り替えています。

参考: 茂木モデルによる干渉縞(現在は非表示)

以前このタブに表示していた虹色の干渉縞は、観測ではなく理論計算で、 期間の概念もありませんでした。実測のGNSS変位に置き換えたため既定では非表示です。 計算コードは残してあり、?mogi=1 を付けると復帰します。 以下はそのときの説明です。

InSAR — 電波の「位相」で数cmの地面の動きを測る

合成開口レーダ(SAR)衛星は地表に電波を当てて反射を受け取ります。 同じ場所を2回撮影して電波の位相(波のずれ)を比べると、 その間に地面が衛星方向に何cm動いたかが分かります。これが干渉SAR(InSAR)です。 位相は1波長ごとに一周してしまうため、変位マップは 「縞1周期 = 半波長分の変位」という虹色の等高線(干渉縞)として現れます。

バンド衛星波長縞1周期の変位
CバンドSentinel-15.55cm2.8cm(縞が細かい=高感度)
Lバンドだいち2号 (ALOS-2)24.2cm12.1cm(縞が粗い=植生に強い)

「視線方向」とはどちらか

InSARが測れるのは衛星と地面を結ぶ直線に沿った成分だけです (3次元の動きのうち1成分しか分かりません)。本アプリで使っている視線ベクトルは uLos に定義してあり、正規化すると次のようになります。

LOS = (東 +0.584, 北 −0.101, 上 +0.805) 地表から衛星を見上げる向き。方位角 約100°(東より10°南寄り)、 地平からの仰角 約54°(鉛直から36°=入射角に相当)

衛星が東側の空にある配置なので、極軌道衛星の上昇軌道(アセンディング)に あたります。各成分の重みは、地面の動きがどれだけ縞に効くかを決めます。

地面の動きLOS変位への寄与意味
真上へ1cm 隆起+8.1 mm最もよく効く。縞の主因
東へ1cm 水平移動+5.8 mm衛星に近づくので正
北へ1cm 水平移動−1.0 mmほとんど効かない
符号は正=衛星に近づく(隆起・東進)、負=衛星から遠ざかる(沈降・西進)です。 北向きの動きがほぼ検出できないのは実際のInSARでも同じで、 南北方向の変位に鈍いのは干渉SARの本質的な弱点です (上昇軌道と下降軌道の2方向を組み合わせて補うのが定石です)。

茂木モデル — マグマだまりの膨張を数式ひとつで

桜島の地下では、姶良カルデラ(錦江湾北部)の深さ約10kmにマグマの供給源があると 考えられています。地下の点状の圧力源が膨らんだときの地表の隆起は、 火山学で広く使われる茂木モデル(1958年、茂木清夫)で計算できます:

uz(r) = 3ΔV·d / 4π (r² + d²)3/2 uz: 隆起量、ΔV: マグマだまりの体積変化、d: 深さ、r: 震源直上からの水平距離

このアプリでは深部ソース(姶良カルデラ下 約10km)浅部ソース(南岳直下 約4km)の2つを置き、各画素で隆起・水平変位を計算 → 衛星の視線方向に射影 → 半波長で折り返して虹色に変換、という処理を GPUが毎フレーム実行しています。だからスライダーで膨張量ΔVや深さを動かすと、 縞がリアルタイムに増減します。深いソースはなだらかで広い縞を、 浅いソースは急峻で細かい縞を作る——という関係が直感的に確かめられます。

この縞に「期間」はない

本タブの縞は「いつからいつまでの積算変位」でもありません。 実際の干渉SARは本質的に差分で、必ず2回の撮影日がセットになり、 「その2日の間にどれだけ動いたか」を示します。 一方このタブは、スライダーで設定した膨張量 ΔV に対応する変位を毎フレーム計算しているだけで、 開始時刻も終了時刻も存在しません。 ΔVを動かすと縞が増減するのは、時間が進んだからではなく 「仮定した膨張量を変えたから」です。
この干渉縞は実際の観測画像ではなく、 茂木モデルによるフォワード計算(理論予測)です。実観測のInSARで桜島・姶良カルデラの 膨張が捉えられていることは事実ですが、本タブの縞はあくまで 「観測されるとすればこう見える」を示す教材的表現です。 水面が暗いのは、実際のInSARでも水面では電波の干渉が成立しない(デコリレーション)ことの表現です。

実際の観測との読み分け

実観測のInSAR(例: 熊本地震)本タブ
データSAR衛星が2回撮影した位相差観測データなし(理論計算)
時間2つの撮影日のの変位期間の概念がない
縞1周期半波長のLOS変位同じ(表示の約束は共通)
模様断層で縞が不連続に途切れる/ノイズ・大気遅延を含む なめらかな同心円のみ。断層は表現できない

同心円状の縞=火山の膨張、途切れた縞=断層のずれという読み分けは、 実際のInSAR画像と本タブを並べて説明する教材として使えます。

タブ③黒潮・海況 — 海面水温 × クロロフィル

1変数=1チャネル: 色は水温、ドットはプランクトン

水温とプランクトン量を両方とも「色」で塗ると、値の組み合わせによって 混ざり合いどちらとも読めない色が生まれます。そこで視覚チャネルを分離しています:

海面水温 低(藍)高(金・黒潮)

植物プランクトンのクロロフィルa色素は青い光を吸収するため、 衛星の海色センサ(NOAA VIIRSなど。しきさい/GCOM-Cと同系の観測)で 濃度[mg/m³]が推定できます。濃度は外洋0.05mg/m³から沿岸ブルームの10mg/m³超まで 桁で変わるので対数スケールで扱い、ドット密度の割り当ては 取得した実データの分布(この海域の5〜95パーセンタイル: 約0.16〜4.9mg/m³)に較正しています。 ドットは世界座標約1.6km格子に乱数配置し、遠景ではエイリアシングを避けるため 淡い面表現に溶け込ませます。データは日次のDINEOFギャップフィル(雲の欠測を統計的に補完した ほぼリアルタイムのプロダクト)を使い、取得できない場合は週間合成にフォールバックします。

見えない流れを描く — 実測海流と推定流の合成場

この流れ場は、実測の海流そのものではありません。 実測海流と、実測の海面水温から推定した流れを足し合わせた合成場です。 実データで測ると、大きさのうち実測海流に由来するのは16〜24%程度、 錦江湾内に限ると約10%まで下がります(後述)。 画面には現在の実測寄与率が数値で表示されます。

まず実測海流の側を見ます。設定によって2つのうちどちらかになります。

ソース格子・周期潮汐流使われる条件
衛星高度計ブレンドの地衡流
(NOAA CoastWatch)
0.25°(約25km)・日次含まない既定
海洋解析SMOC
(Copernicus Marine)
1/12°(約9km)・毎時含む CMEMSの認証情報を設定したとき

どちらも格子が粗く、湾内や小さな渦を解像できません (SMOCの1/12°≒9kmに対し、錦江湾の幅は約20km。湾を横切る格子はわずか2〜3点)。 そこで海面水温(約1km解像度)から流れを推定して足します。 根拠は海洋物理の性質です: 大きなスケールの海流は水温フロント (温度の境目)に沿って流れます(地衡流平衡)。そこで:

流れ = 実測の海流 + α·(∇SST を90°回転させたベクトル) 第2項は等温線に沿う向きの推定成分。勾配が急な場所(フロント)ほど速い。α = 35

どちらがどれだけ効いているか — 実測して確かめる

αが大きいため、実際には第2項のほうが優勢です。配信中のデータで両項の大きさを 測った結果がこちらです(平滑化スケールを変えても傾向は変わらず、 画素スケールのノイズによる見かけの結果ではありません)。

評価スケール① 実測海流の項② SST勾配の項実測の割合
平滑化なし(画素スケール)0.2691.37316%
10km平滑化0.2681.12619%
25km平滑化0.2660.83824%
錦江湾内のみ0.1341.24310%
この比率はサーバが毎回のデータ取得時に (flow_real_fraction() がシェーダと同じ式で)測り直し、 画面の「データ時点」欄に「実測由来は約○%」として表示します。 係数を変えれば表示も自動で追随するため、説明文と実装がずれません

したがって、この可視化の読み方は次のようになります。

これに次の成分を加えて流れの場が完成します:

潮汐の位相 — 潮位そのものではなく「変化率」で駆動する

錦江湾は湾口が狭く奥が深い地形です。湾に出入りする流量は、湾内の水位が 単位時間にどれだけ変わるか(dη/dt)でほぼ決まります。したがって潮流は 潮位そのものではなく潮位の変化率に比例し、満潮・干潮の前後が憩流(流れが止まる)、 その中間で最速になります。

湾口の流量 ≈ 湾の面積 × dη/dt 満潮・干潮=dη/dt が 0 = 憩流。中間=|dη/dt| 最大=最速

そこで気象庁の潮位表(鹿児島, KGから毎正時の推算潮位を取得し、 現在時刻に内挿して変化率を求め、渦の駆動値 uTide(−1〜+1)にしています。 正なら上げ潮、負なら下げ潮です。正規化には期間内の変化率の95%点を使い、 大潮でおおむね ±1 に収まるようにしています。

以前はここが sin(uT × 0.09) という架空の周期でした。 現在は実際の干満と同期しており、画面右上の「潮汐(鹿児島)」欄に そのときの潮位と上げ潮/下げ潮/憩流が表示されます。
潮位表は天文潮位の推算値(過去の観測から調和分解して計算した予測)なので、 気圧・風による偏差は含みません。また観測データではないため、遅れはありません。
実データになったのは「タイミングと向き」だけです。 湾内の流速の分布そのものは依然として推定・演出であり、 渦の位置(湾口・湾央・湾奥の3か所)も固定です。 潮位表は1地点の水位であって、流れの空間分布を与えるものではありません。

流線が「生きた抽象画」になる仕組み

26万個の粒子をこの流れ場で漂わせ、各粒子の軌跡を減衰するトレイルバッファ (毎フレーム4%ずつ暗くなる画像)に焼き込みます。粒子が同じ筋を通り続ける場所は 明るい「流線」として浮かび、流れが変わると古い線は数秒で消えます。 速い流れだけが光るよう流速でゲートしているため、 黒潮本流や渦の縁だけがリボン状に発光し、静かな湾内は水温の地色が透けます。 流線と粒子は中立の淡い白で描き、水温の色と混ざらないようにしています。 薄く重ねた等温線(0.125°C間隔)が、色では見えにくい水温の微細な構造を補います。

水温・クロロフィルは衛星実測です。流れは 「水温フロントに沿う」という物理的性質に基づくデータ駆動の合成場であり、 湾口の渦は演出です。海流の実況値そのものではありません。

共通「光る」表現の正体 — 加算合成とブルーム

3つのタブに共通する「暗闇に光が滲む」ルックは、2つの描画技法の組み合わせです。

ベースの地形をほぼ黒(ダークカートグラフィ)に抑えているのは、 これらの光の表現のダイナミックレンジを最大化するためです。 等高線・海岸線だけをわずかに発光させ、地図としての読み取りも保っています。