如何从 Google Earth Engine 导出带有用户定义日期格式的属性数据和关联日期的 csv 文件?

问题描述

美好的一天

我正在尝试使用 Landsat 7 和 8 数据在 Google 地球引擎中生成增强型植被指数 (EVI)。我编译了下面的代码来过滤特定时间段和感兴趣区域的图像集合,并屏蔽图像中的大部分云层。然后我继续计算 EVI 并将这些值添加到图像集合中作为我可以选择进行进一步处理的属性。我为 Landsat 7 和 Landsat 8 分别进行了这个过程。但是,由于我对从这两个数据集生成的 EVI 感兴趣,我将它们合并到一个图像集合中。

使用此图像集合,我想计算特定感兴趣区域的平均 EVI 值,然后将这些值以及相关日期(格式为 dd-mm-yyyy)导出为“.csv”文件.我知道这可以通过单击生成的图表并下载关联的“.csv”文件或使用“Export.table.toDrive”功能导出数据来实现。但是,这些选项都没有提供如下表所示结构中的输出

enter image description here

此处提供了代码示例。对此的任何帮助将不胜感激。亲切的问候。

/// Add region of interest
var ROI = ee.FeatureCollection("users/shaedengokool/Eben_Sluis_15YO")
Map.addLayer(ROI,{},'ROI')
Map.centerObject(ROI,10)

//1. Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
              .filterDate('2002-01-01','2020-01-01')
              .filterBounds(ROI)
              .map(function(image){return image.clip(ROI)})
              
var L8cloudlessEVI = l8.map(function(image) {
  // Get a cloud score in [0,100].
  var cloud = ee.Algorithms.Landsat.simpleCloudscore(image).select('cloud');

  // Create a mask of cloudy pixels from an arbitrary threshold.
  var mask = cloud.lte(10);

  // Compute EVI.
  var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',{
      'NIR': image.select('B5'),'RED': image.select('B4'),'BLUE': image.select('B2')
}).rename('EVI');

  // Return the masked image with an EVI band.
  return image.addBands(evi).updateMask(mask);
});

var L8EVI_collection = L8cloudlessEVI

//2. Import the Landsat 7 TOA image collection.
var l7 = ee.ImageCollection('LANDSAT/LE07/C01/T1_TOA')
              .filterDate('2002-01-01','2020-01-01')
              .filterBounds(ROI)
              .map(function(image){return image.clip(ROI)})

var L7cloudlessEVI = l7.map(function(image) {
  // Get a cloud score in [0,{
      'NIR': image.select('B4'),'RED': image.select('B3'),'BLUE': image.select('B1')
}).rename('EVI');

  // Return the masked image with an EVI band.
  return image.addBands(evi).updateMask(mask);
});

var L7EVI_collection = L7cloudlessEVI

var merged = ee.ImageCollection(L7EVI_collection.merge(L8EVI_collection));
print(merged,'Merged')

var chart = ui.Chart.image.series({
    imageCollection: merged.select('EVI'),region: ROI,reducer: ee.Reducer.mean(),scale: 30,})

print(chart,"EVI")

// get the mean value for the region from each image
var meanEVI = merged.map(function(image){
  var date = image.get('system:time_start');
  var mean = image.reduceRegion({
    reducer: ee.Reducer.mean(),geometry: ROI,scale: 30
  });
  // and return a feature with 'null' geometry with properties (dictionary)  
  return ee.Feature(null,{'mean': mean.get('EVI'),'date': date})
});

// Export a .csv table of date,mean NDVI for watershed
Export.table.toDrive({
  collection: meanEVI,description: 'EVI_Timeseries',folder: 'Genus_Exchange_GEE_Data',fileFormat: 'CSV',})

;

解决方法

在下面的代码中,我添加了一个日期作为图像属性并将其导出到 CSV。我还重新安排了一些代码以减少计算时间。

代码如下:

var roi = ee.FeatureCollection("users/shaedengokool/Eben_Sluis_15YO")

// Define time of interest
var startdate = '2019-06-01' // insert
var enddate = '2020-06-01' // insert

var years = ee.List.sequence(ee.Date(startdate).get('year'),ee.Date(enddate).get('year'));

/// EVI calculations from Landsat

// This function masks clouds in Landsat 8 imagery.
function maskL8(im) {
  var qa = im.select('BQA');
  var mask = qa.eq(2720);
  return im.updateMask(mask).copyProperties(im);
}
// This function masks clouds in Landsat 7 imagery.
function maskL7(im) {
  var qa = im.select('BQA');
  var mask = qa.eq(672);
  return im.updateMask(mask).copyProperties(im);
}
// see: https://landsat.usgs.gov/sites/default/files/documents/landsat_QA_tools_userguide.pdf

var ls8toa = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
.filterBounds(roi)
  .filterDate(startdate,enddate)
    .map(function(im) {return maskL8(im)})

var ls7toa = ee.ImageCollection('LANDSAT/LE07/C01/T1_TOA').filterBounds(roi).filterDate(startdate,enddate)
.map(function(im) {return maskL7(im)})
    
var ls7_evi = ls7toa.map(function(image) {
  var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',{
      'NIR': image.select('B4'),'RED': image.select('B3'),'BLUE': image.select('B1')
}).rename('EVI')
return image.addBands(evi)
})

var ls8_evi = ls8toa.map(function(image) {
  var evi = image.expression(
    '2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))',{
      'NIR': image.select('B5'),'RED': image.select('B4'),'BLUE': image.select('B2')
}).rename('EVI')
return image.addBands(evi)
})

var landsat = ee.ImageCollection(ls7_evi.merge(ls8_evi));
var EVI = landsat.select(['EVI'])
print(EVI,'EVI')

//create function to calculate mean values for each polygon
var pointsmean = function(image) {
  var means = image.reduceRegions({
    collection: roi,// used to be roi.select(['Id'])
    reducer: ee.Reducer.mean(),scale: 30
  })
  
  // assign time for every feature
  means = means.map(function(f) { return f.set({date: image.date().format("YYYY-MM-dd")}) })
  
  return means.copyProperties(image)
};

var finalEVI = EVI.map(pointsmean).flatten()
.sort('date',false)
.select(['date','mean'])
print(finalEVI.limit(100),'final EVI')

Export.table.toDrive({
collection: finalEVI,description: 'EVI_'+startdate+'TO'+enddate,fileFormat: 'CSV'
});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...