Landsat アルゴリズム

Landsat コレクションの構造

USGS は、各衛星について次の 3 つの階層(カテゴリ)でデータを生成します。

  • Tier 1(T1) - 幾何学的品質要件と放射測定品質要件を満たすデータ
  • Tier 2(T2)- Tier 1 の要件を満たしていないデータ
  • リアルタイム(RT)- まだ評価されていないデータ(最大で 1 か月かかります)。

詳細については、コレクション 2 階層に関する USGS のドキュメントをご覧ください。

検証済みの T1 データと最新のリアルタイム データの両方にアクセスできるように、シーンは階層と衛星ごとにコレクションにグループ化されています。Landsat 8 の例を次に示します。

ID 説明
LANDSAT/LC08/C02/T1_RT Landsat 8、コレクション 2、Tier 1、リアルタイム
LANDSAT/LC08/C02/T1 Landsat 8、コレクション 2、Tier 1 のみ
LANDSAT/LC08/C02/T2 Landsat 8、コレクション 2、Tier 2 のみ

新しく取得されたシーンは、毎日 T1_RT コレクションに追加されます。RT シーンが再処理され、T1 または T2 に分類されると、T1_RT コレクションから削除され、新しいバージョンが適切なコレクションに追加されます。削除やシーンの誤登録の可能性に敏感な作品の場合は、T1 コレクションに固執することをおすすめしますが、一般的に、新しく撮影されたシーンで誤登録が目立つほど大きいことはほとんどありません。

上記の各コレクションには、元のデータ(スケーリングされたセンサーでの放射輝度)が含まれています。さらに、T1 画像または T2 画像を含むコレクションごとに、TOA(大気上端反射率)、SR(地表反射率)、LST(地表温度)プロダクトが提供されます。次の表に、Landsat 8 データを使用して TOA コレクションと SR/LST コレクションのコレクション ID を示します。

ID 説明
LANDSAT/LC08/C02/T1_RT_TOA Landsat 8、Collection 2、Tier 1 + リアルタイム、TOA
LANDSAT/LC08/C02/T1_TOA Landsat 8、コレクション 2、Tier 1 のみ、TOA
LANDSAT/LC08/C02/T1_L2 Landsat 8、コレクション 2、Tier 1 のみ、SR と LST
LANDSAT/LC08/C02/T2_TOA Landsat 8、コレクション 2、Tier 2 のみ、TOA

これらのデータは、Landsat 4、5、7、8、9 に存在します。上記のコレクション定義の「LC08」を次の表の ID に置き換えて、さまざまな衛星のコレクションを取得します。

ID 説明
LT04 Landsat 4、Thematic Mapper(TM)
LT05 Landsat 5、Thematic Mapper(TM)
LE07 Landsat 7、Enhanced Thematic Mapper Plus(ETM+)
LC08 Landsat 8、Operational Land Imager(OLI)
LC09 Landsat 9、Operational Land Imager 2(OLI-2)

Landsat の収集ステータス

Pre-Collection 1: USGS による作成や配布は終了しており、Earth Engine ではサポートされていません。2024 年に Data Catalog から削除されます。

Collection 1: USGS による作成と配布は終了しており、Earth Engine ではサポートされていません。2024 年に Data Catalog から削除されます。リクエストが失敗しないように、移行ガイドを使用して、2024 年 7 月 1 日までに Earth Engine のスクリプト、モジュール、アプリを Collection 2 に更新してください。

コレクション 2: USGS が作成した現在のコレクション。Earth Engine Data Catalog で完全に利用可能。

Landsat の処理方法

Earth Engine には、ランドサット固有のさまざまな処理方法が含まれています。具体的には、センサーでの放射輝度、大気上端(TOA)反射率、地表反射率(SR)、雲スコア、雲のない合成画像を計算する方法があります。

センサーでの放射輝度と TOA 反射率

