漁業での衛星データ利用事例

この章で学習すること

  • 「しきさい」「ひまわり」衛星で観測した海面水温画像の可視化
  • rasterioEarthPyを使ったGeoTiffファイルの操作
  • matplotlibrasterioCartopy を組み合わせた衛星データの可視化
  • GeoPandas を使ったShapeファイル、GeoJSONファイルの操作

背景

持続可能な開発目標(SDGs)では、目標14に「海の豊かさを守ろう」が定められています。海洋と海洋資源を保全し、持続可能な形で利用しようというもので、例えば以下のようなターゲットが含まれています(数字はターゲット番号)。

  • 海洋ごみや富栄養化など海洋汚染の防止・削減(14.1)
  • 海洋及び沿岸の生態系の管理と保護(14.2)
  • 乱獲や違法・無報告・無規制(IUU)漁業および破壊的な漁業慣行の撤廃(14.4)
  • 科学的情報に基づく沿岸・海洋エリアの保全(14.6)
  • 漁業や養殖などを通じた海洋資源の持続的な利用による経済的利益の増加(14.7)

地球の7割以上を占める海洋において、効率的に観測して状況や変化を把握するためには地球観測衛星が力を発揮します。既に、富栄養化や重油流出事故などの海洋汚染は衛星でも観測されていますし、サンゴ礁など沿岸の生態系把握にも衛星データが利用されています。

この章では、衛星データを用いて漁場を推定する方法をご紹介します。漁場を推定することで、乱獲やIUU漁業を効果的に取り締まることが可能となりますし(14.4)、時間と燃油を節約できるので経済的利益の増加に繋がります(14.7)。漁業者が積極的に資源管理に取り組むことになり、海洋資源の持続的な利用に繋がることも期待されます。ここでは、衛星リモートセンシングによる海面水温のデータを用いて、Pythonの様々なライブラリを使った地理空間データのハンドリング・可視化について学んでいきます。

海面水温(SST: Sea Surface Temperature)と漁場の関係

漁業の現場では、以前から衛星リモートセンシングで観測した海面水温のデータが利用されてきました。これは好漁場と水温が密接に関係していると言われているからです。

変温動物である魚には種類によって適正水温があり、水温の分布パターンはターゲットの魚種が集まる海域の目安の一つとなります。また、異なる密度の水の塊がぶつかりあう場所である「潮目」は、魚の餌となる植物性プランクトンが集まりやすい場所となっており、経験的にも好漁場であることがよく知られています。

下の図は衛星で観測した海面水温分布図に、漁場を◯と△で重ねた図です。温度が急激に変化する潮目の部分に漁場が集中していることがわかります。

JAFIC_潮目.png

図:2012 年 10 月 26 日の東北沖衛星水温と漁場

水産海洋分野の衛星リモート センシングとICT - 東京水産振興会 図4より引用)

リモートセンシングによる海面水温の観測

赤外線の観測

海面水温は熱赤外線やマイクロ波で観測したデータを元に算出をしています。これらの観測は、太陽光の反射を計測する可視・近赤外線観測と異なり、物体自身が放射する電磁波を計測しており、これを利用して物体の温度を推定することができます。

大気の影響の補正

海面から放射される赤外線は大気の影響を受けて減衰し衛星センサに到達するため、観測する温度は実際の海面水温よりも低くなります。この影響を補正するために、「しきさい」や「ひまわり」では、波長の異なる2つ以上の赤外線チャンネルで得られた観測値の差から大気による減衰分を推定し、海面の水温を推定しています。

海面水温が観測できるセンサ

海面水温が観測できるセンサは、熱赤外線センサを搭載した「しきさい」や、「ひまわり」の他、マイクロ波センサを搭載した「しずく」等があります。マイクロ波センサは熱赤外線センサと比べて空間分解能は劣りますが、雲の下を観測できるという利点があります。

海面水温が観測できる衛星・センサは、宙畑のこちらの記事でも紹介されているので、ぜひご覧ください。

コラム1:リモートセンシングによる海色観測

人工衛星による海洋観測は、海面水温だけではありません。例えば、今回取り上げた「しきさい」では、植物プランクトン現存量の指標になるクロロフィル-a濃度の分布を表したプロダクトも公開されています。プランクトンの異常な増殖により水の色が変化する現象を「赤潮」と呼ぶように、プランクトンの量は海色に大きく影響を与えています。衛星ではこの海色を、可視光をベースに観測しています。

