Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于属性的中值从ee.ImageCollection中选择图像_Python_Median_Google Earth Engine - Fatal编程技术网

Python 基于属性的中值从ee.ImageCollection中选择图像

Python 基于属性的中值从ee.ImageCollection中选择图像,python,median,google-earth-engine,Python,Median,Google Earth Engine,我正在使用一个值对图像集合进行属性设置,我希望选择具有该图像集合中值的图像 目前,我正在创建一个带有clientside值的图像列表,将列表填充为奇数,然后使用中间值获取Id和我想要的值,然后根据该Id过滤集合。这是可行的,但我必须调用get values clientside来计算中间值Id,然后过滤集合。我觉得这应该是可能的,不必做一个客户端列表 所以我的问题是,在没有客户端列表的情况下,我能做到这一点吗?EE中的所有服务器端,以及我如何做到这一点 ''' ''' 因此,基本上对于元数据中有

我正在使用一个值对图像集合进行属性设置,我希望选择具有该图像集合中值的图像

目前,我正在创建一个带有clientside值的图像列表,将列表填充为奇数,然后使用中间值获取Id和我想要的值,然后根据该Id过滤集合。这是可行的,但我必须调用get values clientside来计算中间值Id,然后过滤集合。我觉得这应该是可能的,不必做一个客户端列表

所以我的问题是,在没有客户端列表的情况下,我能做到这一点吗?EE中的所有服务器端,以及我如何做到这一点

'''

'''


因此,基本上对于元数据中有值的图像集合,我只想选择具有medain值的图像,而不使用任何客户端getInfo()

您可以使用
ImageCollection.reduceColumns
算法来获得集合属性的中值。然后可以使用过滤器选择具有该值的图元

我已经准备了一个JavaScript示例,但由于它完全是服务器端操作,所以翻译起来应该不会太难:

var landsat=ee.ImageCollection(“landsat/LC08/C01/T1_-TOA”);
var pointOfInterest=ee.Geometry.Point([-115.10699177547879,40.56521148064664]);
var图像=陆地卫星
.filterDate('2017-05-01'、'2017-09-01')
.filterBounds(兴趣点)
.map(功能(img){
//为示例添加一个数值属性:点处B2的值。
返回img.setMulti(img.select(['B2'],['B2'u at'u point'])。reduceRegion({
减速器:ee.reducer.mean(),
几何学:兴趣点,
}));
});
//显示值列表,仅用于示例(不再进一步使用)。
打印(images.reduceColumns(ee.Reducer.toList(),['B2_at_point']).get('list');
//计算中位数。
var中位数=ee.数字(
images.reduceColumns(ee.Reducer.median(),['B2_在_点']))
.get('median'));
打印(中位数);
//查找具有中间值的一个或多个图像。
var exactlyEqualsMedian=images.filter(ee.filter.equals('B2_在_点,中位数));
var equalsOrNextToMedian=ee.ImageCollection(ee.Algorithms.If(
exactlyEqualsMedian.first(),//exactlyEqualsMedian是否为非空?
exactlyEqualsMedian,//然后返回它。
图像//否则查找最近的2个图像。
.map(功能(i){
返回i.set('median_distance',median.subtract(i.get('B2_at_point')).abs());
})
.限制(2,“中间距离”);
印刷品(同等或非印刷品);
地图设定中心(-115.08,40.56,9);
addLayer(等距或横向,{bands:['B4','B3','B2'],max:0.4,gamma:1.6});

(请注意,这里的计算没有科学价值;它只是一个在图像采集中找到中值的例子。)


请注意,我没有采用将输入填充到median()的方法。更确切地说,我会在之后过滤以选择精确的匹配图像或两个最近的匹配。这是因为我希望它比预先设置填充更有效(因为它需要额外的时间查询集合以了解集合的大小)。当然,您可以在生成的2图像集合中选择适合您需要的图像-如果您不关心哪个图像,只需使用
equals或exttomedian.first()

您可以使用
ImageCollection.reduceColumns
算法来获得集合属性的中值。然后可以使用过滤器选择具有该值的图元

我已经准备了一个JavaScript示例,但由于它完全是服务器端操作,所以翻译起来应该不会太难:

var landsat=ee.ImageCollection(“landsat/LC08/C01/T1_-TOA”);
var pointOfInterest=ee.Geometry.Point([-115.10699177547879,40.56521148064664]);
var图像=陆地卫星
.filterDate('2017-05-01'、'2017-09-01')
.filterBounds(兴趣点)
.map(功能(img){
//为示例添加一个数值属性:点处B2的值。
返回img.setMulti(img.select(['B2'],['B2'u at'u point'])。reduceRegion({
减速器:ee.reducer.mean(),
几何学:兴趣点,
}));
});
//显示值列表,仅用于示例(不再进一步使用)。
打印(images.reduceColumns(ee.Reducer.toList(),['B2_at_point']).get('list');
//计算中位数。
var中位数=ee.数字(
images.reduceColumns(ee.Reducer.median(),['B2_在_点']))
.get('median'));
打印(中位数);
//查找具有中间值的一个或多个图像。
var exactlyEqualsMedian=images.filter(ee.filter.equals('B2_在_点,中位数));
var equalsOrNextToMedian=ee.ImageCollection(ee.Algorithms.If(
exactlyEqualsMedian.first(),//exactlyEqualsMedian是否为非空?
exactlyEqualsMedian,//然后返回它。
图像//否则查找最近的2个图像。
.map(功能(i){
返回i.set('median_distance',median.subtract(i.get('B2_at_point')).abs());
})
.限制(2,“中间距离”);
印刷品(同等或非印刷品);
地图设定中心(-115.08,40.56,9);
addLayer(等距或横向,{bands:['B4','B3','B2'],max:0.4,gamma:1.6});

(请注意,这里的计算没有科学价值;它只是一个在图像采集中找到中值的例子。)

请注意,我没有采用将输入填充到median()的方法。更确切地说,我会在之后过滤以选择精确的匹配图像或两个最近的匹配。这是因为我希望它比预先设置填充更有效(因为它需要额外的时间查询集合以了解集合的大小)。当然,您可以在最终生成的2图像集合中选择适合您需要的图像-如果您不关心哪一个,只需选择
equalsOrNextToMedian.first()<
# returns a list of image data scores
client_list = get_attribute_and_id_client_side_list(ts_collection, 'datascore')

# padding so we always get a value rather than an average of 2
if len(client_list) % 2 == 0:
    client_list.append(['padding', 0])

median_datscore = np.median([item[1] for item in client_list])
median_score_coll = ts_collection.filterMetadata('data_score', 'equals', median_datscore)