在前面的章节中,我们探讨了如何在 Google Earth Engine (GEE) 上进行数据加载、处理、分析和可视化。现在,我们将进一步扩展,探索如何处理大规模的数据集和执行复杂的分析任务。通过 GEE 的云计算能力,用户可以在全球范围内执行大规模的时空分析,并高效地将处理结果导出为所需的格式。
在 GEE 中,大规模分析是通过 ImageCollection
和 FeatureCollection
等集合对象来管理的。与处理单个影像不同,大规模分析往往涉及多个时空维度,涵盖数千个影像或矢量特征。因此,理解如何有效地管理和操作这些数据集合是关键。
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 具有强大的计算能力,但我们仍需要采取优化策略,以确保数据处理任务的高效执行。
在分析大范围的数据时,尤其是全球尺度的数据,分块处理是提高效率的重要策略。通过将大区域划分为若干小块,可以减少内存消耗并提高计算速度。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 或本地文件系统中。
栅格影像,如 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 或 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 的强大之处在于其基于云计算的平台架构,使得处理全球范围的大数据成为可能。我们不仅学习了如何进行大规模时空分析,还掌握了如何优化计算效率和导出结果。