GEE:如何批量处理并下载指定时间范围的月尺度NDVI数据集(MOD09GA为例)

该代码示例展示了如何在GoogleEarthEngine(GEE)中获取MOD09GA数据集的月尺度NDVI产品,并应用云和水体掩膜。同时,它说明了如何从GAUL数据集中获取行政区划属性信息,特别是名称。此外,讨论了GEE数据集的单位换算过程,解释了像元值的缩放和偏移处理。
摘要由CSDN通过智能技术生成

目录

01 说明

 02 完整代码

2023.07.06修改:


01 说明

源码链接:https://code.earthengine.google.com/4f02959684e1ad8bd70df97175540b89

这里仅说明如何查找GAUL数据集的各个行政区划的属性信息,特别是行政区划的名称.

var fvLayer = ui.Map.FeatureViewLayer('FAO/GAUL/2015/level1_FeatureView');
var visParams = {
  color: '00909F',
  fillColor: 'b5ffb4',
  opacity: 1,
  width: 1,
  pointSize: 1
};
fvLayer.setVisParams(visParams);
fvLayer.setName('First Level Administrative Units');
Map.setCenter(7.82, 49.1, 4);
Map.add(fvLayer);

 运行上述代码,通过显示在图层上的各个行政区划,将鼠标状态切换到Inspector,点击指定区域获取该位置的行政区划要素的属性信息。操作如下:

 02 完整代码

/*
该程序用于获取指定时间范围的MOD09GA数据集的月尺度NDVI产品
*/

// 定义日期范围
var start_date = '2000-02-01';  // 必须以一号结尾
var end_date = '2020-12-31';
var roi_name = 'Sichuan Sheng';

// 定义云和水体掩膜函数
function maskCloudAndWater(image) {
  var QA = image.select('QC_500m');
  // 创建一个空的mask,初始值为1(即所有像素都不被掩膜覆盖)
  var mask = ee.Image.constant(1);
  
  // 遍历每个波段的数据质量标识
  for (var i = 0; i < 2; i++) {  // 因为我选取了两个波段进行ndvi的计算
    // 计算当前波段的数据质量标识的起始位(是从2开始)
    var startBit = 2 + i * 4;
    // 提取当前波段的数据质量标识
    var bandQuality = QA.rightShift(startBit).bitwiseAnd(15);
    // 如果数据质量标识为15,说明该像素可能被云或深海覆盖,需要被掩膜覆盖
    mask = mask.min(bandQuality.neq(15));  // min取两者间小的那个值,逐像元
  }
  
  // 应用掩膜
  return image.updateMask(mask);
}

// 定义获取日期列表的函数
function month_list(start_date, end_date) {
  // 将字符串转换为ee.Date对象
  var startDate = ee.Date(start_date);
  var endDate = ee.Date(end_date);
  
  // 计算总共有多少个月
  var diff = endDate.difference(startDate, 'month').round();
  
  // 创建每个月的开始和结束日期的列表
  var dates = ee.List.sequence(0, diff.subtract(1)).map(function (n) {
    var start = startDate.advance(n, 'month');
    var end = start.advance(1, 'month').advance(-1, 'day');
    return [start.format('YYYY-MM-dd'), end.format('YYYY-MM-dd')];
  });
  
  return dates
}

// 定义地理空间范围(四川省)
// var roi = ee.FeatureCollection('projects/ee-chaoqiezione/assets/china_admin_province')
// roi = roi.filter(ee.Filter.eq('省', roi_name));
var roi = ee.FeatureCollection("FAO/GAUL/2015/level1")
  .filter(ee.Filter.eq('ADM1_NAME', roi_name));
Map.addLayer(roi.style({fillColor: "00000000"}), {width: 2}, roi_name)
Map.centerObject(roi, 6)

// 生成日期列表
var dates = month_list(start_date, end_date);
dates.evaluate(function(dates) {
  dates.map(function(date){
    var start = ee.Date(date[0]);
    var stop = ee.Date(date[1]);
    
    // 加载MODIS数据根据日期和地理范围进行筛选
    var modis_ndvi = ee.ImageCollection("MODIS/061/MOD09GA")
      .filterDate(start, stop)
      .filterBounds(roi)
      .select(['sur_refl_b02', 'sur_refl_b01', 'QC_500m'])
      .map(function (img) {
        img = maskCloudAndWater(img);  // 水体和云掩膜
        // img = img.multiply(0.0001)  本应进行单位换算, 但是仅仅计算ndvi时会约掉,为了减小计算量这里不进行
        return img.normalizedDifference(['sur_refl_b02', 'sur_refl_b01']).rename('ndvi')  // 计算ndvi
      })
      .mean().clip(roi).unmask(-9999)
    
    modis_ndvi = modis_ndvi.set({name: ee.String(start.format('YYYY-MM-dd'))});
    
    Export.image.toDrive({
      image: modis_ndvi.select("ndvi"),
      region: roi.geometry(),
      scale:500,
      description: "ndvi_" + date[0] + '_' + date[1],
      folder: 'MOD09GA_NDVI',
    });
  })
})