海の中では、植物プランクトン→動物プランクトン→イワシなどの小魚→大きい魚という食物連鎖があり、植物プランクトンが多い場所では漁の対象となる魚が集まっていることが予想されます。好漁場を推定する研究では、海面水温などの物理環境が利用されるケースが先行していますが、上記のクロロフィル-a濃度のような生物環境の条件を考慮したモデルの研究も進んでいます。

スクリーンショット 2020-12-02 165824.png

しきさいの海面水温とクロロフィル-aプロダクトは、Tellus OSでも閲覧できます。

しきさいで観測したSSTの解析

しきさい(GCOM-C)で観測した海面水温プロダクトを題材に、 Pythonを使った衛星データの可視化について学習していきます。

しきさいについて

しきさい/GCOM-C(Global Change Observation Mission-Climate)は、2017年にJAXAが打ち上げた地球観測衛星です。可視光から熱赤外まで19の観測チャンネルを持ち、地球の気候形成に影響を及ぼしている様々な物理量の観測を行っています。空間分解能は最高で250mです。

では、熱赤外(TIR)チャンネルを用いて観測したデータから作成された、海面水温のデータを使用していきます。

準備

In [ ]:
# google driveのマウント
# Tellusの開発環境やローカル環境を使用する想定であれば、このセルは削除可です。
from google.colab import drive
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).

必要なモジュールのインストール

In [ ]:
!apt-get install libproj-dev proj-data proj-bin
!apt-get install libgeos-dev
!pip install cython
!pip install cartopy
!apt-get -qq install python-cartopy python3-cartopy
!pip uninstall -y shapely    # cartopy and shapely aren't friends (early 2020)
!pip install shapely --no-binary shapely
In [ ]:
!pip install geopandas rasterio earthpy

データのダウンロード

今回はG-Portalからデータをダウンロードします。

大まかな手順は以下の通りです。

  1. ログインし、トップページから「衛星からの検索」をクリックする
  2. 「1. 絞り込み」の「衛星、センサから選ぶ」タブから、GCOM-C/SGLI -> LEVEL2 -> 海洋圏 -> L2-海面水温を選択する
  3. 「2. 期間指定」から希望の期間を指定する
  4. 「3. 範囲指定」の「矩形指定」で、地図上で希望の範囲をドラック指定する
  5. フォーマットを「GeoTiff」に指定し、加工要求を行う
  6. 生産終了後、通知メールに記載のリンクからデータをダウンロードする (ログイン後のトップページからもダウンロード可能です)

※ ダウンロードの方法について、詳細はこちらをご覧ください。

使用するデータの情報

  • 処理レベル: L2
  • プロダクトの種類:海面水温
  • 観測日:2018年11月04日
  • 空間分解能:250m

※ 空間分解能が小さいと、環境によってはメモリが足りずに処理が落ちてしまうことがあります。その場合は1kmのものをご使用ください。

使用する主なライブラリ

「基礎編」でご紹介したGDALライブラリは、地理空間データを扱う上で基礎となる重要なライブラリですが、GISの概念に慣れていないと理解しにくいパラメータがたくさん登場するため、衛星データを触り始めたばかりの頃は複雑に感じることもあるかと思います。

この教材では、地理空間データの処理がより便利になるPythonのライブラリをいくつかご紹介します。

  • rasterio

    rasterioは、オンラインマッププロバイダーのMapboxが中心となって開発しているOSSのライブラリで、衛星データでは最も一般的なGeoTiffフォーマットのデータを扱う際に、シンプルな書き方ができるのが特徴のライブラリです。

  • EarthPy

    米コロラド大学ボルダー校のEarthlabが中心となって開発しているライブラリで、特定のデータ操作についてはrasterioと比べてより直感的に行なえます。

  • Cartopy

    Pythonでのデータ可視化に欠かせないmatplotlibと連携して、地理空間データの描画ができるライブラリです。様々な地図投影法が用意されている他、国境線・海岸線・緯経線など独自のベクターデータも利用できます。

  • GeoPandas

    有名なデータ処理ライブラリpandasを、地理情報が取り扱いできるように拡張したライブラリです。pandasと同じ強力なデータ処理機能を持つだけでなく、他の地理空間データとの連携が可能です。

In [ ]:
 # 必要ライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt

# rasterio
import rasterio
from rasterio.plot import show

# earthpy
import earthpy.mask as em

# cartopy
import cartopy.crs as ccrs
import cartopy.feature as cfeature

# GeoPandas
import geopandas as gpd

データの読み込みと可視化

それでは早速SSTデータを可視化していきましょう。

今回の対象はGeoTiffです。rasterioを使って簡単に可視化ができます。

