とらりもんHOME  Index  Search  Changes  Login

Google Earth Engine

2017/08/18 Jin Katagi: Add Tips parts.

What is Google Earth Engine ?

紹介ビデオ (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

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) : 画像を表示

Python

マニュアルに従う。

マニュアルでは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});
}
Last modified:2019/12/28 14:29:18
Keyword(s):
References:[とらりもんHOME]