Google Earth Engine for R（githubの日本語訳）

#はじめに
Google Earth EngineをRで書けるということを最近知りました。
自分も使えるようになりたいなと思い、備忘録としてgithubを日本語訳しようかと思います。
公式サイトはこちらです。→[text](https://github.com/r-spatial/rgee)

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

```javascript:JS.js
var db = 'CGIAR/SRTM90_V4'
var image = ee.Image(db)
print(image.bandNames())
#> 'elevation'
```

```python:python.py
import ee
ee.Initialize()
db = 'CGIAR/SRTM90_V4'
image = ee.Image(db)
image.bandNames().getInfo()
#> [u'elevation']
```

```R:R.r
library(rgee)
ee_Initialize()
db <- 'CGIAR/SRTM90_V4'
image <- ee$Image(db)
image$bandNames()$getInfo()
#> [1] "elevation"
```

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

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

```R
install.packages("rgee")
```

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

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

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

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

```R
rgee::ee_install()
```

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

```R
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 を設定することです。

```R
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のステータスを確認できます。

```R
ee_check() # Check non-R dependencies
```

##rgeeを他のPythonパッケージと同期する
rgeeをgeemapと統合します。

```R
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をアップグレードします

```R
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を認証して初期化します。

```javascript
library(rgee)
ee_Initialize()
```

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

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

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

```javascript
col_reduce <- collection$reduce(ee$Reducer$linearFit())
col_reduce <- col_reduce$addBands(
  col_reduce$select('scale'))
ee_print(col_reduce)
```
インタラクティブな視覚化を作成してください！

```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/b368204a-cb2c-1a99-1cc9-d3e2b71ac42b.png)

###2.降水量の値を抽出します
tidyverseおよびsfのRパッケージをインストールしてロードし、その後、Earth Engine R APIを初期化します。

```R
library(tidyverse)
library(rgee)
library(sf)

ee_Initialize()
```

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

```R
nc <- st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
```
2001年の各画像をマッピングして、Terraclimateデータセットから月間降水量（Pr）を抽出します

```R
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）を定義するだけで動作します。

```R
ee_nc_rain <- ee_extract(x = terraclimate, y = nc["NAME"], sf = FALSE)
```
ggplot2を使用して、美しい静的プロットを生成してください！

```R
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/617d38c9-c7b4-e62e-2ffc-4077bdd1feb8.png)

###3. NDVIアニメーション（JSバージョン）を作成します
sfをインストールしてロードし、その後、Earth Engine RAPIを初期化します。

```javascript
library(magick)
library(rgee)
library(sf)

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

```javascript
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バンドを選択します。

```javascript
col <- ee$ImageCollection('MODIS/006/MOD13A2')$select('NDVI')
```
合成日で画像をグループ化

```javascript
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と一致するかを識別するフィルターを定義します。

```javascript
filter <- ee$Filter$equals(leftField = 'doy', rightField = 'doy')
```
結合を定義します。結果のFeatureCollectionをImageCollectionに変換します。

```javascript
join <- ee$Join$saveAll('doy_matches')
joinCol <- ee$ImageCollection(join$apply(distinctDOY, col, filter))
```
一致するDOYコレクション間で中央値の削減を適用します。

```javascript
comp <- joinCol$map(function(img) {
  doyCol = ee$ImageCollection$fromImages(
    img$get('doy_matches')
  )
  doyCol$reduce(ee$Reducer$median())
})
```
RGB視覚化パラメーターを定義します。

```javascript
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視覚化画像を作成します。

```javascript
rgbVis <- comp$map(function(img) {
  do.call(img$visualize, visParams) %>% 
    ee$Image$clip(mask)
})
```
GIF視覚化パラメーターを定義します。

```javascript
gifParams <- list(
  region = region,
  dimensions = 600,
  crs = 'EPSG:3857',
  framesPerSecond = 10
)
```
ee_utils_gif_ *関数を使用して、GIFアニメーションをレンダリングし、いくつかのテキストを追加します。

```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/5d18ae1f-a887-40a3-7d81-1e9d5cbd52de.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/0ba8a3a2-059e-e632-7683-4d3ed5405a9a.png)

#終わりに
githubにはjavascript版も多数ありました。R版のサンプルコードが見たかったですが、それは自分で書いてくださいということでしょうか。
githubの方にも書いてありますが、quick start guideは[こちら](http://amazeone.com.br/barebra/pandora/rgeebookT1eng.pdf)です。　（PDFのフォントがとても見にくい。。。）