#はじめに
Google Earth EngineをRで書けるということを最近知りました。
自分も使えるようになりたいなと思い、備忘録としてgithubを日本語訳しようかと思います。
公式サイトはこちらです。→text
##Google Earth Engineとは何か?
Google Earth Engineはクラウドベースのプラットフォームであり、ユーザーはリモートセンシングデータのペタバイト規模のアーカイブに簡単にアクセスでき、Googleのインフラストラクチャで地理空間分析を実行できます。現在、GoogleはPythonとJavaScriptのみをサポートしています。 rgeeは、R!へのサポートを提供し始めてギャップを埋めます。以下に、rgeeの構文とGoogleがサポートする2つのクライアントライブラリの比較を示します。
var db = 'CGIAR/SRTM90_V4'
var image = ee.Image(db)
print(image.bandNames())
#> 'elevation'
import ee
ee.Initialize()
db = 'CGIAR/SRTM90_V4'
image = ee.Image(db)
image.bandNames().getInfo()
#> [u'elevation']
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"
)
###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()
###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")
##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 に受信されます。レスポンスも同様の手順で行われます。
#終わりに
githubにはjavascript版も多数ありました。R版のサンプルコードが見たかったですが、それは自分で書いてくださいということでしょうか。
githubの方にも書いてありますが、quick start guideはこちらです。 (PDFのフォントがとても見にくい。。。)