做时间序列相关算法的同学,经常需要下载年际的数据来进行试验。而且算法研究的比较重要的步骤就是利用实测站点数据进行验证。本文讲述如何使用GEE下载指定卫星遥感/再分析数据集指定位置(实测站点位置)的时间序列值。
整个过程可以在imageCollection
上进行操作,并且中间处理过程的返回对象都是image
,这种情景非常简单直接。配合上篇博客,也可以进行QC过滤。
首先定义点的经纬度坐标。然后过滤数据集合,这里以MODIS的NDVI产品MOD13A2为例。由于MOD13A2在GEE中原始分辨率为900+m并且原始投影为正弦投影,而我需要在WGS84坐标系上1 km左右尺度的值,所以这里还包括了一个平均聚合和重投影的过程(非常重要)。如果需要从低分辨率向高分辨率采样,则将聚合过程替换为.resample(method)
即可。最后就是生成指定点的时间序列图表。
var gwn = ee.Geometry.Point([-89.8729, 34.2574], 'EPSG: 4326');
var mod13a2Collection = ee.ImageCollection("MODIS/006/MOD13A2")
.filterBounds(gwn)
.filterDate('2010-01-01', '2011-01-01')
.select('NDVI');
print(mod13a2Collection);
var mod13a2Collection = mod13a2Collection.map(function(image){
return image.reduceResolution({
reducer: ee.Reducer.mean(),
})
.reproject({
crs: 'EPSG: 4326',
scale: 1000
});
});
var chart = ui.Chart.image.series({
imageCollection: mod13a2Collection,
region: gwn,
reducer: ee.Reducer.first(),
scale: 1000
}).setOptions({title: 'NDVI'});
print(chart);
可以看出上边的情形是在最后一步使用ui.Chart.image.series
时指定了提取位置。如果在中间过程中就对提取位置进行指定,即对image
使用.reduceRegion
,那么它的返回对象就是一个由指定位置值组成的年序列列表,无法再构成原始的imageCollection
。这时候就需要额外的步骤进行提取。这里以GLDAS的10cm土壤水分为例:
var gwn = ee.Geometry.Point([-89.8729, 34.2574], 'EPSG: 4326');
var gldasSoilMoisture = ee.ImageCollection("NASA/GLDAS/V021/NOAH/G025/T3H")
.filterDate('2010-01-01', '2011-01-01')
.filter(ee.Filter.eq('start_hour', 15))
.select('SoilMoi0_10cm_inst');
//
var gldasSoilMoisture = gldasSoilMoisture.toList(365).map(function(image){
var soilMoisture = ee.Image(image)
.resample('bicubic')
.reduceRegion({
geometry: gwn,
reducer: ee.Reducer.first(),
scale: 1000
});
return soilMoisture;
});
print(gldasSoilMoisture);
上述代码中,由于.reduceRegion
返回的并不再是image
,所以无法直接对原始imageCollection
应用map
,需要首先将其转换为List
。此外,由于GLDAS原始影像分辨率为0.25°,我需要1 km尺度值,所以需要对它指定重采样方法(如果不指定,GEE默认为最邻近法,误差很大)。上述代码,print
的结果为:
可以看出返回对象还是List
,其中每个元素都是字典的形式,SoilMoi0_10cm_inst
的值就是我们所需要的值。
所以,接下来需要把值单独提取出来构成一个``List`。
// the calculate result is a list with some dictionary
var gldasSoilMoisture = gldasSoilMoisture.map(function(object){
return ee.Dictionary(object).get('SoilMoi0_10cm_inst');
});
print(gldasSoilMoisture);
var chart = ui.Chart.array.values({
array: gldasSoilMoisture,
axis: 0
});
print(chart);
上述代码即将列表中每个字典的值提取出来构成了新的列表,并进行绘图。
这种情况的代码其实写的麻烦了,不进行.reduceRegion
,就可以和第一种情景的代码一致了。但是,掌握这种情景,以后也能更灵活的进行实现。
后续会更新一篇如何将GLDAS的3小时气温数据求均值转为日均值,并提取指定点年序列值的博客。