Google Earth Engine
- What is Google Earth Engine (GEE)?
- Tutorials
- Tips
- Collect cloud free image
- Get image center
- Calculate NDVI difference at two time periods
- 画像の切り出し
- 時系列画像の表示
- サンプリング
- Memo
- Python
- Examples
2017/08/18 Jin Katagi: Add Tips parts.
What is Google Earth Engine (GEE)?
紹介ビデオ (introduction movie): https://www.youtube.com/watch?v=Hr3F0s9oKwQ
アカウント作成 (How to make your account): https://docs.google.com/forms/d/17-LSoJQcBUGIwfplrBFLv0ULYhOahHJs2MwRF2XkrcM/viewform
See Get Started first.
Tutorials
- Google Earth Engine 入門 ... by 水落さん
- ゼロから始める衛星画像解析 ... by 片木さん
Tips
Collect cloud free image
Filtering and Sorting slightly modified.
// set the conter of your area of intrest (Near the Tsukuva city). var point = ee.Geometry.Point(140.1217, 36.1101); // construct start and end dates var start = ee.Date('2014-06-01'); var finish = ee.Date('2014-10-01'); var filteredCollection = ee.ImageCollection('LANDSAT/LC8_L1T') .filterBounds(point) .filterDate(start, finish) .sort('CLOUD_COVER', true); // Get the lowest cloud cover image. var first = filteredCollection.first(); var image = ee.Image(first); // Define visualizatoin parameters in an object literal. var vizParams = {bands: ['B4', 'B3', 'B2'], min: 5000, max: 15000, gamma: [0.95, 1.1, 1]}; // Center the map on the image and display. Map.centerObject(image, 9); Map.addLayer(image, vizParams, 'Landsat 8 true color');
Get image center
// Load Landsat 5 image var image1 = ee.Image('LT5_L1T_TOA/LT50440341990155XXX03'); // In case you want to know the value of the center latitude and logitude of the image. print(Map.getCenter(image1)); // In case you just want to set center. Map.centerObject(image1, 9);
Calculate NDVI difference at two time periods
Referred Color palettes and Band math.
// This function gets NDVI from Landsat 5 imagery. var getNDVI = function(image) { return image.normalizedDifference(['B4', 'B3']); }; // Load two Landsat 5 images, 20 years apart. var image1 = ee.Image('LT5_L1T_TOA/LT50440341990155XXX03'); // 1990-06-04 var image2 = ee.Image('LT5_L1T_TOA/LT50440342010162EDC00'); // 2010-06-11 // Compute NDVI from the scenes. var ndvi1 = getNDVI(image1); var ndvi2 = getNDVI(image2); // Compute the difference in NDVI. var ndviDifference = ndvi2.subtract(ndvi1); // set the color palette. 0:Blue, 1:Red. var ndviViz = {min: 0, max: 1, palette: ['0000FF', 'FF0000']}; // Center the map on the image and display. Map.centerObject(ndviDifference, 9); Map.addLayer(ndviDifference, ndviViz, 'NDVI Difference');
画像の切り出し
以下の領域で切りだすとする。
var region = ee.Geometry.Rectangle([140, 36, 141, 37]);
1シーンの場合(imageがee.Image()のインスタンスの場合)
var clip_image = ee.Image(image).clip(region);
複数シーンの場合(imagesがee.ImageCollection()のインスタンスの場合)
var clip_serires = images.map(function(image) { return image.clip(region); });
時系列画像の表示
ImageCollectionのインスタンスをMap.addLayer()に渡すと、一枚のレイヤとして表示される(ソース)。
Map.addLayer(images);
ある領域で複数レイヤとして表示させたい場合は、以下のようにループを回してもうまく行かない。
var loop_size = images.size(); for (var i = 0; i < loop_size; i++) { Map.addLayer(images[i]); }
これはGoogle Earth Engineの処理が逐次実行ではなく、高度に並列化されているからだと思われる。
知人による回答
> また、loopで回そうにもGoogleEarthEngineの並列処理のせいか、 今回の場合は images[i] というアクセスの仕方が無理なせいだと思う。 ImageCollection の要素に直接アクセスする方法は無いんじゃないかな。 ただやっぱり並列処理のせいでループに関してはややこしい。 ee. で始まるクラスのオブジェクト(ee.ImageCollectionなど) はサーバーサイド にある実体への proxy でしかないので、 クライアントサイドのループである for 文で処理しようとするとおかしなことになる場合が多い。 リスト的な ee. オブジェクトには iterate メソッドというのがあるので、それを使ってループ的な処理をするのが普通なのかな。 images.iterate(function(img, acc) { Map.addLayer(img) return acc }, acc) みたいに使う。 しかし上記の場合は動かない。 iterate の第一引数になる関数はサーバーサイドで呼び出されるんだけど、Map.addLayer はクライアントサイドの関数なのでダメ。 というわけで件名の問題をどうにかする方法はわからん。 画像をダウンロードしてGEE以外のツールで表示するしかないかも。
サンプリング
時系列画像(ImageCollection)の場合
Memo
よく使うコマンド
- Map.centerObject(image) : 画像を表示の中心に合わせる
- Map.addLayer(image,zoomLevel) : 画像を表示
"run"ボタンを押す代わりにCTRL+ENTERでも実行できる。
Python
- 水落さんのチュートリアル
- マニュアルに従う。
- 最初の認証で自動で立ち上がるブラウザはFirefoxではダメ(エラーが出る)。ChromeだとOK (2023/06/20 奈佐原)。
マニュアルではPython 2.xだが、Python 3.xでも動く。
ImportError: cannot import name opentype
$ pip3 install --upgrade google-auth-oauthlib
ソース
Examples
var lon = 68.5872; var lat = 23.4; var wsize=0.12 var geometry = ee.Geometry.Rectangle([lon-wsize/2, lat-wsize/2, lon+wsize/2, lat+wsize/2]); var mangrove_map=ee.ImageCollection('LANDSAT/MANGROVE_FORESTS') .filterBounds(geometry) .first(); Map.addLayer(mangrove_map, {min:0, max:1}, 'mangrove_map'); Export.image.toDrive({image: mangrove_map, description: 'mangrove_map', fileNamePrefix: 'mangrove_map', scale: 30, region: geometry}); var y='2009' var L5 = ee.ImageCollection('LANDSAT/LT05/C01/T1_SR') .filterBounds(geometry) .filterDate(y+'-01-01',y+'-03-31') .filterMetadata('CLOUD_COVER', 'less_than', 2) .select(['B1','B2','B3', 'B4']) .first(); Map.addLayer(L5, {bands: ['B3', 'B2', 'B1'], min:0, max:3000}, 'L5'); print(L5.date()) var L5ndvi = L5.normalizedDifference(['B4', 'B3']); Map.addLayer(L5ndvi, {min:0, max:1}, 'L5ndvi'); Export.image.toDrive({image: L5, description: 'Landsat5', fileNamePrefix: y+'_L5', scale: 30, region: geometry}); Export.image.toDrive({image: L5ndvi, description: 'Landsat5_NDVI', fileNamePrefix: y+'_L5_NDVI', scale: 30, region: geometry}); var y='2015' var L8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR') .filterBounds(geometry) .filterDate(y+'-01-01',y+'-03-31') .filterMetadata('CLOUD_COVER', 'less_than', 2) .select(['B2','B3','B4', 'B5']) .first(); Map.addLayer(L8, {bands: ['B4', 'B3', 'B2'], min:0, max:3000}, 'L8'); var L8ndvi = L8.normalizedDifference(['B5', 'B4']); Map.addLayer(L8ndvi, {min:0, max:1}, 'L8ndvi'); Export.image.toDrive({image: L8, description: 'Landsat8', fileNamePrefix: y+'_L8', scale: 30, region: geometry}); Export.image.toDrive({image: L8ndvi, description: 'Landsat8_NDVI', fileNamePrefix: y+'_L8_NDVI', scale: 30, region: geometry});
output Landsat 5
var lon = 68.5872; var lat = 23.4; var wsize=0.12 var geometry = ee.Geometry.Rectangle([lon-wsize/2, lat-wsize/2, lon+wsize/2, lat+wsize/2]); var y='2009' var L5 = ee.ImageCollection('LANDSAT/LT05/C01/T1_SR') .filterBounds(geometry) .filterDate(y+'-01-01',y+'-12-31') .filterMetadata('CLOUD_COVER', 'less_than', 4) .select(['B1','B2','B3', 'B4']); var nscenes=L5.size(); var imageList = L5.toList(nscenes); print(nscenes); for (var i=1; i<nscenes.getInfo(); i++){ var image = ee.Image(imageList.get(i)); var date=image.date().format('YYYY-MM-DD').getInfo(); print(image.date()); Map.addLayer(image, {bands: ['B3', 'B2', 'B1'], min:0, max:3000}, date); Export.image.toDrive({image: image, description: 'Landsat5', fileNamePrefix: date+'_L5', scale: 30, region: geometry}); }
Keyword(s):
References:[とらりもんHOME]