【地表面データ】SAR衛星の画像データを地図に表示させる方法

【地表面データ】SAR衛星の画像データを地図に表示させる方法

これまで、Sentinel-2を中心に光学衛星のデータを紹介してきました。今回の記事では、SAR衛星という光学衛星とは全く異なった原理の人工衛星を紹介します。

光学衛星は、太陽からの反射光を検出することで地表の様子を観測します。ただし、その性質上、観測可能な情報は日中帯に限られ、悪天候下では地表の情報が著しく制限されることがあります。

SAR衛星ではマイクロ波を利用することで、光学衛星が利用できない条件下でも地表のデータを収集することができます。
本記事を読んで、SAR衛星の利用を始めてみましょう。

動作検証済み環境

macOS Ventura(13.2.1), python3.10.9, earthengine-api 0.1.340

SAR衛星とは? 

SAR衛星とは、合成開口レーダー(Synthetic Aperture Radar)を搭載した人工衛星のことです。合成開口レーダーは電磁波(マイクロ波)を地表に向けて照射し、はね返ってきた電磁波を受信・解析することで、地表面の状態を可視化します。

一般的な光学衛星と異なり可視光や近赤外線の反射を撮影するわけではないので、地表に太陽の光があたっていない夜間や悪天候下でも、24時間観測が可能になります。これにより、関心対象域を定期的に観測することが可能です。また、災害の際にも状況を把握することができる可能性が広がります。

SAR衛星で利用するマイクロ波は、下の画像のように赤外線より長波長の電磁波を利用しています。短波長側からP、L、S、C、X、Ku、K、Kaバンドという名称がふられていて、LやC、Xバンドが多く利用されています。

https://www.earthdata.nasa.gov/learn/backgrounders/what-is-sarより引用

SAR衛星ではセンサから照射したマイクロ波が地表面でどれくらい、どのように跳ね返ってきたものを検出することで、地表面にどういう材質の物が存在するかなどを観測することができます。

例えばSentinel-1というSAR衛星で観測された2020年1月の東京湾は以下のように表示することができます。東京湾にある白い点は船舶で、どの場所に何隻いるかを確認することができます。

ここで白く表示されているのはSentinel-1のセンサから照射されたマイクロ波の反射を多く検出しているもので、対象物がセンサ方向にマイクロ波を反射しやすい構造もしくは材質を持っていることがわかります。

それでは実際に東京湾の船舶を確認するためにSentinel-1の画像データを表示させてみましょう。

Sentinel-1の画像データを地図上に表示させてみる

それでは、以上で紹介したSAR衛星の画像データをpythonで表示させてみます。以下に実装例を示します。

下記のコードをsar_test.pyという名前でDesktop/labcode/python/sarディレクトリに保存します。

import ee
import folium

# GEEの認証
ee.Initialize()

# foliumマップにGEEを表示させる関数
def add_ee_layer(self, ee_image_object, vis_params, name):
    map_id_dict = ee.Image(ee_image_object).getMapId(vis_params)
    folium.raster_layers.TileLayer(
        tiles=map_id_dict['tile_fetcher'].url_format,
        attr='Map Data © <a href="https://earthengine.google.com/">Google Earth Engine</a>',
        name=name,
        overlay=True,
        control=True
    ).add_to(self)

# Sentinel-1のImageCollectionを定義しフィルタリングする。
sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD') \
    .filterDate('2020-01-04', '2020-01-05') \
    .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV')) \
    .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH')) \
    .filter(ee.Filter.eq('instrumentMode', 'IW'))

# ImageCollectionを縮小して1枚の画像モザイクを作成する。
mosaic = sentinel1.mosaic()

# 東京湾を中心とした地図オブジェクトを作成する。
map = folium.Map(location=[35.5, 140.0], zoom_start=10)

# モザイクをImageOverlayレイヤーとして地図オブジェクトに追加する。
folium.Map.add_ee_layer = add_ee_layer
map.add_ee_layer(mosaic.select(['VH']), {'min': -25,'max': 5}, 'Sentinel-1 VH')
map.add_ee_layer(mosaic.select(['VV']), {'min': -25,'max': 5}, 'Sentinel-1 VV')

