在Google Earth Engine上从NEX-GDDP产品导出每日气候数据

我正在使用NEX-GDDP来获取2018-01-01至2099-12-31期间某些点的21个GCM模型的每日气候数据(降水,最小温度和最大温度)。我为一个场景中的一个模型制作了这个脚本

//Dataset
var dataset = ee.ImageCollection('NASA/NEX-GDDP')
              .filter(ee.Filter.date('2018-01-01','2099-12-31'))
              .filterMetadata('scenario','equals','rcp45')
              .filterMetadata('model','MPI-ESM-LR')

//Points of interest 
var Acomayo = ee.Geometry.Point([-71.689166667,-13.921388889]),var Machupicchu = ee.Geometry.Point([-72.545555556,-13.166666667]),var Urubamba = ee.Geometry.Point([-72.129116546,-13.323123791]),var Pisac = ee.Geometry.Point([-71.849444444,-13.415833333]),var Ccatcca = ee.Geometry.Point([-71.56,-13.609722222]),var GranjaKcayra = ee.Geometry.Point([-71.875,-13.556666667]),var Pomacanchi = ee.Geometry.Point([-71.5357971,-14.027777778]),var Sicuani = ee.Geometry.Point([-71.236944444,-14.253333333]);

var pts = ee.FeatureCollection(ee.List([ee.Feature(Acomayo),ee.Feature(Machupicchu),ee.Feature(Urubamba),ee.Feature(Pisac),ee.Feature(Ccatcca),ee.Feature(GranjaKcayra),ee.Feature(Pomacanchi),ee.Feature(Sicuani)]));

//Export to table .CSV
// Empty Collection to fill
var ft = ee.FeatureCollection(ee.List([]));

//Without removal of null values ----------------------------------
//Function to extract values from image collection based on point file and export as a table 
var fill = function(img,ini) {
// type cast
var inift = ee.FeatureCollection(ini);

// gets the values for the points in the current img
var ft2 = img.reduceRegions(pts,ee.Reducer.first(),30);

// gets the date of the img
var date = img.date().format("yyyy/MM/dd");
var scenario = img.get("scenario");
var model = img.get("model");


// writes the date in each feature
var ft3 = ft2.map(function(f){return f.set("date",date,"scenario",scenario,"model",model)});
// merges the FeatureCollections
return inift.merge(ft3);
};

// Iterates over the ImageCollection
var newft = ee.FeatureCollection(dataset.iterate(fill,ft));
//print(newft);

// Export

Export.table.toDrive({
  collection: newft,description: 'GCM_diario',folder: 'Downscalling_Diario',fileFormat: 'csv'
});

脚本可以正常工作两天零两点,但是对于我需要的当前时间点和时间段,它在5个小时后仍然可以正常工作。为了减少数据量,我认为这些想法:

  1. 平均产品中21个GCM模型的每日数据,并使其成为一个ImgaeCollection,因此 只需按场景分开即可。
  2. 将每个变量(Pp,Tmin,Tmax)的ImageCollection导出到NetCDF仅包含点的区域(不知道是否是 可能)。
geometry = ee.Geometry.Polygon(
        [[[-72.77555636882136,-12.867571480133547],[-72.77555636882136,-14.670820732958893],[-70.69914035319636,-12.867571480133547]]],null,false);

如果还有另一种下载此数据的方式,我会打开它。

yanglinice 回答:在Google Earth Engine上从NEX-GDDP产品导出每日气候数据

使用.iterate()可能会占用大量内存,并且容易出现内存错误。一种更直接的方法是选择您要关注的特定点,遍历所有感兴趣的日子,然后使用.reduceRegion()获取所需的信息。然后,您可以将时间序列导出为CSV,并将其转换为所需的任何格式。

以下是获取所有模型和方案的所有变量的示例:

// specify start and end date
// Change as needed
var startDate = ee.Date('2018-01-01');
var endDate = ee.Date('2019-01-01');

// get the dataset between date range and extract band on interest
var dataset = ee.ImageCollection('NASA/NEX-GDDP')
                  .filter(ee.Filter.date(startDate,endDate));

// get projection and band information
var firstImage = dataset.first();
var bandNames = firstImage.bandNames();
var proj = firstImage.projection();

var point = ee.Geometry.Point([-71.689166667,-13.921388889])

// calculate number of days to map and extract data for
var n = endDate.difference(startDate,'day').subtract(1);

// map over each date and extract all climate model values
var timeseries = ee.FeatureCollection(
  ee.List.sequence(0,n).map(function(i){
    var t1 = startDate.advance(i,'day');
    var t2 = t1.advance(1,'day');
    var dailyColl = dataset.filterDate(t1,t2);
    var dailyImg = dailyColl.toBands();
    // rename bands to handle different names by date
    var bands = dailyImg.bandNames();
    var renamed = bands.map(function(b){
      var split = ee.String(b).split('_');
      return split.slice(0,2).cat(split.slice(-1)).join('_');
    });
    // extract the data for the day and add time information
    var dict = dailyImg.rename(renamed).reduceRegion({
      reducer: ee.Reducer.mean(),geometry: point,scale: proj.nominalScale()
    }).combine(
      ee.Dictionary({'system:time_start':t1.millis(),'isodate':t1.format('YYYY-MM-dd')})
    );
    return ee.Feature(point,dict);
  })
);
print(timeseries);

// get properties to chart (all climate models)
var props = timeseries.first().propertyNames().removeAll(['system:time_start','system:index','isodate']);

// Make a chart of the results.
var chart = ui.Chart.feature.byFeature(timeseries,'system:time_start',props.getInfo());
print(chart);

Map.addLayer(point);
Map.centerObject(point,6);

// export feature collection to CSV
Export.table.toDrive({
  collection: timeseries,description: 'NEX-GDDP-timeseries',fileFormat: 'CSV',});

在使用长日期范围(2018-2099)时,您可能会在代码编辑器中遇到内存错误,但导出应能正常工作。另外,请记住,地球引擎的导出有点简单,因此逐点导出将是最好的方法,1)避免内存错误,2)将生成的CSV保持在1点。您可以将所有点合并在一起,然后将每个点的时间序列导出到一个文件中,但是一旦导出就可能很难使用...

这是一个有效的链接:https://code.earthengine.google.com/139432f76ae3f6a81b1459762325ef7f

本文链接:https://www.f2er.com/3092222.html

大家都在问