📽

RでGoogle Earth Engineの光学衛星データをタイムラプス動画として表示する

2024/02/12に公開
変更履歴・概要

2024/3/28 更新
使用した衛星データの引用が画像中に出力できていない箇所について引用が表示されるよう更新しました。

2024/2/12 初版
使用した衛星データの引用が画像中に出力できていない箇所がいくつかあります(出力方法が分かりましたら,コメント等頂ければありがたいです)。

できるようになること

Google Earth Engine(GEE)では,時系列衛星データのタイムラプス動画として,アニメーションGIFか,AVIビデオクリップを出力できます。

https://developers.google.com/earth-engine/tutorials/community/modis-ndvi-time-series-animation

https://developers.google.com/earth-engine/guides/exporting_video

ここでは,Rを利用してアニメーションGIFとしてタイムラプス動画を出力します。

初期設定

RでGEEを操作する設定は,RでGoogle Earth Engineを操作できるようにするを,光学衛星データを表示する方法は,RでGoogle Earth Engineの光学衛星データを表示するを,それぞれ参考にしてください。

library(rgee)
library(rgeeExtra)
library(sf)
library(leaflet)
ee_Initialize(project = 'プロジェクト名')

タイムラプス動画の作成

まずは,動画にする範囲の衛星データを取得し,前処理をします。

geom_rect <- list(c(135.17, 34.70), c(135.17, 34.62), 
                  c(135.30, 34.62), c(135.30, 34.70), c(135.17, 34.70))
ee_geom_rect <-  ee$Geometry$Polygon(geom_rect)
ee_geom_rect_centroid <- ee_geom_rect$centroid('maxError' = 1)
centroid <- ee_geom_rect_centroid$coordinates()$getInfo()
L8_SR <- ee$ImageCollection("LANDSAT/LC08/C02/T1_L2")$
  filterDate("2023-01-01", "2024-01-01")$
  filterBounds(ee_geom_rect)$
  filter(ee$Filter$lt('CLOUD_COVER', 50))$
  scaleAndOffset()$
  sort('system:time_start')

取得したデータの一覧を確認します。

L8_SR$aggregate_array('system:id')$getInfo()
##  [1] "LANDSAT/LC08/C02/T1_L2/LC08_110036_20230105" "LANDSAT/LC08/C02/T1_L2/LC08_110036_20230310"
##  [3] "LANDSAT/LC08/C02/T1_L2/LC08_110036_20230411" "LANDSAT/LC08/C02/T1_L2/LC08_110036_20230427"
##  [5] "LANDSAT/LC08/C02/T1_L2/LC08_110036_20230716" "LANDSAT/LC08/C02/T1_L2/LC08_110036_20230801"
##  [7] "LANDSAT/LC08/C02/T1_L2/LC08_110036_20230817" "LANDSAT/LC08/C02/T1_L2/LC08_110036_20231105"
##  [9] "LANDSAT/LC08/C02/T1_L2/LC08_110036_20231121" "LANDSAT/LC08/C02/T1_L2/LC08_110036_20231207"
## [11] "LANDSAT/LC08/C02/T1_L2/LC08_110036_20231223"

表示の設定をします。

imageRGB <- L8_SR$map(function(img){
 return(img$visualize(bands=c("SR_B4", "SR_B3", "SR_B2"), min=0, max=0.3))
})

一度,衛星データと,切り抜く範囲を表示させて,確認しておきます。

Map$setCenter(lon = centroid[1], lat = centroid[2], zoom = 12)
m <- Map$addLayer(imageRGB$first()) +
  Map$addLayer(ee_geom_rect, list(color = "FF0000"), "geodesic polygon")
m %>%
  addTiles(urlTemplate = "", attribution = '| Landsat-8 image courtesy of the U.S. Geological Survey')

出力する動画のパラメータを設定します。regionで動画として切り抜く範囲,dimensionsで動画のc(width, height)(値が1つの場合はどちらかの最大値となり,もう片方は比例計算で決まる),framesPerSecondで動画の速度を設定します。

gifParams <- list(
  region = ee_geom_rect,
  dimensions = 480,
  framesPerSecond = 0.75
)

rgeeExtraライブラリで実装されている,getVideoThumbURLのラッパー関数ee_utils_gif_creator()を利用し,タイムラプス動画を作成します。

animation <- ee_utils_gif_creator(imageRGB, gifParams, quite=T, mode="wb")

