使用 Google Earth Engine(GEE)批量下载 Landsat 遥感影像教程

一、引言

在遥感领域,获取大量的卫星影像数据是进行研究和分析的基础。Google Earth Engine(GEE)提供了一个强大的平台,能够方便地访问和处理海量的遥感数据。本文将详细介绍如何使用 GEE 批量下载 Landsat 8 和 Landsat 9 的遥感影像数据,以满足不同的研究需求。

二、代码解析

以下是实现批量下载 Landsat 影像的 GEE 代码及其详细解释:

1. 定义研究区边界

// 定义研究区边界(东经118°10′-119°54′,北纬31°14′-32°43′)
var roi = ee.Geometry.Rectangle(
  [118.1667, 31.2333, 119.9, 32.7167],
  'EPSG:4326',
  true
);

这里使用ee.Geometry.Rectangle函数定义了一个矩形区域作为研究区,参数分别为矩形的左下角和右上角的经纬度坐标,坐标系统为EPSG:4326(即 WGS84),最后一个参数true表示坐标顺序为[lon, lat]

2. 定义下载年份范围

// 定义下载年份范围(根据实际数据存在性修改)
var startYear = 2020;
var endYear = 2025;  // 截至2023年数据,可修改为2024等最新年份
var years = ee.List.sequence(startYear, endYear);

通过设置startYearendYear来确定需要下载影像的年份范围,然后使用ee.List.sequence函数生成一个包含这些年份的列表。

3. 加载 Landsat 8/9 数据集

// 加载Landsat 8/9数据集
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2');
var l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2');
var merged = l8.merge(l9);

分别加载 Landsat 8 和 Landsat 9 的数据集,然后使用merge函数将两个数据集合并为一个。

4. 云掩膜函数

// 云掩膜函数
function maskClouds(image) {
  var qa = image.select('QA_PIXEL');
  var cloudBit = 1 << 3;
  var cloudShadowBit = 1 << 4;
  var mask = qa.bitwiseAnd(cloudBit).eq(0)
    .and(qa.bitwiseAnd(cloudShadowBit).eq(0));
  return image.updateMask(mask);
}

这个函数用于从影像的质量评估波段(QA_PIXEL)中提取云及其阴影的信息,并生成一个掩膜,将云及其阴影区域屏蔽掉,以得到更清晰的影像数据。

5. 按年处理函数

// 按年处理函数
function processYear(year) {
  // 生成年度时间范围
  var startDate = ee.Date.fromYMD(year, 1, 1);
  var endDate = ee.Date.fromYMD(year, 12, 31);
  
  // 筛选和合成
  var annualComposite = merged
    .filterBounds(roi)
    .filterDate(startDate, endDate)
    .map(maskClouds)
    .median();
  
  // 设置导出参数
  Export.image.toDrive({
    image: annualComposite,
    description: 'Landsat_' + year + '_Export',
    folder: 'GEE_Exports',
    fileNamePrefix: 'Landsat_' + year,
    region: roi,
    scale: 30,
    maxPixels: 1e13,
    crs: 'EPSG:4326',
    fileFormat: 'GeoTIFF'
  });
  
  // 打印年度信息
  print('Processed year:', year);
}

该函数用于处理每一年的数据。首先,根据年份生成年度时间范围;然后,从合并的数据集中筛选出在研究区内且在该年度时间范围内的影像,并应用云掩膜函数,最后使用median函数合成年度影像。接着,设置导出参数,将合成的年度影像导出到 Google Drive 的指定文件夹中,格式为 GeoTIFF。最后,打印处理的年份信息。

6. 执行批量处理

// 执行批量处理
years.evaluate(function(yearsList) {
  yearsList.forEach(processYear);
});

使用evaluate函数将 GEE 中的年份列表转换为 JavaScript 中的列表,然后使用forEach方法对每个年份调用processYear函数,实现批量处理和下载。

7. 显示区域和提示信息

// 显示区域
Map.centerObject(roi, 8);
Map.addLayer(roi, {color: 'red'}, 'ROI');

// 提示信息
print('请在Tasks面板中逐个启动导出任务!');
print('建议先用print(annualComposite)验证数据有效性');

将研究区在地图上显示出来,并添加提示信息,提醒用户在 GEE 的任务面板中手动启动导出任务,并建议在导出前验证数据的有效性。

结果展示:

8. 完整代码:

// 定义研究区边界(东经118°10′-119°54′,北纬31°14′-32°43′)
var roi = ee.Geometry.Rectangle(
  [118.1667, 31.2333, 119.9, 32.7167],
  'EPSG:4326',
  true
);

// 定义下载年份范围(根据实际数据存在性修改)
var startYear = 2020;
var endYear = 2025;  // 截至2023年数据,可修改为2024等最新年份
var years = ee.List.sequence(startYear, endYear);