Earth Engine の「未加工」シーンには、スケーリングされた放射輝度を表すデジタル数値(DN)を含む画像が含まれています。DN からセンサー上の放射強度への変換は、シーン メタデータに保存されている係数を使用した線形変換です(Chander et al. 2009)。この変換は ee.Algorithms.Landsat.calibratedRadiance() メソッドが行います。TOA(またはセンサー)の反射率への変換は、太陽高度と季節によって変化する地球と太陽の距離を考慮した線形変換です。TOA コンバージョンは ee.Algorithms.Landsat.TOA() メソッドによって処理されます。TOA 方法では、熱帯バンドを明るさ温度に変換します。TOA 反射率または輝度温度の計算の詳細については、Chander et al.(2009)(または Landsat 8 の場合は こちらの USGS サイト)をご覧ください。次の例は、Landsat 8 画像の元データから放射輝度と TOA 反射率への変換を示しています。

コードエディタ(JavaScript)

// Load a raw Landsat scene and display it.
var raw = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318');
Map.centerObject(raw, 10);
Map.addLayer(raw, {bands: ['B4', 'B3', 'B2'], min: 6000, max: 12000}, 'raw');

// Convert the raw data to radiance.
var radiance = ee.Algorithms.Landsat.calibratedRadiance(raw);
Map.addLayer(radiance, {bands: ['B4', 'B3', 'B2'], max: 90}, 'radiance');

// Convert the raw data to top-of-atmosphere reflectance.
var toa = ee.Algorithms.Landsat.TOA(raw);

Map.addLayer(toa, {bands: ['B4', 'B3', 'B2'], max: 0.2}, 'toa reflectance');

Python の設定

Python API とインタラクティブな開発で geemap を使用する方法については、 Python 環境のページをご覧ください。

import ee
import geemap.core as geemap

Colab(Python)

# Load a raw Landsat scene and display it.
raw = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318')
m = geemap.Map()
m.center_object(raw, 10)
m.add_layer(
    raw, {'bands': ['B4', 'B3', 'B2'], 'min': 6000, 'max': 12000}, 'raw'
)

# Convert the raw data to radiance.
radiance = ee.Algorithms.Landsat.calibratedRadiance(raw)
m.add_layer(radiance, {'bands': ['B4', 'B3', 'B2'], 'max': 90}, 'radiance')

# Convert the raw data to top-of-atmosphere reflectance.
toa = ee.Algorithms.Landsat.TOA(raw)

m.add_layer(toa, {'bands': ['B4', 'B3', 'B2'], 'max': 0.2}, 'toa reflectance')
m

表面反射

Landsat の表面反射率(SR)データは、USGS コレクション 2 レベル 2 アーカイブのコピーとして Earth Engine で利用できます。Landsat 4、5、7 の SR データは LEDAPS アルゴリズムを使用して生成されますが、Landsat 8 と 9 の SR データは LaSRC アルゴリズムを使用して生成されます。 これらのアルゴリズムと USGS との違いについて

USGS Collection 2、レベル 2 の Landsat 8 画像には、次のようにアクセスできます。

コードエディタ(JavaScript)

var srImage = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_044034_20201028');

Python の設定

Python API とインタラクティブな開発で geemap を使用する方法については、 Python 環境のページをご覧ください。

import ee
import geemap.core as geemap

Colab(Python)

sr_image = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_044034_20201028')

Collection 2 Landsat 4 ~ 9 の表面反射率データセットは次のとおりです。

コードエディタ(JavaScript)

var surfaceReflectanceL4 = ee.ImageCollection('LANDSAT/LT04/C02/T1_L2');
var surfaceReflectanceL5 = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2');
var surfaceReflectanceL7 = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2');
var surfaceReflectanceL8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2');
var surfaceReflectanceL9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2');

Python の設定

Python API とインタラクティブな開発で geemap を使用する方法については、 Python 環境のページをご覧ください。

import ee
import geemap.core as geemap

Colab(Python)