rgeeExtraライブラリを利用して,衛星データの取得日とクレジットをテキストとして動画に付け加えます。

get_dates <- ee_get_date_ic(L8_SR)
animation_wtxt <- animation %>%
  ee_utils_gif_annotate(format(get_dates$time_start, "%Y-%m-%d"), size=15, location="+20+20", boxcolor = "#FFFFFF")  %>%
  ee_utils_gif_annotate("Landsat 8 image courtesy of the U.S. Geological Survey", size=9, location="+240+340", boxcolor = "#FFFFFF")

ローカルファイルの保存は以下で行います。zenn_dirfig_pathで保存先のフォルダ名を指定しています。

ee_utils_gif_save(animation_wtxt, path = paste0(zenn_dir, fig_path, "animation-landsat.gif"))

結果は以下のとおりです。RStudioではprint(animation_wtxt) で表示できます。rmarkdownでは出力されないので,一旦ローカルファイルに保存したものを表示しています。

knitr::include_graphics("images/carook-zenn-r-rgee03/animation-landsat.gif", error=F)

AVIビデクリップとして出力する

AVIビデオクリップとして出力する方法は以下のとおりです。

task <- ee$batch$Export$video$toDrive(
  collection = imageRGB,
  description = "timelapse",
  framesPerSecond = 0.75,
  dimensions = 480,
  region = ee_geom_rect
)
task$start()
ee_monitoring()

imageRGBに文字情報を加えるには,Code Editor(JavaScript)ではモジュールとしてusers/gena/packages:textを追加すれば可能です。

Advanced Raster Visualization (in) Cloud-Based Remote Sensing with Google Earth Engine

Rにも以下によりモジュールを追加できるようですが,私の環境ではエラーがでて導入できていません。

Combining R and Earth Engine (in) Cloud-Based Remote Sensing with Google Earth Engine

年ごとに集計した衛星データのタイムラプス動画

Landsat衛星データを利用して,年ごとにデータを集計(減算)したデータを利用してタイムラプス動画を作成してみましょう。以下を参考にしました。

https://courses.spatialthoughts.com/end-to-end-gee-supplement.html#harmonized-landsat-time-series

https://bevingtona.github.io/20210504_rgee_rayshade_gifski.html

Aggregating Images for Time Series (in) Cloud-Based Remote Sensing with Google Earth Engine

Landsat5/7とLandsat8は各波長域の取得バンド名が異なるため,以下の関数でrenameする必要があります。

rename <- function(image){
  return(image$select(
    c('SR_B1', 'SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B7'),
    c('SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7')
  ))
}

データの取得と前処理を行います。

geom_rect <- list(c(135.17, 34.70), c(135.17, 34.62), 
                  c(135.30, 34.62), c(135.30, 34.70), c(135.17, 34.70))
ee_geom_rect <-  ee$Geometry$Polygon(geom_rect)
ee_geom_rect_centroid <- ee_geom_rect$centroid('maxError' = 1)
centroid <- ee_geom_rect_centroid$coordinates()$getInfo()
## 各衛星データの利用期間
yearStart <- 1985 # filter year included in mosaics.
yearEnd <- 2023 # filter year included in mosaics.
yearInterval <- 1 # if 1 then mosaic every year, if 10 then every 10 years. 
years <- seq(yearStart, yearEnd, yearInterval)
monthStart <- 1 # filter months included in mosaics. 
monthEnd <- 12 # filter months included in mosaics.
cloudcover <- 50
## 各衛星データの作成
# Landsat5
# https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LT05_C02_T1_L2
L5_SR <- ee$ImageCollection("LANDSAT/LT05/C02/T1_L2")$
  filterBounds(ee_geom_rect)$
  filter(ee$Filter$lt('CLOUD_COVER', cloudcover))$
  preprocess()$
  map(rename)
# Landsat7
# https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LE07_C02_T1_L2
L7_SR <- ee$ImageCollection("LANDSAT/LE07/C02/T1_L2")$
  filterBounds(ee_geom_rect)$
  filter(ee$Filter$lt('CLOUD_COVER', cloudcover))$
  preprocess()$
  map(rename)
# Landsat8
# https://developers.google.com/earth-engine/datasets/catalog/LANDSAT_LC08_C02_T1_L2 
L8_SR <- ee$ImageCollection("LANDSAT/LC08/C02/T1_L2")$
  filterBounds(ee_geom_rect)$
  filter(ee$Filter$lt('CLOUD_COVER', cloudcover))$
  preprocess()$
  select(c('SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7'))
