LoginSignup
5

More than 3 years have passed since last update.

Google Earth Engine for R(githubの日本語訳)

Posted at

はじめに

Google Earth EngineをRで書けるということを最近知りました。
自分も使えるようになりたいなと思い、備忘録としてgithubを日本語訳しようかと思います。
公式サイトはこちらです。→text

Google Earth Engineとは何か?

Google Earth Engineはクラウドベースのプラットフォームであり、ユーザーはリモートセンシングデータのペタバイト規模のアーカイブに簡単にアクセスでき、Googleのインフラストラクチャで地理空間分析を実行できます。現在、GoogleはPythonとJavaScriptのみをサポートしています。 rgeeは、R!へのサポートを提供し始めてギャップを埋めます。以下に、rgeeの構文とGoogleがサポートする2つのクライアントライブラリの比較を示します。

JS.js
var db = 'CGIAR/SRTM90_V4'
var image = ee.Image(db)
print(image.bandNames())
#> 'elevation'
python.py
import ee
ee.Initialize()
db = 'CGIAR/SRTM90_V4'
image = ee.Image(db)
image.bandNames().getInfo()
#> [u'elevation']
R.r
library(rgee)
ee_Initialize()
db <- 'CGIAR/SRTM90_V4'
image <- ee$Image(db)
image$bandNames()$getInfo()
#> [1] "elevation"

よく似ていますよね。しかし、RでGoogle Earth Engineを使用する際には、さらに小さな変更点があります。コーディングを始める前に、検討項目を確認してください。

インストール

CRANからインストールする方法は下記です。

install.packages("rgee")

githubから開発バージョンをインストールする方法は下記です。

library(remotes)
install_github("r-spatial/rgee")

さらに、rgeeはPythonパッケージnumpyとeeに依存しています。それらをインストールするには、ユーザーは次の3つの方法のいずれかに従うことができます。

1.ee_installを使用します(Python環境の経験がないユーザーに強くお勧めします)

rgee::ee_install()

2.ee_install_set_pyenvを使用します(Python環境の経験があるユーザーに推奨)

rgee::ee_install_set_pyenv(
  py_path = "/home/csaybar/.virtualenvs/rgee/bin/python", # Change it for your own Python PATH
  py_env = "rgee" # Change it for your own Python ENV
)

設定するPython PATHには、Earth Engine Python APIとnumpyがインストールされている必要があります。Windowsユーザーはminiconda/anacondaの使用が必須ですが、LinuxやMacOSユーザーはvirtualenvを使用することもできます。詳細は、ドキュメントを参照してください。

もう一つの方法は、MacOS と Linux でのみ可能ですが、Python の PATH を設定することです。

rgee::ee_install_set_pyenv(
  py_path = "/usr/bin/python3", 
  py_env = NULL
)

ただし、PythonENVを設定するまでrgee :: ee_install_upgradeとreticulate :: py_installは機能しません。

3.Rstudiov.1.4>を提供するPythonPATH設定サポートを使用します。このチュートリアルを参照してください。

Pythonの依存関係をインストールした後(およびR !!を再起動した後)、以下の関数を使用してrgeeのステータスを確認できます。

ee_check() # Check non-R dependencies

rgeeを他のPythonパッケージと同期する

rgeeをgeemapと統合します。

library(reticulate)
library(rgee)

# 1. Initialize the Python Environment  
ee_Initialize()

# 2. Install geemap in the same Python ENV that use rgee
py_install("geemap")
gm <- import("geemap")

earthengine-apiをアップグレードします

library(rgee)
ee_Initialize()
ee_install_upgrade()

パッケージ規則

rgeeをgeemapと統合します。
- すべてのrgee関数には接頭辞ee_が付いています。オートコンプリートはあなたの友達です:)。
- プレフィックスee $ ...が付いたEarthEngineAPIへのフルアクセス。
- ee_Initializeを使用してEarthEngine RAPIを認証および初期化します。セッションごとに1回必要です!
- rgeeは「パイプフレンドリー」であり、%>%を再エクスポートしますが、rgeeを使用する必要はありません。

Hello World

1.夜間照明の傾向を計算する(JSバージョン)

Earth Engine RAPIを認証して初期化します。

library(rgee)
ee_Initialize()

1991年からの年数として画像の日付を含むバンドを追加します。

collection <- ee$
  ImageCollection('NOAA/DMSP-OLS/NIGHTTIME_LIGHTS')$
  select('stable_lights')$
  map(createTimeBand)

各ピクセルの一連の値に対して線形フィットを計算し、y切片を緑で視覚化し、正/負の傾きを赤/青で視覚化します。

col_reduce <- collection$reduce(ee$Reducer$linearFit())
col_reduce <- col_reduce$addBands(
  col_reduce$select('scale'))
ee_print(col_reduce)

インタラクティブな視覚化を作成してください!

Map$setCenter(9.08203, 47.39835, 3)
Map$addLayer(
  eeObject = col_reduce,
  visParams = list(
    bands = c("scale", "offset", "scale"),
    min = 0,
    max = c(0.18, 20, -0.18)
  ),
  name = "stable lights trend"
)

image.png

2.降水量の値を抽出します

tidyverseおよびsfのRパッケージをインストールしてロードし、その後、Earth Engine R APIを初期化します。

library(tidyverse)
library(rgee)
library(sf)

ee_Initialize()

ncシェープファイルを読み取ります。

nc <- st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)