surface_reflectance_l4 = ee.ImageCollection('LANDSAT/LT04/C02/T1_L2')
surface_reflectance_l5 = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2')
surface_reflectance_l7 = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2')
surface_reflectance_l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
surface_reflectance_l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')

シンプルなクラウド スコア

相対的な雲量で Landsat ピクセルをスコアリングするために、Earth Engine は ee.Algorithms.Landsat.simpleCloudScore() メソッドに基本的な雲スコアリング アルゴリズムを提供しています。(実装の詳細については、こちらの Code Editor サンプル スクリプトをご覧ください)。次の例では、雲のスコアリング アルゴリズムを使用して、Landsat 8 画像の雲をマスクします。

コードエディタ(JavaScript)

// Load a cloudy Landsat scene and display it.
var cloudy_scene = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140926');
Map.centerObject(cloudy_scene);
Map.addLayer(cloudy_scene, {bands: ['B4', 'B3', 'B2'], max: 0.4}, 'TOA', false);

// Add a cloud score band.  It is automatically called 'cloud'.
var scored = ee.Algorithms.Landsat.simpleCloudScore(cloudy_scene);

// Create a mask from the cloud score and combine it with the image mask.
var mask = scored.select(['cloud']).lte(20);

// Apply the mask to the image and display the result.
var masked = cloudy_scene.updateMask(mask);
Map.addLayer(masked, {bands: ['B4', 'B3', 'B2'], max: 0.4}, 'masked');

Python の設定

Python API とインタラクティブな開発で geemap を使用する方法については、 Python 環境のページをご覧ください。

import ee
import geemap.core as geemap

Colab(Python)

# Load a cloudy Landsat scene and display it.
cloudy_scene = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140926')
m = geemap.Map()
m.center_object(cloudy_scene)
m.add_layer(
    cloudy_scene, {'bands': ['B4', 'B3', 'B2'], 'max': 0.4}, 'TOA', False
)

# Add a cloud score band.  It is automatically called 'cloud'.
scored = ee.Algorithms.Landsat.simpleCloudScore(cloudy_scene)

# Create a mask from the cloud score and combine it with the image mask.
mask = scored.select(['cloud']).lte(20)

# Apply the mask to the image and display the result.
masked = cloudy_scene.updateMask(mask)
m.add_layer(masked, {'bands': ['B4', 'B3', 'B2'], 'max': 0.4}, 'masked')
m

この例を Code Editor で実行する場合は、TOA レイヤの可視性を切り替えて、マスクありとマスクなしの画像の違いを比較してみてください。(手順については、コードエディタのドキュメントのレイヤ マネージャー セクションをご覧ください)。simpleCloudScore() への入力は単一の Landsat TOA シーンであることに注意してください。また、simpleCloudScore() は入力画像に 'cloud' というバンドを追加します。雲帯には、雲のスコア(0: 雲なし、100: 雲が多い)が含まれています。上記の例では、雲スコアに対して任意のしきい値(20)を使用して、雲のピクセルをマスクしています。このアルゴリズムを Landsat シーンの Earth Engine モザイクに適用するには、SENSOR_ID プロパティを設定します。

コードエディタ(JavaScript)

// Load a Landsat 8 TOA collection, make 15-day mosaic, set SENSOR_ID property.
var mosaic = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterDate('2019-06-01', '2019-06-16').mosaic()
  .set('SENSOR_ID', 'OLI_TIRS');

// Cloud score the mosaic and display the result.
var scored_mosaic = ee.Algorithms.Landsat.simpleCloudScore(mosaic);
Map.addLayer(scored_mosaic, {bands: ['B4', 'B3', 'B2'], max: 0.4},
    'TOA mosaic');

Python の設定

Python API とインタラクティブな開発で geemap を使用する方法については、 Python 環境のページをご覧ください。

import ee
import geemap.core as geemap

Colab(Python)

