问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

用Python和GEE导出Sentinel-2卫星影像

创作时间:
2025-01-21 23:37:15
作者:
@小白创作中心

用Python和GEE导出Sentinel-2卫星影像

Sentinel-2 卫星提供了高分辨率的地表覆盖图像,广泛应用于农业监测、城市规划、环境变化分析等诸多领域。在 Google Earth Engine (GEE) 中,我们能够按特定地理范围导出这些影像,以支持更深入的研究和分析。

使用方法 💻

GEE 提供了一个强大的平台用于处理和导出 Sentinel-2 数据。本文将介绍如何利用 Python 与 GEE API 来按指定地理范围导出 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。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号