【RS】GEE(Python):大规模分析与导出数据

在前面的章节中,我们探讨了如何在 Google Earth Engine (GEE) 上进行数据加载、处理、分析和可视化。现在,我们将进一步扩展,探索如何处理大规模的数据集和执行复杂的分析任务。通过 GEE 的云计算能力,用户可以在全球范围内执行大规模的时空分析,并高效地将处理结果导出为所需的格式。

大规模分析的基本原则

在 GEE 中,大规模分析是通过 ImageCollectionFeatureCollection 等集合对象来管理的。与处理单个影像不同,大规模分析往往涉及多个时空维度,涵盖数千个影像或矢量特征。因此,理解如何有效地管理和操作这些数据集合是关键。

使用 ImageCollection 进行时空分析

ImageCollection 是 GEE 中用于管理大量影像数据的核心对象。通过它,我们可以执行跨时间或空间的大规模分析任务。例如,计算某个地区在一定时间范围内的气候趋势,或者对某区域进行多年植被指数的时空分析。

以下是一个基于 MODIS 数据集的例子,用于计算某个地区 10 年的平均植被指数:

import ee
import folium

# 初始化 Earth Engine
ee.Initialize()

# 加载 MODIS NDVI 数据集并设置时间范围
modis_ndvi = ee.ImageCollection('MODIS/006/MOD13A1') \
    .filterDate('2010-01-01', '2020-01-01') \
    .select('NDVI')

# 定义感兴趣区域
region = ee.Geometry.Rectangle([30.0, -10.0, 35.0, -5.0])

# 计算 10 年内的 NDVI 均值
mean_ndvi = modis_ndvi.mean().clip(region)

# 设置可视化参数
ndvi_vis_params = {
    'min': 0,
    'max': 9000,
    'palette': ['white', 'green']
}

# 创建地图并添加图层
map = folium.Map(location=[-7.5, 32.5], zoom_start=6)
def add_ee_layer(self, ee_image_object, vis_params, name):
    map_id_dict = ee.Image(ee_image_object).getMapId(vis_params)
    folium.raster_layers.TileLayer(
        tiles=map_id_dict['tile_fetcher'].url_format,
        attr='Google Earth Engine',
        name=name,
        overlay=True,
        control=True
    ).add_to(self)

folium.Map.add_ee_layer = add_ee_layer
map.add_ee_layer(mean_ndvi, ndvi_vis_params, '10-Year Mean NDVI')

# 显示地图
map
  • ImageCollection:用于存储和管理时序影像数据。在这个例子中,我们加载了 MODIS 的 NDVI 数据集,并过滤了 2010 年至 2020 年的数据。
  • mean():用于计算整个时间范围内 NDVI 的平均值。
  • clip():将影像裁剪到指定的地理区域。
  • folium.Map():用于创建交互式地图,帮助可视化处理后的影像。

这种时序分析可以很容易地扩展到全球或更长时间范围。通过 ImageCollection,我们可以处理数千幅影像,并进行复杂的分析,如变化检测、长期趋势分析等。

使用 reduce 函数处理大规模数据

GEE 提供了强大的 reduce 函数,用于将时空数据集合压缩成单一值或一组值。这在大规模数据分析中非常有用,例如统计一个地区的总降水量、最大温度、最小反射率等。

# 加载全球降水数据集
precipitation = ee.ImageCollection('ECMWF/ERA5/DAILY') \
    .filterDate('2020-01-01', '2020-12-31') \
    .select('total_precipitation')

# 计算全年总降水量
total_precip = precipitation.sum().clip(region)

# 设置降水可视化参数
precip_vis_params = {
    'min': 0,
    'max': 3000,
    'palette': ['blue', 'purple', 'cyan']
}

# 将总降水量图像添加到地图
map.add_ee_layer(total_precip, precip_vis_params, 'Total Precipitation')

# 显示地图
map
  • sum():对图像集合的每个像素进行累加,生成全年累积降水量图像。
  • reduceRegion():可用于进一步压缩影像数据,例如计算整个区域的总降水量或平均降水量。

通过 reduce 操作,可以将复杂的多时空数据压缩为统计信息,从而更容易进行大规模分析和结果解释。

大规模分析中的计算优化

当处理大规模数据时,效率至关重要。尽管 GEE 具有强大的计算能力,但我们仍需要采取优化策略,以确保数据处理任务的高效执行。