2001年の各画像をマッピングして、Terraclimateデータセットから月間降水量(Pr)を抽出します

terraclimate <- ee$ImageCollection("IDAHO_EPSCOR/TERRACLIMATE") %>% 
  ee$ImageCollection$filterDate("2001-01-01", "2002-01-01") %>% 
  ee$ImageCollection$map(function(x) x$select("pr")) %>% # Select only precipitation bands
  ee$ImageCollection$toBands() %>% # from imagecollection to image
  ee$Image$rename(sprintf("%02d",1:12)) # rename the bands of an image

ee_extractは、raster::extractと同様に、ImageCollectionオブジェクト(x)、ジオメトリ(y)、および値を要約する関数(fun)を定義するだけで動作します。

ee_nc_rain <- ee_extract(x = terraclimate, y = nc["NAME"], sf = FALSE)

ggplot2を使用して、美しい静的プロットを生成してください!

ee_nc_rain %>%
  pivot_longer(-NAME, names_to = "month", values_to = "pr") %>%
  mutate(month, month=gsub("X", "", month)) %>% 
  ggplot(aes(x = month, y = pr, group = NAME, color = pr)) +
  geom_line(alpha = 0.4) +
  xlab("Month") +
  ylab("Precipitation (mm)") +
  theme_minimal()

image.png

3. NDVIアニメーション(JSバージョン)を作成します

sfをインストールしてロードし、その後、Earth Engine RAPIを初期化します。

library(magick)
library(rgee)
library(sf)

ee_Initialize()

アニメーションフレームの地域境界とNDVIデータをクリップするマスクを定義します。

mask <- system.file("shp/arequipa.shp", package = "rgee") %>% 
  st_read(quiet = TRUE) %>% 
  sf_as_ee()
region <- mask$geometry()$bounds()

MODIS Terra Vegetation Indices 16-Day Global 1kmデータセットをee.ImageCollectionとして取得し、NDVIバンドを選択します。

col <- ee$ImageCollection('MODIS/006/MOD13A2')$select('NDVI')

合成日で画像をグループ化

col <- col$map(function(img) {
  doy <- ee$Date(img$get('system:time_start'))$getRelative('day', 'year')
  img$set('doy', doy)
})
distinctDOY <- col$filterDate('2013-01-01', '2014-01-01')

完全なコレクションのどの画像が個別のDOYコレクションのDOYと一致するかを識別するフィルターを定義します。

filter <- ee$Filter$equals(leftField = 'doy', rightField = 'doy')

結合を定義します。結果のFeatureCollectionをImageCollectionに変換します。

join <- ee$Join$saveAll('doy_matches')
joinCol <- ee$ImageCollection(join$apply(distinctDOY, col, filter))

一致するDOYコレクション間で中央値の削減を適用します。

comp <- joinCol$map(function(img) {
  doyCol = ee$ImageCollection$fromImages(
    img$get('doy_matches')
  )
  doyCol$reduce(ee$Reducer$median())
})

RGB視覚化パラメーターを定義します。

visParams = list(
  min = 0.0,
  max = 9000.0,
  bands = "NDVI_median",
  palette = c(
    'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',
    '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01',
    '012E01', '011D01', '011301'
  )
)

アニメーションフレームとして使用するRGB視覚化画像を作成します。

rgbVis <- comp$map(function(img) {
  do.call(img$visualize, visParams) %>% 
    ee$Image$clip(mask)
})

GIF視覚化パラメーターを定義します。

gifParams <- list(
  region = region,
  dimensions = 600,
  crs = 'EPSG:3857',
  framesPerSecond = 10
)

ee_utils_gif_ *関数を使用して、GIFアニメーションをレンダリングし、いくつかのテキストを追加します。

animation <- ee_utils_gif_creator(rgbVis, gifParams, mode = "wb")
animation %>% 
  ee_utils_gif_annotate(
    text = "NDVI: MODIS/006/MOD13A2",
    size = 15, color = "white",
    location = "+10+10"
  ) %>% 
  ee_utils_gif_annotate(
    text = dates_modis_mabbr, 
    size = 30, 
    location = "+290+350",
    color = "white", 
    font = "arial",
    boxcolor = "#000000"
  ) # -> animation_wtxt

# ee_utils_gif_save(animation_wtxt, path = "raster_as_ee.gif")

77121867-203e0300-6a34-11ea-97ba-6bed74ef4300.gif

rgeeはどのように機能しますか?

rgeeは、JavascriptやPythonクライアントのようなEarth EngineのネイティブAPIではないので、これを実現するのは、特にAPIが活発に開発されていることを考えると、非常に困難です。では、Rを使ってEarth Engineを実行するにはどうすればよいのでしょうか?その答えはreticulateです。reticulateはRとPythonの間でシームレスな相互運用を可能にするために設計されたRパッケージです。RでEarth Engineのリクエストが作成されると、reticulateがこのピースをPythonに変換します。Pythonコードが取得されると、Earth Engine Python APIがリクエストをJSONフォーマットに変換します。最後に、リクエストは Web REST API を通じて Google Earth Engine Platform に受信されます。レスポンスも同様の手順で行われます。

image.png

終わりに

githubにはjavascript版も多数ありました。R版のサンプルコードが見たかったですが、それは自分で書いてくださいということでしょうか。
githubの方にも書いてありますが、quick start guideはこちらです。 (PDFのフォントがとても見にくい。。。)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5