Sentinel-2 卫星提供了高分辨率的地表覆盖图像,广泛应用于农业监测、城市规划、环境变化分析等诸多领域。在 Google Earth Engine (GEE) 中,我们能够按特定地理范围导出这些影像,以支持更深入的研究和分析。
使用方法 💻
GEE 提供了一个强大的平台用于处理和导出 Sentinel-2 数据。本文将介绍如何利用 Python 与 GEE API 来按指定地理范围导出 Sentinel-2 卫星影像。
https://developers.google.com/earth-engine/datasets/catalog/sentinel-2
代码详解 🔍
下面是一个使用 Python 和 GEE API 导出 Sentinel-2 卫星影像的代码详解:
- 获取边界信息
aoi = ee.FeatureCollection(area_of_interest)
feature_count = aoi.size().getInfo()
这里加载了地理兴趣区域,并检查了这个区域是否包含有效的特征。如果没有任何特征,则会打印一条消息提示集合为空。
- 获取兴趣区域的几何信息
geometry = aoi.geometry()
获取了地理兴趣区域的几何形状,这将用于后续的图像过滤和裁剪操作。
- 加载 Sentinel-2 图像集合
s2_collection = ee.ImageCollection('COPERNICUS/S2_HARMONIZED') \
.filterBounds(geometry) \
.filterDate(datetime(year, 1, 1), datetime(year + 1, 1, 1)) \
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
从 Copernicus Sentinel-2
数据集中加载图像集合,并过滤出感兴趣区域内的图像。接着,进一步筛选出指定年份的图像,并排除云层占比超过 20%
的图像。
- 定义云遮蔽函数
def mask_s2clouds(image):
qa = image.select('QA60')
cloud_mask = qa.bitwiseAnd(1 << 10).eq(0).And(qa.bitwiseAnd(1 << 11).eq(0))
return image.updateMask(cloud_mask).divide(10000)
这个函数通过选择 QA60
波段,并应用位运算来检测云层。然后更新掩膜来移除检测到的云,并将像素值标准化(因为 Sentinel-2
图像的原始像素值是 10000 倍的实际反射率)。
- 对图像集合应用云遮蔽函数
masked_collection = s2_collection.map(mask_s2clouds)
应用前面定义的云遮蔽函数到整个 Sentinel-2 图像集合上。
- 计算图像集合的中值图像,并按兴趣区域裁剪
median_image = masked_collection.median().clip(aoi)
计算了图像集合的中值图像,这有助于减少噪声和云的影响。之后,按照地理兴趣区域裁剪图像。
- 选择正确的波段顺序
selected_bands = median_image.select(['B4', 'B3', 'B2'])
选择了红绿蓝(RGB)波段作为输出图像的显示,这是常见的视觉化方式。
- 导出图像到 Google Drive
export_task = ee.batch.Export.image.toDrive(
image=selected_bands,
description=aoi.first().get('name').getInfo(),
folder=output_directory,
fileNamePrefix=aoi.first().get('name').getInfo(),
region=geometry,
scale=10,
maxPixels=1e13
)
export_task.start()
设置了导出任务,将裁剪后的中值图像导出到 Google Drive 上指定的目录下。导出的文件名基于地理兴趣区域的名称,以方便识别。
完整案例 🏞️
在此示例中,我们首先初始化了必要的变量,并加载了地理兴趣区域的边界数据集。随后,创建了 Sentinel-2 卫星影像的集合,并应用了云遮蔽函数。最后,计算了中值影像并将其导出到了 Google Drive。
import ee
from datetime import datetime
# 初始化 Earth Engine
ee.Initialize()
def crop_image_sentinel(area_of_interest, year, output_directory):
"""
导出 Sentinel-2 图像到 Google Drive.
参数:
area_of_interest -- 地理兴趣区域的 FeatureCollection URL.
year -- 导出图像的年份.
output_directory -- Google Drive 中保存图像的目录.
"""
# 获取边界信息
aoi = ee.FeatureCollection(area_of_interest)
feature_count = aoi.size().getInfo()
if feature_count > 0:
# 获取兴趣区域的几何信息
geometry = aoi.geometry()
# 加载 Sentinel-2 图像集合
s2_collection = ee.ImageCollection('COPERNICUS/S2_HARMONIZED') \
.filterBounds(geometry) \
.filterDate(datetime(year, 1, 1), datetime(year + 1, 1, 1)) \
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
# 定义云遮蔽函数
def mask_s2clouds(image):
qa = image.select('QA60')
cloud_mask = qa.bitwiseAnd(1 << 10).eq(0).And(qa.bitwiseAnd(1 << 11).eq(0))
return image.updateMask(cloud_mask).divide(10000)
# 对图像集合应用云遮蔽函数
masked_collection = s2_collection.map(mask_s2clouds)
# 计算图像集合的中值图像,并按兴趣区域裁剪
median_image = masked_collection.median().clip(aoi)
# 选择正确的波段顺序
selected_bands = median_image.select(['B4', 'B3', 'B2'])
# 导出图像到 Google Drive
export_task = ee.batch.Export.image.toDrive(
image=selected_bands,
description=aoi.first().get('name').getInfo(),
folder=output_directory,
fileNamePrefix=aoi.first().get('name').getInfo(),
region=geometry,
scale=10,
maxPixels=1e13
)
export_task.start()
else:
print('The FeatureCollection is empty.')
注意事项 ⚠️
- 权限: 确保您的 GEE 账户拥有足够的权限来执行数据导出操作。
- 数据范围: 确认指定的地理兴趣区域和年份是准确的,避免不必要的数据导出。
- 云遮蔽: 根据实际情况调整云遮蔽函数,以提高云检测的准确性。
术语解释表 📋
术语/函数 | 解释 |
---|---|
ee | Google Earth Engine Python API 包,用于访问和处理遥感数据。 |
datetime | Python 内置模块,用于日期和时间处理。 |
ee.FeatureCollection | 表示地理矢量数据的集合。 |
ee.ImageCollection | 表示遥感图像集合。 |
filterBounds | 过滤图像集合中的图像,只保留那些与给定地理区域相交的图像。 |
filterDate | 过滤图像集合中的图像,只保留那些在给定日期范围内的图像。 |
filter | 用于过滤图像集合中的图像,这里用来排除云层比例过高的图像。 |
updateMask | 更新图像的掩膜,通常用于去除不需要的部分如云层等。 |
median | 计算图像集合的中值图像,用于减少噪声和云的影响。 |
clip | 按给定的地理区域裁剪图像。 |
select | 从图像中选择特定的波段。 |
Export.image.toDrive | 将图像导出到 Google Drive。 |
如果这对您有所帮助,希望点赞支持一下作者! 😊
详细全文-点击查看