## 各衛星データのマージ
Landsat_SR <- L5_SR$merge(L7_SR)$merge(L8_SR)$
  filter(ee$Filter$calendarRange(yearStart, yearEnd, "year"))$
  filter(ee$Filter$calendarRange(monthStart, monthEnd, "month"))

年ごとの集計

ee_years <- ee$List(years)
createYearlyImage <- function(beginningYear){
  startDate <- ee$Date$fromYMD(beginningYear, 1, 1)
  endDate <- startDate$advance(1, 'year')
  yearFiltered <- Landsat_SR$filter(ee$Filter$date(startDate, endDate))
  total <- yearFiltered$median()$set('system:time_start', startDate$millis())
  return(total)
}
yearlyImages <- ee_years$map(ee_utils_pyfunc(createYearlyImage))
yearlyCollection <- ee$ImageCollection$fromImages(yearlyImages)

表示の設定

imageRGB <- yearlyCollection$map(function(img){
  return(img$visualize(bands=c("SR_B4", "SR_B3", "SR_B2"), min=0, max=0.3))
})

取得したデータと動画範囲の確認

Map$setCenter(lon = centroid[1], lat = centroid[2], zoom = 12)
m <- Map$addLayer(imageRGB$first())+
  Map$addLayer(ee_geom_rect, list(color = "FF0000"), "geodesic polygon")
m %>%
  addTiles(urlTemplate = "", attribution = '| Landsat-8 image courtesy of the U.S. Geological Survey')

crsの確認。まず,年ごとに集計する前。EPSG:32653はWGS84系のUTM座標系53Nを示します。

Landsat_SR$first()$projection()$getInfo()
## $type
## [1] "Projection"
## 
## $crs
## [1] "EPSG:32653"
## 
## $transform
## [1]      30       0  391785       0     -30 3934515

