GEE利用事例
海洋の時系列変化を見てみよう:宇和海の黒潮流入および北海道東方沖のクロロフィルa濃度変化について
宇和海の黒潮流入
“黒潮親潮ウォッチ”掲載記事によると、しばしば黒潮の支流が九州-四国間の沿岸環境へ影響を及ぼすとのことです。
“黒潮親潮ウォッチ”リンク:https://www.jamstec.go.jp/aplinfo/kowatch/?p=627
今回は、この九州-四国間、特に宇和海における黒潮流入に伴った温度変化と考えられる事象について、GEEにアップロードされているしきさい(GCOM-C)の海水面温度(Sea Surface Temperature: SST)データからも確認してみましょう。
黒潮流入が発生している時期の目安をつけるために、宇和海の海水面温度の時系列グラフを作成していきます。
GEEのPlatformのコンソール画面を立ち上げたら、SSTプロダクトの前処理を行う関数を定義します。
詳しくは、チュートリアル「ImageCollectionのマップ表示」ページの「③ QAフラグでのマスク」・「④ Slope、Offsetの計算」をご覧ください。
チュートリアルでは、プロダクトごとに定義されているMask_for_statisticsという値を用いてマスクしていますが、今回はMask_for_statisticsよりも緩い条件になるよう定義した値でマスクしていきます。※1
また時系列グラフを作成するために、オリジナルのImageの時刻情報を前処理後のImageに与えておきます。
function preprocessing_sst(img){
var sst = img.select('SST').float();
var qa = img.select('QA_flag').int();
var error_dn = ee.Number.parse(sst.get('Error_DN'))
// Mask_for_statistics以外の条件を使ってマスク
// 3135の値を用いてマスク
sst = sst.updateMask(qa.bitwiseAnd(3135).eq(0))
var sst_slope = ee.Number.parse(img.get('SST_Slope')).float();
var sst_offset = ee.Number.parse(img.get('SST_Offset')).float();
var sst_col = sst.multiply(sst_slope).add(sst_offset);
// オリジナルのImage(sst)の時刻情報を取得して、sst_colに与える
sst_col = sst_col.set('system:time_start',sst.get('system:time_start'));
return sst_col
}
その後、GEE上のGCOM-C SSTプロダクトをロードし、先ほど定義したpreprocessing_sst関数をImage_Collection内の各Imageに適用していきます。
今回は2019年の1年間の変化を時系列グラフ化するため、ロードの時点で2019年のデータに絞っておきます。
詳しくは、チュートリアル「ImageCollectionのマップ表示」ページの「①GEE上のデータ(ImageCollection)をロードする」をご覧ください。
// GCOM-C SSTをロードする
var sst_collection = ee.ImageCollection("projects/ee-gcomsgli/assets/SSTDQ")
.filterDate('2019-01-01', '2020-01-01');
// preprocessing_sst関数をImageに適用する
var sst_collection_col = sst_collection.map(preprocessing_sst);
GCOM-Cデータの前準備が終わったので、次に時系列グラフ化する設定を行います。
まず、時系列変化を調べる対象領域を設定します。
var ts_region =
ee.Geometry.Polygon(
[[[132.17, 33.12],
[132.17, 33.08],
[132.21, 33.08],
[132.21, 33.12]]], null, false);
今回は宇和海へ黒潮流入してくる様子を確認したいため、宿毛湾寄りの地域を対象領域としました。
ここまでに用意してきた衛星データ(sst_collection_col)と対象領域の設定(ts_region)を用いて、時系列グラフを描画します。
この描画にはGEEに用意されているui.Chart.image.seriesという機能を使用します。
詳細は公式リファレンスをご確認ください。
// 衛星データと対象領域を指定して、時系列グラフを描画する.
var result_sgli = ui.Chart.image.series(sst_collection_col, ts_region, ee.Reducer.median(), 250);
print(result_sgli)
少し待つと画面左のConsoleに、時系列グラフが表示されます。
作成された時系列グラフを見てみると、夏に海面水温が高くなり冬になると海面水温が低くなるという、年間変動の様子がまず分かります。さらに、この比較的長期スパンでの温度変化に加えて、数日単位での温度変化があることが分かります。
そのため、時系列グラフ内で局所的に海面水温のピークを取る日・その前後日の海面水温分布を表示させ、黒潮流入の様子が表れているか確認していきます。
以下は、2019/04/21(海面水温局所ピーク日)と2019/04/19・2019/04/25・2019/04/27(局所ピーク日の前後日)を表示させるコードです。
// 視覚化パラメータを設定する
var minSST = +10.0;
var maxSST = +30.0;
// 低温部分は青で表示し、温度が上がるにつれて緑・橙・赤へと変化する設定
// 16進数カラーコードで、palette内の色を設定
var visSST = {
bands: ['SST'],
palette: [ '3500a8','0800ba','003fd6','00aca9','77f800','ff8800','b30000','920000','880000' ],
min:minSST, max:maxSST,};
// 1日単位での画像を表示していく
var sst_img_0419 = sst_collection_col.filterDate('2019-04-19', '2019-04-20')
Map.addLayer(sst_img_0419, visSST, 'sst_20190419')
var sst_img_0421 = sst_collection_col.filterDate('2019-04-21', '2019-04-22')
Map.addLayer(sst_img_0421, visSST, 'sst_20190421')
var sst_img_0425 = sst_collection_col.filterDate('2019-04-25', '2019-04-26')
Map.addLayer(sst_img_0425, visSST, 'sst_20190425')
var sst_img_0427 = sst_collection_col.filterDate('2019-04-27', '2019-04-28')
Map.addLayer(sst_img_0427, visSST, 'sst_20190427')
// マップ上に、対象領域(ts_region)を表示させる
//また、マップ表示の中心位置をts_regionに設定する。ズームレベルは9.5とした。
Map.addLayer(ts_region, {}, 'ts_region');
Map.centerObject(ts_region, 9.5);
2019/04/25、2019/4/27の画像に欠損が多いため、断言は難しいですが2019/04/21では比較的高い海水温分布が宇和海まで伸びているように見られます。
※1
今回は、SSTのQA_flagの値を2進法で表した際に、bit0~5およびbit10~11で値が1となるようなピクセルをマスクする設定とした。
(2進数:1100 0011 11111を10進数に変換すると3135となる。)
SST Ver.3プロダクトにおけるQA_flagの各bitの意味については下記をご確認ください。
URL: https://suzaku.eorc.jaxa.jp/GCOM_C/data/update/Algorithm_SST_ja.html
北海道東方沖のクロロフィルa濃度変化
“地球が見える”に掲載されている”打ち上げから5年目を迎える「しきさい」 ~海洋環境編~”によると、2021年後半における北海道東方沖の赤潮変化をしきさい(GCOM-C)のクロロフィルa濃度(Chllorophyll-a concentration : CHLA)データはとらえているとのことです。
URL: https://earth.jaxa.jp/ja/earthview/2022/07/11/7123/index.html
この”地球が見える”掲載記事と同様の期間・領域の時系列変化を、GEEにアップロードされているGCOM-CのCHLAデータで確認してみましょう。
この確認にあたって、前項の「宇和海の黒潮流入」と同様の手順で、衛星データの前準備を行います。
// chlaの前処理関数を定義
function preprocessing_chla(img){
var chla = img.select('CHLA').float();
var qa = img.select('QA_flag').int();
// 今回はMask_for_statisticsを用いてマスクする
var mask_score = ee.Number.parse(img.get('CHLA_Mask_for_statistics')).int();
chla = chla.updateMask(qa.bitwiseAnd(mask_score).eq(0))
var chla_slope = ee.Number.parse(img.get('CHLA_Slope')).float();
var chla_offset = ee.Number.parse(img.get('CHLA_Offset')).float();
var chla_col = chla.multiply(chla_slope).add(chla_offset);
// オリジナルのImage(chla)の時刻情報を取得して、chla_colに与える
chla_col = chla_col.set('system:time_start',chla.get('system:time_start'));
return chla_col
}
また、前項と同様に時系列変化を調べる対象領域を設定します。
今回は3領域を定義して、各領域の時系列グラフをそれぞれ作成・表示させます。
// 時系列変化を調べたい領域を設定する
var ts1 =
ee.Geometry.Polygon(
[[[143.775, 41.975],
[143.775, 42.025],
[143.825, 42.025],
[143.825, 41.975]]], null, false);
var ts2 =
ee.Geometry.Polygon(
[[[144.575, 42.375],
[144.575, 42.425],
[144.625, 42.425],
[144.625, 42.375]]], null, false);
var ts3 =
ee.Geometry.Polygon(
[[[145.375, 42.775],
[145.375, 42.825],
[145.425, 42.825],
[145.425, 42.775]]], null, false);
var result_ts1 = ui.Chart.image.series(chla_collection, ts1, ee.Reducer.median(), 250);
print(result_ts1)
var result_ts2 = ui.Chart.image.series(chla_collection, ts2, ee.Reducer.median(), 250);
print(result_ts2)
var result_ts3 = ui.Chart.image.series(chla_collection, ts3, ee.Reducer.median(), 250);
print(result_ts3)
白枠:ts1領域、グレー枠:ts2領域、黒枠:ts3領域
上段:ts1領域における海水温の時系列変化
中段:ts2領域における海水温の時系列変化
下段:ts3領域における海水温の時系列変化
時系列グラフから、2021年8~11月においてCHLAの値の局所的なピークが複数表れている様子が分かります。