# Load a Landsat 8 TOA collection, make 15-day mosaic, set SENSOR_ID property.
mosaic = (
    ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
    .filterDate('2019-06-01', '2019-06-16')
    .mosaic()
    .set('SENSOR_ID', 'OLI_TIRS')
)

# Cloud score the mosaic and display the result.
scored_mosaic = ee.Algorithms.Landsat.simpleCloudScore(mosaic)
m = geemap.Map()
m.add_layer(
    scored_mosaic,
    {'bands': ['B4', 'B3', 'B2'], 'max': 0.4},
    'TOA mosaic',
)
m

SENSOR_ID は個々の画像のプロパティです。Earth Engine が複数の画像をモザイク化するときに、SENSOR_ID プロパティを含む個々の画像メタデータを破棄する必要があります。モザイクのクラウド スコアリングを行うために、Earth Engine がそのプロパティを検索しますが、見つからないためエラーが発生します。これを回避するには、プロパティを手動で設定します。Landsat 5、7、8(9)のセンサー ID は、それぞれ「TM」、「ETM」、「OLI_TIRS」です。

シンプルな複合

シンプルな雲のない Landsat コンポジットを作成するには、Earth Engine の ee.Algorithms.Landsat.simpleComposite() メソッドを使用します。この方法では、各ロケーションでシーンのサブセットを選択し、TOA 反射率に変換し、単純な雲スコアを適用して、雲が最も少ないピクセルの中央値を取得します。この例では、デフォルトのパラメータを使用して単純なコンポジットを作成し、クラウドスコアのしきい値とパーセンタイルに対してカスタム パラメータを使用したコンポジットと比較します。

コードエディタ(JavaScript)

// Load a raw Landsat 5 ImageCollection for a single year.
var collection = ee.ImageCollection('LANDSAT/LT05/C02/T1')
    .filterDate('2010-01-01', '2010-12-31');

// Create a cloud-free composite with default parameters.
var composite = ee.Algorithms.Landsat.simpleComposite(collection);

// Create a cloud-free composite with custom parameters for
// cloud score threshold and percentile.
var customComposite = ee.Algorithms.Landsat.simpleComposite({
  collection: collection,
  percentile: 75,
  cloudScoreRange: 5
});

// Display the composites.
Map.setCenter(-122.3578, 37.7726, 10);
Map.addLayer(composite, {bands: ['B4', 'B3', 'B2'], max: 128}, 'TOA composite');
Map.addLayer(customComposite, {bands: ['B4', 'B3', 'B2'], max: 128},
    'Custom TOA composite');

Python の設定

Python API とインタラクティブな開発で geemap を使用する方法については、 Python 環境のページをご覧ください。

import ee
import geemap.core as geemap

Colab(Python)

# Load a raw Landsat 5 ImageCollection for a single year.
collection = ee.ImageCollection('LANDSAT/LT05/C02/T1').filterDate(
    '2010-01-01', '2010-12-31'
)

# Create a cloud-free composite with default parameters.
composite = ee.Algorithms.Landsat.simpleComposite(collection)

# Create a cloud-free composite with custom parameters for
# cloud score threshold and percentile.
custom_composite = ee.Algorithms.Landsat.simpleComposite(
    collection=collection, percentile=75, cloudScoreRange=5
)

# Display the composites.
m = geemap.Map()
m.set_center(-122.3578, 37.7726, 10)
m.add_layer(
    composite, {'bands': ['B4', 'B3', 'B2'], 'max': 128}, 'TOA composite'
)
m.add_layer(
    custom_composite,
    {'bands': ['B4', 'B3', 'B2'], 'max': 128},
    'Custom TOA composite',
)
m

単純な合成への入力は、未加工画像のコレクションです。また、デフォルトでは、反射帯域の出力は反射率が 8 ビットにスケーリングされ、熱帯域の出力はケルビンから 100 を引いた値が 8 ビットの範囲に収まるように調整されます。この動作を変更するには、asFloat パラメータを true に設定して、スケーリングとシフトが行われていない浮動小数点出力を取得します。