本記事では、Google Earth Engine(GEE)を用いて、下図のような衛星画像と 正規化植生指標(NDVI, Normalized Difference Vegetation Index)を取得する雛形コードを載せました。
下図は鳥取砂丘の周辺の地区について、2023年の4月,8月,12月の衛星画像とNDVIの画像を図示したものです。JupyterLabを用いてインタラクティブに実行してゆきます。
▼ライブラリのインストールと、基本設定は下記リンク先の1, 2を参照ください。
hk29.hatenablog.jp
■本プログラム
はじめに、JupyterLab起動時にGEEのイニシャライズをします。
import ee
ee.Authenticate()
ee.Initialize()
次に衛星画像を取得します。抽出したい領域の緯度と経度を指定する必要があります。これは、例えばgoogleマップから取得できます。また、データ抽出期間と雲画像の除去フィルタを設定します。
import glob
import rasterio
from rasterio.plot import show
import matplotlib.pyplot as plt
from PIL import Image
save_file_name = 'Tottori_Sand_Dunes'
save_folder_name = 'save_dir_for_satellite_image'
coords = [[
[134.2307486167095, 35.5498136559922],
[134.2484177611878, 35.5498136559922],
[134.2484177611878, 35.5379886904566],
[134.2307486167095, 35.5379886904566],
[134.2307486167095, 35.5498136559922],
]]
START ='2023-01-01'
END = '2023-12-09'
CLOUD_COVER_RATE = 20
dataset = (
ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate(ee.Date(START), ee.Date(END))
.filter(ee.Filter.lte('CLOUDY_PIXEL_PERCENTAGE', CLOUD_COVER_RATE))
.filterBounds(ee.Geometry.Polygon(coords))
)
asset_id_list = dataset.aggregate_array('system:id').getInfo()
print(len(asset_id_list))
asset_id_list
次に、上記ファイル名のリストから見やすいように日付を抽出します。
date_list = []
for asset_id in asset_id_list:
parts = asset_id.split('/')
last_part = parts[-1]
extracted_date = last_part[:8]
date_list.append(extracted_date)
date_list
上記リストから、春(4月)、夏(8月)、冬(12月)のデータを抽出します。
indices_to_extract = [4, 9, 11]
selected_elements = [asset_id_list[i] for i in indices_to_extract]
selected_elements
次に、座標参照系(CRS:Coordinate Reference System)を取得した画像ファイルから取得します。
first_image = dataset.first()
first_band = first_image.select(0)
my_crs = first_band.projection().getInfo()['crs']
print('CRS:', my_crs)
下記コードでは、衛星画像を取得します。画像ファイルはgoogleドライブに保存されます。
my_scale = 5
my_max_pixels = 1e13
for i, asset_id in enumerate(selected_elements, start=1):
task = ee.batch.Export.image.toDrive(
image = ee.Image(asset_id).select(['TCI_R','TCI_G','TCI_B']),
region = ee.Geometry.Polygon(coords),
folder = save_folder_name,
description = f"{save_file_name}_{i}",
scale = my_scale,
maxPixels = my_max_pixels,
)
task.start()
上記を実行すると、下図のようにグーグルドライブに画像データが保存されます。
下記コードでは、NDVI画像を取得します。
for i, asset_id in enumerate(selected_elements, start=1):
task = ee.batch.Export.image.toDrive(
image = ee.Image(asset_id).normalizedDifference(['B8','B4']).rename('ndvi'),
region = ee.Geometry.Polygon(coords),
folder = save_folder_name,
description = f"{save_file_name}_NDVI_{i}",
scale = my_scale,
maxPixels = my_max_pixels,
crs = my_crs,
)
task.start()
これも、下図のようにgoogleドライブに保存されます。
※以降のコードでは、上記でgoogleドライブに保存した画像データファイルをローカルへダウンロードしてから処理します。
files = glob.glob(f"tottori_sand/*.tif")
files = files[:3]
files
指定した衛星画像を表示します。
for file in files:
image = Image.open(file)
plt.imshow(image)
plt.axis('off')
plt.show()
files = glob.glob('tottori_sand/*NDVI*.tif')
files
最後に、指定したNDVI画像を表示します。
for file in files:
print(file)
ndvi_dataset = rasterio.open(file)
ndvi_array = ndvi_dataset.read(1)
cmap = plt.cm.RdYlBu_r
plt.imshow(ndvi_array, cmap=cmap, vmin=-1, vmax=1)
plt.colorbar()
plt.show()
下図のように草木がある場所は紺色、鳥取砂丘や町や道は白色、海は赤色になっている様子。
以上
<広告>
リンク
リンク