In [ ]:
file_path = "/content/drive/MyDrive/GCOM-C/GC1SG1_201811040128M05010_L2SG_SSTDQ_1002_0000000000192925_SST.tif"

# rasterio.open(読み込むファイルパスを指定)
sst_object = rasterio.open(file_path)
fig, ax = plt.subplots(1,1, figsize=(10,10))
show(sst_object, ax=ax)
Out[ ]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fac2f9fee10>

このように、数行のコードで簡単に画像の表示までできました!

上の図では、縦軸が緯度、横軸が経度になっています。
日本の陸の形はわかりますが、これだけではどのようなデータになっているか分からないので、もう少し見やすくしていきましょう。

まずはSSTデータのフォーマットを確認します。

GCOM-Cプロジェクトのホームページには、SSTプロダクトのデータ仕様が記載されています。

Attribute情報->SSTを確認すると、画素値のうちいくつかには以下のように意味が与えられていることがわかります。

(一部抜粋)

key value
Error_DN 65535
Land_DN 65534
Cloud_error_DN 65533
Retrieval_error_DN 65532
Maximum_valid_DN 65531
Minimum_valid_DN 0

また、データとして有効な値の範囲は0~65531であることもわかります。

陸や雲、エラーの領域は解析で不必要な領域になるので、マスクしてしまいましょう。 マスクとは、画像の指定した領域を隠し、可視化や解析の対象外とする処理です。

画像のマスクには、earthpyを使います。

In [ ]:
# 元データの座標変換情報を保持
sst_trans = sst_object.transform

# マスクする値を設定
mask_values = [65535, 65534, 65533, 65532]

# 画像をnumpy.ndarrayとして取得
# rasterio_object.read(バンド番号)で読み込むバンド番号を指定
sst_dn = sst_object.read(1) # dn: digital number

# マスク処理
# em.mask_pixels(マスク対象の配列、マスクに使用する値を持つ配列、vals=[マスクする値])
sst_masked = em.mask_pixels(sst_dn, sst_dn, vals=mask_values)

画素値から温度[℃]への変換は、同じくAttribute情報->SSTから、以下の式で温度(SST)に変換できることがわかります。

$ SST[degree]=DN*Slope+Offset $

Slope, Offsetの値は、同じくAttribute情報->SSTから、以下の値になっています。
(一部抜粋)

key value
Slope 0.0012
Offset -10
In [ ]:
# DN値をSSTに変換
slope = 0.0012
offset = -10.0

sst_temp = sst_masked * slope + offset

色付けの仕方も、デフォルトではなく温度が感覚的にわかりやすいものに置き換えます。今回は、matplotlib既定のjetというカラーマップを使います。

In [ ]:
fig, ax = plt.subplots(1,1, figsize=(10,10))
ax.set_xlabel('longtitude[degree]') # X軸名を追加
ax.set_ylabel('latitude[degree]')   # Y軸名を追加
# show()でnp.ndarrayを指定する場合は、"transform="でrasterio_object.transformを指定する
ax = show(sst_temp, transform=sst_trans, cmap='jet')

画像の範囲外と陸・雲の領域が白くなっており、マスク処理に成功したことがわかります。

画素値がどのように分布しているか確認するために、ヒストグラムを作成します。
ここではrasterio.plotshow_histという関数を使用します。

In [ ]:
from rasterio.plot import show_hist

fig, ax = plt.subplots(1,1, figsize=(10,5))

show_hist(
    sst_temp, bins=50, lw=0.0, stacked=False, alpha=0.3,
    histtype='stepfilled', title="Histogram", label="SST", ax=ax)
ax.set_xlabel("Temperature[℃]")
Out[ ]:
Text(0.5, 0, 'Temperature[℃]')

この画像の範囲では、海面水温は0~30℃に分布していることがわかります。

それでは、こちらの温度範囲に合わせてカラー表示をしてみましょう。

In [ ]:
temp_min = 5.0 # deg.C
temp_max = 28.0 # deg.C

# 表示範囲の最大値、最小値の設定
options = {
    'vmin': temp_min,
    'vmax': temp_max,
    'cmap': 'jet',
}

fig, ax = plt.subplots(1,1, figsize=(10,10))
ax.set_xlabel('longtitude[degree]')
ax.set_ylabel('latitude[degree]')
show(sst_temp, transform=sst_trans, ax=ax, **options)
Out[ ]:
<matplotlib.axes._subplots.AxesSubplot at 0x7ff11648b3c8>

温度変化のある部分がよりはっきりと分かります。

ちなみに、earthpyでは次のように更に簡潔に可視化できます.

In [ ]:
import earthpy.plot as ep
ep.plot_bands(sst_temp, **options)