Объединенная коллекция GEE не работает в функции

Я работаю с двумя коллекциями спутниковых данных. Я хочу выбрать определенные группы из коллекции 1, присоединить их к коллекции 2, а затем запустить функцию. К сожалению, функция не работает с объединенными данными, хотя работает для коллекции 1.

Вот пример только с использованием B10 Sentinel-2.

//identifying area and date
var geometry = ee.Geometry.Point([4,45]);

Map.centerObject(geometry,10);
var start = '2019-03-10';
var end   = '2019-05-10';


//my function
function testing(img){
  img = img.updateMask(img.select(['B10']).gt(200).focal_min(2).focal_max(2).not());
  return img;
}

//my two collections
var collection1 = ee.ImageCollection('COPERNICUS/S2').filterDate(start,end)
                  .filterBounds(geometry);
  
var B10s=collection1.select('B10');
//print('B10s',B10s);


var collection2 = ee.ImageCollection('COPERNICUS/S2_SR')
                  .filterDate(start,end)
                  .filterBounds(geometry);
                  
// joining the collections
var filtering = ee.Filter.equals({
  leftField: 'system:time_start',
  rightField: 'system:time_start'
});

var simpleJoin = ee.Join.inner();
var innerJoin = simpleJoin.apply(collection2, B10s, filtering);
var joined = innerJoin.map(function(feature) {
  return ee.Image.cat(feature.get('primary'), feature.get('secondary'));
});

print('Joined', joined);

//just to visualize one image
//var coll1 = ee.Image(collection1.first());
//Map.addLayer(coll1, {bands:['B2'], min:0, max:5000},'B2Coll1 test');

//running the function for collection 1 works
var test = collection1.map(testing);
var tess = ee.Image(test.first());
Map.addLayer(tess, {bands:['B2'], min:0, max:5000},'B2 test');

//here when running with the joined collection, there is a problem
var TestingJoined = joined.map(testing);

Ошибка: img.select(...).gt is not a function

Как мне заставить это работать?


person ie-con    schedule 13.10.2020    source источник
comment
Пожалуйста, в вопросах по коду дайте минимальный воспроизводимый пример -- вырезайте, вставляйте и запускайте код, включая наименьший репрезентативный ввод примера как код; желаемый и фактический вывод (включая дословные сообщения об ошибках); теги и версии; четкая спецификация и объяснение. Дайте наименьший код, который вы можете показать, это код, который, как вы показываете, в порядке, расширенный кодом, который, как вы показываете, не в порядке. (Основы отладки.) Для SQL, который включает СУБД и DDL (включая ограничения и индексы) и ввод в виде кода в формате таблицы. Как спросить Приостановить работу над общей целью, сократить код до 1-го выражения, не дающего того, что вы ожидаете, и сказать, что вы ожидаете и почему.   -  person philipxy    schedule 13.10.2020
comment
Почему вы ожидаете, что GT будет доступен там? (С обоснованием ссылки на авторитетную документацию.)   -  person philipxy    schedule 13.10.2020


Ответы (2)


Когда вы отлаживаете, соединение работает так, как задумано? Есть ли проблема с тем, что даты и время слишком точны, чтобы разрешить полное соединение?

Второй путь, по которому я бы пошел, — убедиться, что объединенный объект идентичен коллекциям. Я сомневаюсь, что это было бы так, если бы вы не использовали его или что-то в этом роде (хотя я не знаком с этой библиотекой). Ваша тестовая функция, которую вы сопоставляете с этими коллекциями, может работать только с несвязанными. Если вы предоставите фактическую «проблему» или вывод об ошибке, это будет очень полезно.

person Ryanman    schedule 13.10.2020

Ok. Я решил это. Спасибо за ваш вклад. Мне нужно было использовать приведение в функции. Теперь это работает.

function testing(img){
  img = ee.Image(img).updateMask(ee.Image(img).select(['B10']).gt(200).focal_min(2).focal_max(2).not());
  return img;
}
person ie-con    schedule 13.10.2020