将 imageCollection 转换为具有唯一标签值的字典
Converting an imageCollection into a dictionary with unique label values
我正在尝试编写一个函数,它将使用 Sentinel 2 数据从图像集合中创建一个字典,其中将包含 label/value 对,其中标签来自 MGRS_TILE 属性图像和值将包含具有相同 MGRS_TILE id 的所有图像的列表。标签值必须是 distinct.I 希望输出是这样的:
{'label' : 'tileid1',
'values':[ 图像 1, 图像 2 ...]
'label' : 'tileid2',
'values':[ image3, image4 ...]}
下面是我的代码:
interestImageCollection 是我过滤后的 imageCollection 对象
tileIDS 是一个 ee.List 类型的对象,包含所有不同的图块 ID
字段是我感兴趣的图像 属性 的名称,在本例中是 'MGRS_TILE'.
var build_selectZT = function(interestImageCollection, tileIDS, field){
//this line returns a list which contains the unique tile ids thanks to the keys function
//var field_list = ee.Dictionary(interestImageCollection.aggregate_histogram(field)).keys();
//.map must always return something
var a = tileIDS.map(function(tileId) {
var partialList=ee.List([]);
var partialImage = interestImageCollection.map(function(image){
return ee.Algorithms.If(ee.Image(image).get(field)==tileId, image, null);
});
partialList.add(partialImage);
return ee.Dictionary({'label': tileId, 'value': partialList});
}).getInfo();
return a;
};
不幸的是,上面的函数给了我这样的结果:
{'label' : 'tileid1',
'values':[],
'label' : 'tileid2',
'values':[]}
我认为你可以使用过滤函数而不是使用 if。如果您需要列表形式,则可以使用 toList 函数将其更改为列表。
var build_selectZT = function(interestImageCollection, tileIDS, field){
//.map must always return something
var a = tileIDS.map(function(tileId) {
var partialList=ee.List([]);
// get subset of image collection where images have specific tileId
var subsetCollection = interestImageCollection.filter(ee.Filter.eq(field, tileId));
// convert the collection to list
var partialImage = subsetCollection.toList(subsetCollection.size())
partialList.add(partialImage);
return ee.Dictionary({'label': tileId, 'value': partialList});
}).getInfo();
return a;
};
但是 这实际上会给你一个字典列表
[{'label':'id1','value':[image1]},{'label':'id2','value':[image2,image3]......}]
如果您想像在代码中那样使用 ee.Algorithms.If,那么您的错误在 "ee.Image(image).get(field)==tileId" 部分。由于 .get(field) 是 return 服务器端对象,您不能使用 == 将其等同于某物,因为它是字符串类型,您需要使用 compareTo 代替。但是,如果字符串相同,它 returns 0 并且由于 0 被视为 false,因此当条件为 false 时,您可以 return 图像。
return ee.Algorithms.If(ee.String(ee.Image(image).get(field)).compareTo(tileId), null, image);
我仍然认为这是一个糟糕的方法,因为你会得到一个充满空值的数组,比如
[{'label':'id1','value':[image1, null, null, null, .....]},{'label':'id2','value':[null,image2,image3, null,....]......}]
我正在尝试编写一个函数,它将使用 Sentinel 2 数据从图像集合中创建一个字典,其中将包含 label/value 对,其中标签来自 MGRS_TILE 属性图像和值将包含具有相同 MGRS_TILE id 的所有图像的列表。标签值必须是 distinct.I 希望输出是这样的: {'label' : 'tileid1', 'values':[ 图像 1, 图像 2 ...] 'label' : 'tileid2', 'values':[ image3, image4 ...]}
下面是我的代码: interestImageCollection 是我过滤后的 imageCollection 对象 tileIDS 是一个 ee.List 类型的对象,包含所有不同的图块 ID 字段是我感兴趣的图像 属性 的名称,在本例中是 'MGRS_TILE'.
var build_selectZT = function(interestImageCollection, tileIDS, field){
//this line returns a list which contains the unique tile ids thanks to the keys function
//var field_list = ee.Dictionary(interestImageCollection.aggregate_histogram(field)).keys();
//.map must always return something
var a = tileIDS.map(function(tileId) {
var partialList=ee.List([]);
var partialImage = interestImageCollection.map(function(image){
return ee.Algorithms.If(ee.Image(image).get(field)==tileId, image, null);
});
partialList.add(partialImage);
return ee.Dictionary({'label': tileId, 'value': partialList});
}).getInfo();
return a;
};
不幸的是,上面的函数给了我这样的结果: {'label' : 'tileid1', 'values':[], 'label' : 'tileid2', 'values':[]}
我认为你可以使用过滤函数而不是使用 if。如果您需要列表形式,则可以使用 toList 函数将其更改为列表。
var build_selectZT = function(interestImageCollection, tileIDS, field){
//.map must always return something
var a = tileIDS.map(function(tileId) {
var partialList=ee.List([]);
// get subset of image collection where images have specific tileId
var subsetCollection = interestImageCollection.filter(ee.Filter.eq(field, tileId));
// convert the collection to list
var partialImage = subsetCollection.toList(subsetCollection.size())
partialList.add(partialImage);
return ee.Dictionary({'label': tileId, 'value': partialList});
}).getInfo();
return a;
};
但是 这实际上会给你一个字典列表
[{'label':'id1','value':[image1]},{'label':'id2','value':[image2,image3]......}]
如果您想像在代码中那样使用 ee.Algorithms.If,那么您的错误在 "ee.Image(image).get(field)==tileId" 部分。由于 .get(field) 是 return 服务器端对象,您不能使用 == 将其等同于某物,因为它是字符串类型,您需要使用 compareTo 代替。但是,如果字符串相同,它 returns 0 并且由于 0 被视为 false,因此当条件为 false 时,您可以 return 图像。
return ee.Algorithms.If(ee.String(ee.Image(image).get(field)).compareTo(tileId), null, image);
我仍然认为这是一个糟糕的方法,因为你会得到一个充满空值的数组,比如
[{'label':'id1','value':[image1, null, null, null, .....]},{'label':'id2','value':[null,image2,image3, null,....]......}]