Google 어스 엔진의 타일 오류?

Sep 06 2020

아래 코드는 Google Earth Engine에서 ASTER 방사 측정 수정을 위해 작성되었지만 시각화 단계에서이 오류를 반환합니다.

코드 링크 :https://code.earthengine.google.com/3ccaaaa0e9ce68bdf80b8056be5d057d

Map.centerObject(table);
Map.addLayer(table)
 
var ast = ee.ImageCollection("ASTER/AST_L1T_003")
.filterDate('2000-01-01','2020-01-01')
.filterBounds(table)
.filter(ee.Filter.calendarRange(7,9,'month'))
.select('B0[4-9]')
.map(function(img){
  
  var gain4 = ee.Image(ee.Number(img.select('B04').get('GAIN_COEFFICIENT_B04')));
  var gain5 = ee.Image(ee.Number(img.select('B05').get('GAIN_COEFFICIENT_B05')));
  var gain6 = ee.Image(ee.Number(img.select('B06').get('GAIN_COEFFICIENT_B06')));
  var gain7 = ee.Image(ee.Number(img.select('B07').get('GAIN_COEFFICIENT_B07')));
  var gain8 = ee.Image(ee.Number(img.select('B08').get('GAIN_COEFFICIENT_B08')));
  var gain9 = ee.Image(ee.Number(img.select('B08').get('GAIN_COEFFICIENT_B09')));
  
  
  var b4 = img.select('B04').multiply(gain4).clip(table);
  var b5 = img.select('B05').multiply(gain5).clip(table);
  var b6 = img.select('B06').multiply(gain6).clip(table);
  var b7 = img.select('B07').multiply(gain7).clip(table);
  var b8 = img.select('B08').multiply(gain8).clip(table);
  var b9 = img.select('B09').multiply(gain9).clip(table);
  
  
  var stack = ee.Image.cat([b4,b5,b6,b7,b8,b9]);
  return stack
}).median();


print(ast);

Map.addLayer(ast)

답변

KevinReid Sep 06 2020 at 22:46

선택한 이미지의 모든 이미지에 속성 GAIN_COEFFICIENT_B04등 이있는 것은 아닙니다 . 예를 들어, ASTER/AST_L1T_003/20100709070749만있다

GAIN_COEFFICIENT_B01: 0.676
GAIN_COEFFICIENT_B02: 0.708
GAIN_COEFFICIENT_B10: 0.006822
GAIN_COEFFICIENT_B11: 0.00678
GAIN_COEFFICIENT_B12: 0.00659
GAIN_COEFFICIENT_B13: 0.005693
GAIN_COEFFICIENT_B14: 0.005225
GAIN_COEFFICIENT_B3N: 0.862

따라서 .get('GAIN_COEFFICIENT_B04')null을 반환하고 null이 상수 이미지에 대해 유효한 값이 아니므로 이미지 계산이 실패합니다.

이미지 컬렉션에 필터를 추가하여 해당 속성이 있는지 확인할 수 있습니다.

.filter(ee.Filter.notNull([
  'GAIN_COEFFICIENT_B04',
  'GAIN_COEFFICIENT_B05',
  'GAIN_COEFFICIENT_B06',
  'GAIN_COEFFICIENT_B07',
  'GAIN_COEFFICIENT_B08',
  'GAIN_COEFFICIENT_B09',
]))

귀하의 코드를 개선 할 수있는 몇 가지 다른 개선 사항을 발견했습니다.

  var gain4 = ee.Image(ee.Number(img.select('B04').get('GAIN_COEFFICIENT_B04')));

여기서는 .select('B04')아무것도하지 않습니다 (속성을 얻었으므로 속성은 밴드와 무관합니다). 또한 다음과 같이 .get()작성할 필요 가없는 변형이 있습니다 ee.Number.

  var gain4 = ee.Image(img.getNumber('GAIN_COEFFICIENT_B04'));

그러나 이것은 훨씬 더 간단 할 수 있습니다 ee.Image(constant). 많은 경우 에 쓸 필요가 없습니다 . 숫자를 쓸 수 있으며 이미지로 변환됩니다.

  var b4 = img.select('B04').multiply(img.getNumber('GAIN_COEFFICIENT_B04')).clip(table);

마지막으로, .clip(table)결과보다는 개별 이미지에 불필요하게 비효율적 이며 테이블 / 컬렉션으로 클리핑 할 때 더 효율적인 것을 사용해야합니다 .clipToCollection(table)(단 하나의 기능 만 있기 때문에 중요하지 않음).

.map(function(img){
  ...
}).median().clipToCollection(table);

함께 모아서:

var ast = ee.ImageCollection("ASTER/AST_L1T_003")
  .filterDate('2000-01-01','2020-01-01')
  .filterBounds(table)
  .filter(ee.Filter.calendarRange(7,9,'month'))
  .select('B0[4-9]')
  .filter(ee.Filter.notNull([
    'GAIN_COEFFICIENT_B04',
    'GAIN_COEFFICIENT_B05',
    'GAIN_COEFFICIENT_B06',
    'GAIN_COEFFICIENT_B07',
    'GAIN_COEFFICIENT_B08',
    'GAIN_COEFFICIENT_B09',
  ]))
  .map(function(img){
    return ee.Image.cat([
      img.select('B04').multiply(img.getNumber('GAIN_COEFFICIENT_B04')),
      img.select('B05').multiply(img.getNumber('GAIN_COEFFICIENT_B05')),
      img.select('B06').multiply(img.getNumber('GAIN_COEFFICIENT_B06')),
      img.select('B07').multiply(img.getNumber('GAIN_COEFFICIENT_B07')),
      img.select('B08').multiply(img.getNumber('GAIN_COEFFICIENT_B08')),
      img.select('B09').multiply(img.getNumber('GAIN_COEFFICIENT_B09')),
    ]);
  })
  .median()
  .clipToCollection(table);

https://code.earthengine.google.com/3ba97a7c2009def6043c614c5aeae4f7