分块处理 (Tiling)

在分析大范围的数据时,尤其是全球尺度的数据,分块处理是提高效率的重要策略。通过将大区域划分为若干小块,可以减少内存消耗并提高计算速度。GEE 允许用户在执行计算时指定 scale(分辨率)和 maxPixels(最大像素数),以便更好地控制计算资源的分配。

# 使用 reduceRegion 方法时限制最大像素数
stats = total_precip.reduceRegion(
    reducer=ee.Reducer.mean(),
    geometry=region,
    scale=1000,  # 指定 1 公里的分辨率
    maxPixels=1e9  # 允许处理最多 10 亿个像素
)

# 打印统计结果
print(stats.getInfo())

图像重采样

重采样是另一种优化策略。通过降低图像的分辨率,可以减少处理的像素数量,进而提高计算速度。对于大尺度分析,使用较粗的空间分辨率通常是一个合理的选择。

# 将影像重采样到更粗的分辨率
resampled_image = mean_ndvi.reduceResolution(
    reducer=ee.Reducer.mean(),
    bestEffort=True
)

# 将重采样后的影像添加到地图
map.add_ee_layer(resampled_image, ndvi_vis_params, 'Resampled Mean NDVI')

# 显示地图
map
  • reduceResolution():降低影像的分辨率,合并多个像素,使用指定的统计方法(如平均值)。
  • bestEffort=True:告诉 GEE 尽最大努力生成尽可能合理的输出结果。

通过减少数据的分辨率和控制像素数量,我们可以提高大规模数据处理的效率。

导出数据

大规模分析的一个重要步骤是将结果导出为易于使用的格式,如 GeoTIFF、CSV 或影像集合。GEE 提供了多种导出方法,可以将分析结果保存到 Google Drive、Google Cloud 或本地文件系统中。

导出栅格影像 (GeoTIFF)

栅格影像,如 NDVI 或总降水量图像,常常需要导出为 GeoTIFF 格式,以便在其他 GIS 或遥感软件中进一步分析。以下代码展示如何将影像导出为 GeoTIFF:

# 导出影像到 Google Drive
export_task = ee.batch.Export.image.toDrive(
    image=total_precip,
    description='Total_Precipitation_2020',
    scale=1000,  # 分辨率 1 公里
    region=region,
    fileFormat='GeoTIFF',
    maxPixels=1e13  # 允许导出的最大像素数量
)

# 启动导出任务
export_task.start()
  • ee.batch.Export.image.toDrive:将影像导出为 GeoTIFF 并保存到 Google Drive。
  • scale:指定导出的空间分辨率(单位:米)。
  • region:指定导出的地理范围。

导出为 GeoTIFF 后,结果可以在 QGIS、ArcGIS 或其他 GIS 工具中进一步分析或可视化。

导出矢量数据 (CSV)

矢量数据,如点、线、面等特征集,通常需要导出为 CSV 或 Shapefile 格式。以下示例展示如何将一个特征集合导出为 CSV 文件:

python
# 导出矢量特征集合到 Google Drive
export_task = ee.batch.Export.table.toDrive(
    collection=training_samples,
    description='Training_Samples',
    fileFormat='CSV'
)

# 启动导出任务
export_task.start()
  • ee.batch.Export.table.toDrive:将矢量数据导出为 CSV 文件。
  • collection:要导出的特征集合。

矢量数据导出后,可以在 Excel、R 或 Python 的 pandas 等工具中进行进一步分析。

导出时间序列数据

时间序列数据分析的结果通常需要导出为 CSV 或 JSON 格式,以便于绘制图表或进行统计分析。以下展示如何将时间序列数据导出为 CSV:

# 将 NDVI 时间序列导出为 CSV 文件
export_task = ee.batch.Export.table.toDrive(
    collection=ndvi_series,
    description='NDVI_Time_Series',
    fileFormat='CSV'
)

# 启动导出任务
export_task.start()

总结

通过本篇教程,我们深入了解了如何使用 GEE 进行大规模数据分析与导出。GEE 的强大之处在于其基于云计算的平台架构,使得处理全球范围的大数据成为可能。我们不仅学习了如何进行大规模时空分析,还掌握了如何优化计算效率和导出结果。

你可能感兴趣的:(【RS】GEE(Python):大规模分析与导出数据)