// 加载Landsat 8/9数据集
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2');
var l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2');
var merged = l8.merge(l9);

// 云掩膜函数
function maskClouds(image) {
  var qa = image.select('QA_PIXEL');
  var cloudBit = 1 << 3;
  var cloudShadowBit = 1 << 4;
  var mask = qa.bitwiseAnd(cloudBit).eq(0)
    .and(qa.bitwiseAnd(cloudShadowBit).eq(0));
  return image.updateMask(mask);
}

// 按年处理函数
function processYear(year) {
  // 生成年度时间范围
  var startDate = ee.Date.fromYMD(year, 1, 1);
  var endDate = ee.Date.fromYMD(year, 12, 31);
  
  // 筛选和合成
  var annualComposite = merged
    .filterBounds(roi)
    .filterDate(startDate, endDate)
    .map(maskClouds)
    .median();
  
  // 设置导出参数
  Export.image.toDrive({
    image: annualComposite,
    description: 'Landsat_' + year + '_Export',
    folder: 'GEE_Exports',
    fileNamePrefix: 'Landsat_' + year,
    region: roi,
    scale: 30,
    maxPixels: 1e13,
    crs: 'EPSG:4326',
    fileFormat: 'GeoTIFF'
  });
  
  // 打印年度信息
  print('Processed year:', year);
}

// 执行批量处理
years.evaluate(function(yearsList) {
  yearsList.forEach(processYear);
});

// 显示区域
Map.centerObject(roi, 8);
Map.addLayer(roi, {color: 'red'}, 'ROI');

// 提示信息
print('请在Tasks面板中逐个启动导出任务!');
print('建议先用print(annualComposite)验证数据有效性');

三、注意事项

  1. 数据范围和年份:根据实际研究需求和数据可用性,合理设置研究区边界和下载年份范围。
  2. 云掩膜效果:云掩膜函数可能无法完全去除所有的云及其阴影,需要根据具体情况进行调整和验证。
  3. 导出任务管理:由于批量下载任务可能较多,建议在 GEE 的任务面板中合理管理和监控导出任务,避免任务失败或重复。
  4. 数据验证:在正式下载数据之前,使用print函数验证合成的年度影像数据的有效性,确保数据符合研究要求。
  • 欢迎关注我的公众号:遥感AI实战,会定期同步更新!
### 使用 Google Earth Engine (GEE) 下载指定研究区的遥感影像 #### 准备工作 为了能够顺利下载所需的研究区域内的遥感影像,在 GEE 中操作前需完成如下准备工作: - 注册并登录到 [Google Earth Engine](https://earthengine.google.com/) 并激活账户。 - 安装 Python 版本的客户端库 `geemap` 或者通过 JavaScript API 进行开发环境配置。 #### 创建地理边界对象 定义目标地区的几何形状作为筛选条件的一部分,可以采用多种方式创建该对象。最常用的是上传自定义矢量文件(如 Shapefile),也可以直接绘制多边形来表示感兴趣地区域[^1]。 ```python import ee from geemap import Map, ee_initialize ee_initialize() # 加载或手动输入坐标构建AOI(Analysis of Interest) aoi = ee.Geometry.Polygon( [[[78.0963134765625, 30.7659345780777], [78.0963134765625, 30.7127577857172], [78.168037109375, 30.7127577857172], [78.168037109375, 30.7659345780777]]]) ``` #### 构建图像集合查询语句 根据需求选择合适的卫星数据源,并设置时间范围和其他过滤器以缩小检索结果集。这里以 Landsat 8 OLI/TIRS 数据为例说明如何获取某段时间内覆盖特定地点的所有可用场景列表[^2]。 ```python # 设置起始日期和结束日期 start_date = '2020-01' end_date = '2020-12-31' # 获取Landsat 8 表面反射率产品 collection = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR') \ .filterBounds(aoi)\ .filterDate(start_date,end_date) print(f'Number of images found: {collection.size().getInfo()}') ``` #### 执行批量下载任务 最后一步是将符合条件的数据导出至用户的 Google Drive 账户或其他存储位置。对于较大的数据集建议分批处理以免超出内存限制。下面给出了一种简单的实现方案用于逐个保存每一张图片为 GeoTIFF 文件格式。 ```python def export_image(image, name): task_config={ 'image': image, 'description':name, 'folder':'gee_export', 'region': aoi.getInfo()['coordinates'], 'scale': 30, 'crs': 'EPSG:4326', 'maxPixels': 1e9 } task=ee.batch.Export.image.toDrive(**task_config) task.start() print(f'Started exporting {name}') images = collection.toList(collection.size()) for i in range(images.size().getInfo()): img = ee.Image(images.get(i)) date_str=img.date().format("YYYYMMdd").getInfo() filename=f"Landsat_{date_str}" export_image(img,filename) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

遥感AI实战

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值