// 仅用于查看GAUL行政区划的属性信息
// var fvLayer = ui.Map.FeatureViewLayer('FAO/GAUL/2015/level1_FeatureView');
// var visParams = {
//   color: '00909F',
//   fillColor: 'b5ffb4',
//   opacity: 1,
//   width: 1,
//   pointSize: 1
// };
// fvLayer.setVisParams(visParams);
// fvLayer.setName('First Level Administrative Units');
// Map.setCenter(7.82, 49.1, 4);
// Map.add(fvLayer);

2023.07.06修改:


 关于GEE数据集单位换算的一些说明

为什么要进行单位换算?可能是由于GEE在存储时避免浮点数(相对于整数所占空间更大)存储,因此对所有像元值进行了缩放(scale),当然可能为了避免缩放后还有负数(因为unsigned在相同字节下可以存储更多)影响存储,可能还进行了偏移(offset)使其为正数。因此,我们需要再将其逆向
转化回原来的真实像元值。(上述仅平时处理常规数据集的经验之谈(scale_factor, offset多在HDF、NC文件中出现),对于GEE可能原因不止于此)

公式为:

Physical Value = Digital Number * Scale Factor + Offset

因此一般而言,Scale Factor为浮点数例如0.0001,Offset为负数。 

如何查看当前数据集的Scale Factor和Offset?

 

 


  时间有限,很多代码的相关讨论并没有进行。如有问题,私聊或者评论.

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
以下是一个 Python 脚本,可以帮助你批量下载MOD13Q1 NDVI数据: ``` python import ee ee.Initialize() # 设置要下载的区域 region = ee.Geometry.Polygon( [[[72.5, 34.5], [72.5, 44.5], [102.5, 44.5], [102.5, 34.5]]]) # 设置时间范围 start_date = '2010-01-01' end_date = '2020-12-31' # 设置输出的文件名 output_name = 'MOD13Q1_NDVI' # 设置输出的文件格式 output_format = 'GeoTIFF' # 设置MODIS产品的ID collection_id = 'MODIS/006/MOD13Q1' # 获取MODIS产品的数据集 collection = ee.ImageCollection(collection_id).filterDate(start_date, end_date).filterBounds(region) # 批量下载数据 # 设置每个影像的分辨率 scale = 250 # 获取影像列表 image_list = collection.toList(collection.size()) # 遍历影像列表 for i in range(image_list.size().getInfo()): # 获取当前影像 image = ee.Image(image_list.get(i)) # 获取当前影像的日期 date = ee.Date(image.get('system:time_start')).format('YYYY-MM-DD').getInfo() # 设置输出的文件名 output_file_name = output_name + '_' + date # 设置输出的路径 output_file_path = '/path/to/output/folder/' + output_file_name + '.' + output_format # 下载影像 task = ee.batch.Export.image.toDrive(image=image, description=output_file_name, fileNamePrefix=output_file_name, folder='GEE', scale=scale, region=region.getInfo()['coordinates'], fileFormat=output_format) task.start() print('Downloading', output_file_name) ``` 在运行脚本之前,需要进行以下几个设置: 1. 将 `region` 变量设置为你想要下载数据的区域,这里的例子是一个矩形范围。 2. 将 `start_date` 和 `end_date` 变量设置为你想要下载数据时间范围。 3. 将 `output_name` 变量设置为你想要输出的文件名前缀。 4. 将 `output_format` 变量设置为你想要输出的文件格式,支持的格式包括 'GeoTIFF', 'TFRecord', 'Zipped GeoTIFF', 'PNG', 'JPEG', 'GIF', 'BMP', 'Kea', 'ENVI', 'HDF5', 'Numpy', 'Idrisi'。 5. 将 `collection_id` 变量设置为 MODIS 产品的 ID,这里是 MOD13Q1 NDVI 数据的 ID。 6. 将 `output_file_path` 变量设置为你想要保存下载数据的路径。 7. 运行脚本。 注意:在运行脚本之前,需要先安装 Google Earth Engine Python API。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒茄子

不装逼我浑身难受aaa

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值