# 複数のマップを重ね合わせる
map.add_child(folium.LayerControl(collapsed = False).add_to(map))

# マップの保存
map.save('sar_test.html')

プログラムを実行する

ターミナルを開き、

$ cd Desktop/labcode/python/sar

と入力し、ディレクトリを移動します。あとは以下のコマンドを実行するだけです。( $マークは無視してください)

$ python sar_test.py

実行結果

~/Desktop/LabCode/python/sar にsar_test.htmlというファイルができて,開くと以下のようになっていれば成功です!

コードの解説

上に書いたソースコードの解説をしていきます。

import ee
import folium

# GEEの認証
ee.Initialize()

GEE、foliumのライブラリを使用します。ライブラリが存在しない場合はpip installでインストールしましょう。

def add_ee_layer(self, ee_image_object, vis_params, name):
    map_id_dict = ee.Image(ee_image_object).getMapId(vis_params)
    folium.raster_layers.TileLayer(
        tiles=map_id_dict['tile_fetcher'].url_format,
        attr='Map Data © <a href="https://earthengine.google.com/">Google Earth Engine</a>',
        name=name,
        overlay=True,
        control=True
    ).add_to(self)

foliumのライブラリを利用してGEEの画像データを表示させる関数を定義します。
詳細はこちらの記事を参照してください。

sentinel1 = ee.ImageCollection('COPERNICUS/S1_GRD') \
    .filterDate('2020-01-04', '2020-01-05') \
    .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV')) \
    .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH')) \
    .filter(ee.Filter.eq('instrumentMode', 'IW'))

Sentinel-1の画像データCOPERNICUS/S1_GRDを変数として定義します。

3行目ではtransmitterReceiverPolarisationリストを利用しVV偏波とVH偏波のフィルタリングを行っています。

電磁波の振動は垂直方向(Vertical)と水平方向(Horizontal)の方向性を持っており、マイクロ波ではその方向性を偏波といいます。SAR衛星のセンサはこの2種類の偏波とマイクロ波の送受信を組み合わせることで物体の識別を行っています。船舶の観測にはVHがよく利用されるので、今回はVHの情報を含むデータをフィルタリングします。

4行目ではinstrumentModeが観測モードがIWのデータをフィルタリングします。Sentinel-1は撮影方法がいくつかあり、IW(Interferometric Wide)は最も一般的な撮影モードで、観測幅250 km、解像度5×20 mの画像データがストックされています。

# ImageCollectionを縮小して1枚の画像モザイクを作成する。
mosaic = sentinel1.mosaic()

# 東京湾を中心とした地図オブジェクトを作成する。
map = folium.Map(location=[35.5, 140.0], zoom_start=10)

# モザイクをImageOverlayレイヤーとして地図オブジェクトに追加する。
folium.Map.add_ee_layer = add_ee_layer
map.add_ee_layer(mosaic.select(['VH']), {'min': -25,'max': 5}, 'Sentinel-1 VH')
map.add_ee_layer(mosaic.select(['VV']), {'min': -25,'max': 5}, 'Sentinel-1 VV')

# 複数のオブジェクトを重ね合わせる
map.add_child(folium.LayerControl(collapsed = False).add_to(map))

# マップの保存
map.save('sar_test.html')

2行目では、地図に描画するために複数の画像データを一枚の画像にする処理です。5行目では、地図の表示位置を東京湾に設定します。8~10行目で収集したSentinel-1の画像データを地図のオブジェクトとして追加する処理を行います。13行目で複数のオブジェクトを地図に重ね合わせます。ここまでの処理で地図を作成が完了しました。

最後に16行目で作成した地図をsar_test.htmlとして保存します。

最後に

いかがでしたでしょうか。今回紹介したSAR衛星は光学衛星では不向きな夜間や悪天候下の情報が扱えます。さらに、SAR衛星と光学衛星を併用することで、地表面の情報をより高解像で解析することができます。ぜひ、試してもらえればと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です