とらりもんHOME  Index  Search  Changes  Login

とらりもん - Google Earth Engine Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}

2017/08/18 Jin Katagi: Add Tips parts.
* [[code editor|https://code.earthengine.google.com/]]  
! 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|https://developers.google.com/earth-engine/getstarted]] first.

!Tutorials
* [[Google Earth Engine 入門|https://sites.google.com/site/mizuochipublic/%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84-remote-sensing-tutorials/google-earth-engine%E5%85%A5%E9%96%80]] ... by 水落さん
* [[ゼロから始める衛星画像解析|https://jkatagi.github.io/contents/google_earth_engine/]] ... by 片木さん

! Tips
!! Collect cloud free image
[[Filtering and Sorting|https://developers.google.com/earth-engine/getstarted#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|https://developers.google.com/earth-engine/image_visualization#color-palettes]] and [[Band math|https://developers.google.com/earth-engine/getstarted#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()に渡すと、一枚のレイヤとして表示される([[ソース|https://developers.google.com/earth-engine/tutorial_api_04]])。
<<<
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
[[マニュアル|https://developers.google.com/earth-engine/python_install_manual]]に従う。

マニュアルではPython 2.xだが、Python 3.xでも動く。

!! ImportError: cannot import name opentype
$ pip3 install --upgrade google-auth-oauthlib

[[ソース| https://stackoverflow.com/questions/47600597/import-error-cannot-import-name-opentype]]

!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});
}