年ごとに集計した後。EPSG:4326はWGS84系の経緯度を示します。異なる投影法を持つ入力イメージの合成またはモザイクであるイメージには,デフォルトの投影法として,EPSG:4326が適用されるようです(https://developers.google.com/earth-engine/guides/projections)。

yearlyCollection$first()$projection()$getInfo()
## $type
## [1] "Projection"
## 
## $crs
## [1] "EPSG:4326"
## 
## $transform
## [1] 1 0 0 0 1 0

出力する動画のパラメータを設定します。crsは経緯度ではなく,メートル単位のUTM座標系にします。

gifParams <- list(
  region = ee_geom_rect,
  dimensions = 480,
  crs=Landsat_SR$first()$projection()$crs()$getInfo(),
  framesPerSecond = 0.75
)

タイムラプス動画を作成。

animation <- ee_utils_gif_creator(imageRGB, gifParams, mode="wb")

衛星データの取得日とクレジットをテキストとして動画に付け加えます。

get_dates <- ee_get_date_ic(yearlyCollection)
animation_wtxt <- animation %>%
  ee_utils_gif_annotate(format(get_dates$time_start, "%Y"), size=15, location="+20+20", boxcolor = "#FFFFFF") %>%
  ee_utils_gif_annotate("Landsat image courtesy of the U.S. Geological Survey", size=9, location="+240+340", boxcolor = "#FFFFFF")
# RStudioではprint(animation_wtxt) で表示できます。rmarkdownでは出力できません。

ローカルファイルへ保存。

ee_utils_gif_save(animation_wtxt, path = paste0(zenn_dir, fig_path, "animation-landsat_yearly.gif"))

結果は以下のとおりです。

knitr::include_graphics("images/carook-zenn-r-rgee03/animation-landsat_yearly.gif", error=F)

Sentinel-2の場合

Sentinel-2でも,同じようにタイムラプス動画を作ることができます。ただし,Level-2Aの場合,提供データ(タイル)はUTM/WGS84投影における 110kmx110kmで分割されており,隣接データと重複があります(https://sentinels.copernicus.eu/web/sentinel/missions/sentinel-2/data-products)。兵庫県付近のタイルは次のとおりです。eatlas.org.auでは,対話式にタイルを確認できます。

使用したタイルデータ(https://github.com/justinelliotmeyers/Sentinel-2-Shapefile-Index

geom_point <- c(135.021111, 34.616944) # 明石海峡大橋
sentinel2_granule <- sf::st_read("data/sentinel_2_index_shapefile.shp", quiet=T) %>% sf::st_zm()
attr <- "<a href='http://maps.gsi.go.jp/development/ichiran.html' target='_blank'>地理院タイル</a>"
leaflet() %>%
  addTiles("https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png", attribution = attr) %>% 
  setView(geom_point[1], geom_point[2], 8) %>%
  addPolygons(data=sentinel2_granule, color = "#444444", fill=F)

実際に,明石海峡大橋付近のSentinel-2データを取得して,取得日をみてみましょう。

ee_geom_point <- ee$Geometry$Point(geom_point)
S2_SR <- ee$ImageCollection("COPERNICUS/S2_SR_HARMONIZED")$
  filterDate("2023-01-01", "2023-01-31")$
  filterBounds(ee_geom_point)$
  scaleAndOffset()$
  sort('system:time_start')
head(ee_get_date_ic(S2_SR))
##                                                                   id          time_start
## 1 COPERNICUS/S2_SR_HARMONIZED/20230103T015051_20230103T015559_T53SNU 2023-01-03 01:57:39
## 2 COPERNICUS/S2_SR_HARMONIZED/20230103T015051_20230103T015559_T53SMU 2023-01-03 01:57:43
## 3 COPERNICUS/S2_SR_HARMONIZED/20230105T014049_20230105T014435_T53SNU 2023-01-05 01:47:42
## 4 COPERNICUS/S2_SR_HARMONIZED/20230105T014049_20230105T014435_T53SMU 2023-01-05 01:47:47
## 5 COPERNICUS/S2_SR_HARMONIZED/20230108T015039_20230108T015407_T53SNU 2023-01-08 01:57:37
## 6 COPERNICUS/S2_SR_HARMONIZED/20230108T015039_20230108T015407_T53SMU 2023-01-08 01:57:41

同じ日に2つのデータがあるのが分かります。このままタイムラプス動画をつくると,同じ日の画像が2回表示されてしまうので,何らかの対策が必要です。

タイルの指定

まず一番簡単な方法として,取得するタイルを1つに設定して動画を作成します。

データの取得

geom_rect <- list(c(134.98, 34.65), c(134.98, 34.58), 
                  c(135.08, 34.58), c(135.08, 34.65), c(134.98, 34.65))
ee_geom_rect <-  ee$Geometry$Polygon(geom_rect)
ee_geom_rect_centroid <- ee_geom_rect$centroid('maxError' = 1)
centroid <- ee_geom_rect_centroid$coordinates()$getInfo()
# MGRSタイルを指定
S2_SR <- ee$ImageCollection("COPERNICUS/S2_SR_HARMONIZED")$
  filterDate("2023-04-01", "2023-10-01")$
  filterBounds(ee_geom_rect)$
  filter(ee$Filter$eq('MGRS_TILE','53SMU'))$
  filter(ee$Filter$lt('CLOUDY_PIXEL_PERCENTAGE', 50))$
  scaleAndOffset()$
  sort('system:time_start')

取得したデータの一覧(一部)

head(S2_SR$aggregate_array('system:id')$getInfo())
## [1] "COPERNICUS/S2_SR_HARMONIZED/20230403T014651_20230403T015730_T53SMU"
## [2] "COPERNICUS/S2_SR_HARMONIZED/20230408T014659_20230408T015537_T53SMU"
## [3] "COPERNICUS/S2_SR_HARMONIZED/20230410T013651_20230410T014659_T53SMU"
## [4] "COPERNICUS/S2_SR_HARMONIZED/20230413T014651_20230413T015720_T53SMU"
## [5] "COPERNICUS/S2_SR_HARMONIZED/20230420T013651_20230420T014655_T53SMU"
## [6] "COPERNICUS/S2_SR_HARMONIZED/20230423T014651_20230423T015709_T53SMU"

表示の設定をしておきます。

imageRGB <- S2_SR$map(function(img){
  return(img$visualize(bands=c("B4", "B3", "B2"), min=0, max=0.3))
})

一度,衛星データを表示してみます。画像の右側に衛星データがないのは,指定したタイル外の部分になります。

Map$setCenter(lon = centroid[1], lat = centroid[2], zoom = 12)
m <- Map$addLayer(imageRGB$first()) +
  Map$addLayer(ee_geom_rect, list(color = "FF0000"), "geodesic polygon") 
m %>%
  addTiles(urlTemplate = "", attribution = '| Contains modified Copernicus Sentinel data (2022)')

出力する動画のパラメータを設定。

gifParams <- list(
  region = ee_geom_rect,
  dimensions = 480,
  framesPerSecond = 0.75
)

タイムラプス動画を作成します。

animation <- ee_utils_gif_creator(imageRGB, gifParams, mode="wb")

衛星データの取得日とクレジットをテキストとして動画に付け加えます。

get_dates <- ee_get_date_ic(S2_SR)
animation_wtxt <- animation %>%
  ee_utils_gif_annotate(format(get_dates$time_start, "%Y-%m-%d"), size=15, location="+20+20", boxcolor = "#FFFFFF")  %>%
  ee_utils_gif_annotate("Contains modified Copernicus Sentinel data (2023)", size=9, location="+240+380", boxcolor = "#FFFFFF")
# RStudioではprint(animation_wtxt) で表示できます。rmarkdownでは出力できません。

ローカルファイルに保存

ee_utils_gif_save(animation_wtxt, path = paste0(zenn_dir, fig_path, "animation-sentinel2_1.gif"))

結果は以下のとおりです。

knitr::include_graphics("images/carook-zenn-r-rgee03/animation-sentinel2_1.gif", error=F)

データの結合

次に紹介するのは,同じ日のタイルデータを結合してから中央値などに減算する方法です。コードとしては複雑ですが,以下を参考にしています。

https://developers.google.com/earth-engine/tutorials/community/time-series-visualization-with-altair#prepare_landsat_collection

データの取得(取得範囲は上記の例より若干広げています)

geom_rect <- list(c(134.98, 34.65), c(134.98, 34.58), 
                  c(135.12, 34.58), c(135.12, 34.65), c(134.98, 34.65))
ee_geom_rect <-  ee$Geometry$Polygon(geom_rect)
ee_geom_rect_centroid <- ee_geom_rect$centroid('maxError' = 1)
centroid <- ee_geom_rect_centroid$coordinates()$getInfo()
# 各データに日付の情報を付加する関数
set_date <- function(image){
  date <- ee$Image(image)$date()$format("YYYY-MM-dd")
  return(image$set('date', date))
}
# 衛星データの取得
S2_SR <- ee$ImageCollection("COPERNICUS/S2_SR_HARMONIZED")$
  filterDate("2023-04-01", "2023-10-01")$
  filterBounds(ee_geom_rect)$
  filter(ee$Filter$lt('CLOUDY_PIXEL_PERCENTAGE', 50))$
  scaleAndOffset()$
  map(set_date)

取得日データの作成。distinct()dateの重複データを削除しています。

S2_SR_distinct <- S2_SR$distinct('date')

それぞれのデータ数を比較してみましょう。本来は1日2つのデータですが,データ取得時に雲比率が大きなデータは除外しているため,データが1つ(どちらかのタイル)しかない日があります。

# 取得データ数
S2_SR$size()$getInfo()
## [1] 59
# 取得日数
S2_SR_distinct$size()$getInfo()
## [1] 35

日ごとのデータは以下によって作成します。saveAlljoinは,S2_SR_distinct(primary collection)にfilterTimeEqで一致するS2_SR(secondary collection)のすべてのデータを保存するために利用します(https://developers.google.com/earth-engine/guides/joins_save_all)。

# filterの定義
filterTimeEq <- ee$Filter$equals(leftField='date', rightField='date')
# Joinの定義
join = ee$Join$saveAll('date_matches')
# Joinを適用し,作成されるFeatureCollectionをImageCollectionに変換
join_col = ee$ImageCollection(join$apply(S2_SR_distinct, S2_SR, filterTimeEq))
# 各日のデータに減算(中央値)処理するための関数を定義する
reduce_by_join <- function(img){
  date_col = ee$ImageCollection$fromImages(ee$Image(img)$get('date_matches'))
  return(date_col$median()$
           set('system:time_start', ee$Image(img)$date()$millis())
  )
}
# `reduce_by_join`関数をjoin_colに適用する
S2_SR_col = join_col$map(reduce_by_join)

表示の設定をしておきます。

imageRGB <- S2_SR_col$map(function(img){
  return(img$visualize(bands=c("B4", "B3", "B2"), min=0, max=0.3))
})

一度,衛星データを表示してみます。先ほどの例と違って,右側に衛星データがないところがありません。

Map$setCenter(lon = centroid[1], lat = centroid[2], zoom = 12)
Map$addLayer(imageRGB$first()) +
  Map$addLayer(ee_geom_rect, list(color = "FF0000"), "geodesic polygon") %>%
  leaflet::addTiles(urlTemplate = "", attribution = '| Contains modified Copernicus Sentinel data (2023)')

出力する動画のパラメータを設定。

gifParams <- list(
  region = ee_geom_rect,
  dimensions = 480,
  crs="EPSG:32653",
  framesPerSecond = 0.75
)

タイムラプス動画を作成します。

animation <- ee_utils_gif_creator(imageRGB, gifParams, mode="wb")

衛星データの取得日とクレジットをテキストとして動画に付け加えます。

get_dates <- ee_get_date_ic(S2_SR_col)
animation_wtxt <- animation %>%
  ee_utils_gif_annotate(format(get_dates$time_start, "%Y-%m-%d"), size=15, location="+20+20", boxcolor = "#FFFFFF")  %>%
  ee_utils_gif_annotate("Contains modified Copernicus Sentinel data (2023)", size=9, location="+260+270", boxcolor = "#FFFFFF")
# RStudioではprint(animation_wtxt) で表示できます。rmarkdownでは出力できません。

ローカルファイルに保存。

ee_utils_gif_save(animation_wtxt, path = paste0(zenn_dir, fig_path, "animation-sentinel2_2.gif"))

結果は以下のとおりです。

knitr::include_graphics("images/carook-zenn-r-rgee03/animation-sentinel2_2.gif", error=F)

ところどころ左右が黒くなっているのは,雲の比率が大きくて取得されなかったデータがあるためです。

ee_get_date_ic(S2_SR)
##                                                                    id          time_start
## 1  COPERNICUS/S2_SR_HARMONIZED/20230403T014651_20230403T015730_T53SMU 2023-04-03 01:57:43
## 2  COPERNICUS/S2_SR_HARMONIZED/20230403T014651_20230403T015730_T53SNU 2023-04-03 01:57:40
## 3  COPERNICUS/S2_SR_HARMONIZED/20230408T014659_20230408T015537_T53SMU 2023-04-08 01:57:46
## 4  COPERNICUS/S2_SR_HARMONIZED/20230410T013651_20230410T014659_T53SMU 2023-04-10 01:47:49
## 5  COPERNICUS/S2_SR_HARMONIZED/20230410T013651_20230410T014659_T53SNU 2023-04-10 01:47:44
## 6  COPERNICUS/S2_SR_HARMONIZED/20230413T014651_20230413T015720_T53SMU 2023-04-13 01:57:44
## 7  COPERNICUS/S2_SR_HARMONIZED/20230413T014651_20230413T015720_T53SNU 2023-04-13 01:57:40
## 8  COPERNICUS/S2_SR_HARMONIZED/20230420T013651_20230420T014655_T53SMU 2023-04-20 01:47:47
## 9  COPERNICUS/S2_SR_HARMONIZED/20230420T013651_20230420T014655_T53SNU 2023-04-20 01:47:43
## 10 COPERNICUS/S2_SR_HARMONIZED/20230423T014651_20230423T015709_T53SMU 2023-04-23 01:57:43
## 11 COPERNICUS/S2_SR_HARMONIZED/20230423T014651_20230423T015709_T53SNU 2023-04-23 01:57:39
## 12 COPERNICUS/S2_SR_HARMONIZED/20230503T014651_20230503T014650_T53SMU 2023-05-03 01:57:44
## 13 COPERNICUS/S2_SR_HARMONIZED/20230503T014651_20230503T014650_T53SNU 2023-05-03 01:57:41
## 14 COPERNICUS/S2_SR_HARMONIZED/20230510T013651_20230510T014656_T53SMU 2023-05-10 01:47:48
## 15 COPERNICUS/S2_SR_HARMONIZED/20230510T013651_20230510T014656_T53SNU 2023-05-10 01:47:44
## 16 COPERNICUS/S2_SR_HARMONIZED/20230515T013659_20230515T014521_T53SMU 2023-05-15 01:47:52
## 17 COPERNICUS/S2_SR_HARMONIZED/20230515T013659_20230515T014521_T53SNU 2023-05-15 01:47:48
## 18 COPERNICUS/S2_SR_HARMONIZED/20230604T013659_20230604T014516_T53SMU 2023-06-04 01:47:53
## 19 COPERNICUS/S2_SR_HARMONIZED/20230604T013659_20230604T014516_T53SNU 2023-06-04 01:47:48
## 20 COPERNICUS/S2_SR_HARMONIZED/20230617T014659_20230617T015533_T53SMU 2023-06-17 01:57:49
## 21 COPERNICUS/S2_SR_HARMONIZED/20230617T014659_20230617T015533_T53SNU 2023-06-17 01:57:45
## 22 COPERNICUS/S2_SR_HARMONIZED/20230619T013701_20230619T013709_T53SMU 2023-06-19 01:47:53
## 23 COPERNICUS/S2_SR_HARMONIZED/20230619T013701_20230619T013709_T53SNU 2023-06-19 01:47:48
## 24 COPERNICUS/S2_SR_HARMONIZED/20230629T013701_20230629T014140_T53SMU 2023-06-29 01:47:53
## 25 COPERNICUS/S2_SR_HARMONIZED/20230704T013659_20230704T014517_T53SMU 2023-07-04 01:47:54
## 26 COPERNICUS/S2_SR_HARMONIZED/20230704T013659_20230704T014517_T53SNU 2023-07-04 01:47:50
## 27 COPERNICUS/S2_SR_HARMONIZED/20230717T014659_20230717T015534_T53SMU 2023-07-17 01:57:49
## 28 COPERNICUS/S2_SR_HARMONIZED/20230717T014659_20230717T015534_T53SNU 2023-07-17 01:57:46
## 29 COPERNICUS/S2_SR_HARMONIZED/20230719T013701_20230719T014553_T53SMU 2023-07-19 01:47:53
## 30 COPERNICUS/S2_SR_HARMONIZED/20230722T014651_20230722T015635_T53SMU 2023-07-22 01:57:48
## 31 COPERNICUS/S2_SR_HARMONIZED/20230722T014651_20230722T015635_T53SNU 2023-07-22 01:57:44
## 32 COPERNICUS/S2_SR_HARMONIZED/20230724T013659_20230724T014518_T53SNU 2023-07-24 01:47:50
## 33 COPERNICUS/S2_SR_HARMONIZED/20230727T014659_20230727T015534_T53SMU 2023-07-27 01:57:50
## 34 COPERNICUS/S2_SR_HARMONIZED/20230727T014659_20230727T015534_T53SNU 2023-07-27 01:57:46
## 35 COPERNICUS/S2_SR_HARMONIZED/20230729T013701_20230729T014702_T53SMU 2023-07-29 01:47:54
## 36 COPERNICUS/S2_SR_HARMONIZED/20230729T013701_20230729T014702_T53SNU 2023-07-29 01:47:50
## 37 COPERNICUS/S2_SR_HARMONIZED/20230801T014701_20230801T015726_T53SMU 2023-08-01 01:57:49
## 38 COPERNICUS/S2_SR_HARMONIZED/20230801T014701_20230801T015726_T53SNU 2023-08-01 01:57:45
## 39 COPERNICUS/S2_SR_HARMONIZED/20230803T013659_20230803T014516_T53SMU 2023-08-03 01:47:53
## 40 COPERNICUS/S2_SR_HARMONIZED/20230803T013659_20230803T014516_T53SNU 2023-08-03 01:47:49
## 41 COPERNICUS/S2_SR_HARMONIZED/20230806T014659_20230806T015533_T53SMU 2023-08-06 01:57:49
## 42 COPERNICUS/S2_SR_HARMONIZED/20230811T014651_20230811T015211_T53SMU 2023-08-11 01:57:49
## 43 COPERNICUS/S2_SR_HARMONIZED/20230813T013659_20230813T014604_T53SMU 2023-08-13 01:47:54
## 44 COPERNICUS/S2_SR_HARMONIZED/20230813T013659_20230813T014604_T53SNU 2023-08-13 01:47:50
## 45 COPERNICUS/S2_SR_HARMONIZED/20230821T014701_20230821T015532_T53SMU 2023-08-21 01:57:50
## 46 COPERNICUS/S2_SR_HARMONIZED/20230821T014701_20230821T015532_T53SNU 2023-08-21 01:57:46
## 47 COPERNICUS/S2_SR_HARMONIZED/20230823T013659_20230823T014603_T53SMU 2023-08-23 01:47:53
## 48 COPERNICUS/S2_SR_HARMONIZED/20230826T014659_20230826T015547_T53SMU 2023-08-26 01:57:48
## 49 COPERNICUS/S2_SR_HARMONIZED/20230826T014659_20230826T015547_T53SNU 2023-08-26 01:57:44
## 50 COPERNICUS/S2_SR_HARMONIZED/20230905T014659_20230905T015548_T53SMU 2023-09-05 01:57:49
## 51 COPERNICUS/S2_SR_HARMONIZED/20230907T013701_20230907T014543_T53SMU 2023-09-07 01:47:54
## 52 COPERNICUS/S2_SR_HARMONIZED/20230910T014701_20230910T015531_T53SNU 2023-09-10 01:57:45
## 53 COPERNICUS/S2_SR_HARMONIZED/20230912T013659_20230912T014457_T53SMU 2023-09-12 01:47:52
## 54 COPERNICUS/S2_SR_HARMONIZED/20230917T013651_20230917T014541_T53SMU 2023-09-17 01:47:52
## 55 COPERNICUS/S2_SR_HARMONIZED/20230917T013651_20230917T014541_T53SNU 2023-09-17 01:47:48
## 56 COPERNICUS/S2_SR_HARMONIZED/20230927T013651_20230927T014453_T53SMU 2023-09-27 01:47:51
## 57 COPERNICUS/S2_SR_HARMONIZED/20230927T013651_20230927T014453_T53SNU 2023-09-27 01:47:47
## 58 COPERNICUS/S2_SR_HARMONIZED/20230930T014651_20230930T015513_T53SMU 2023-09-30 01:57:46
## 59 COPERNICUS/S2_SR_HARMONIZED/20230930T014651_20230930T015513_T53SNU 2023-09-30 01:57:42

Session info
sessionInfo()
## R version 4.3.3 (2024-02-29 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=Japanese_Japan.utf8  LC_CTYPE=Japanese_Japan.utf8    LC_MONETARY=Japanese_Japan.utf8
## [4] LC_NUMERIC=C                    LC_TIME=Japanese_Japan.utf8    
## 
## time zone: Etc/GMT-9
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] sf_1.0-15       rgeeExtra_0.0.1 here_1.0.1      fs_1.6.3        rmarkdown_2.25  leaflet_2.2.1   rgee_1.1.7     
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.0        dplyr_1.1.4             fastmap_1.1.1           webshot2_0.1.1         
##  [5] promises_1.2.1          digest_0.6.34           timechange_0.3.0        lifecycle_1.0.4        
##  [9] ellipsis_0.3.2          processx_3.8.3          terra_1.7-71            magrittr_2.0.3         
## [13] compiler_4.3.3          rlang_1.1.3             progress_1.2.3          tools_4.3.3            
## [17] utf8_1.2.4              yaml_2.3.8              knitr_1.45              askpass_1.2.0          
## [21] prettyunits_1.2.0       htmlwidgets_1.6.4       sp_2.1-3                classInt_0.4-10        
## [25] curl_5.2.0              reticulate_1.35.0       KernSmooth_2.23-22      websocket_1.4.1        
## [29] withr_3.0.0             purrr_1.0.2             leafsync_0.1.0          grid_4.3.3             
## [33] rgl_1.2.8               googledrive_2.1.1       fansi_1.0.6             e1071_1.7-14           
## [37] leafem_0.2.3            extrafontdb_1.0         iterators_1.0.14        cli_3.6.1              
## [41] rayshader_0.37.3        crayon_1.5.2            generics_0.1.3          remotes_2.4.2.1        
## [45] rstudioapi_0.15.0       httr_1.4.7              DBI_1.2.2               chromote_0.2.0         
## [49] proxy_0.4-27            stringr_1.5.1           parallel_4.3.3          base64enc_0.1-3        
## [53] vctrs_0.6.5             webshot_0.5.5           Matrix_1.6-5            jsonlite_1.8.8         
## [57] hms_1.1.3               magick_2.8.3            crosstalk_1.2.1         foreach_1.5.2          
## [61] jquerylib_0.1.4         units_0.8-5             glue_1.7.0              codetools_0.2-19       
## [65] ps_1.7.6                leaflet.providers_2.0.0 lubridate_1.9.3         stringi_1.8.3          
## [69] later_1.3.2             raster_3.6-26           extrafont_0.19          tibble_3.2.1           
## [73] pillar_1.9.0            htmltools_0.5.7         openssl_2.1.1           R6_2.5.1               
## [77] doParallel_1.0.17       rprojroot_2.0.4         evaluate_0.23           lattice_0.22-5         
## [81] highr_0.10              png_0.1-8               gargle_1.5.2            class_7.3-22           
## [85] Rcpp_1.0.12             Rttf2pt1_1.3.12         xfun_0.42               pkgconfig_2.0.3

Discussion