Google-Earth-Engine-初学者的五个关键课程

Google Earth Engine 初学者的五个关键课程

原文:towardsdatascience.com/five-key-lessons-for-google-earth-engine-beginners-7ab3709f65b8/

厄瓜多尔 Paute 水库 2020 年的土地覆盖图。使用 Google Earth Engine Python API 和 Geemap 创建的图像。数据来源:Friedl, M., Sulla-Menashe, D. (2022); Lehner, B., Grill G. (2013) 和 Lehner, B., Verdin, K., Jarvis, A. (2008)

厄瓜多尔 Paute 水库 2020 年的土地覆盖图。使用 Google Earth Engine Python API 和 Geemap 创建的图像。数据来源:Friedl, M., Sulla-Menashe, D. (2022); Lehner, B., Grill G. (2013) 和 Lehner, B., Verdin, K., Jarvis, A. (2008)。

简介

作为一名气候科学家,Google Earth Engine(GEE)是我工具箱中的强大工具。不再需要将沉重的卫星图像下载到我的电脑上。

GEE 的主要 API 是 JavaScript,尽管 Python 用户也可以访问一个功能强大的 API 来执行类似任务。不幸的是,关于使用 Python 学习 GEE 的材料较少。

然而,我喜欢 Python。自从我了解到 GEE 有一个 Python API 后,我就想象了一个结合 GEE 强大的云处理能力和 Python 框架的可能性世界。

这五个课程来自我最近的项目,该项目涉及分析厄瓜多尔一个水库的水平衡和干旱情况。尽管如此,这些技巧、代码片段和示例可以应用于任何项目。

这个故事按照任何数据分析项目的顺序介绍每个课程:数据准备(和规划)、分析和可视化。

值得一提的是,我还提供了一些与所使用的语言无关的一般建议。

这篇文章面向 GEE 初学者,假设读者已经了解 Python 和一些地理空间概念。

第 1 课:熟悉 GEE 函数

如果你了解 Python 但刚开始接触 GEE(就像我之前一样),你应该知道 GEE 为处理卫星图像提供了优化的函数。我们在这里不会深入探讨这些函数的细节;你应该查看官方文档

然而,我的建议是首先检查 GEE 是否能够执行你想要进行的分析。当我第一次开始使用 GEE 时,我将其用作数据目录,仅依靠其基本功能。然后我会为大多数分析编写 Python 代码。虽然这种方法可以工作,但它往往会导致重大挑战。我将在后面的课程中讨论这些挑战。

不要只限于学习 GEE 的基本函数。如果你了解 Python(或一般编码),这些函数的学习曲线并不陡峭。尽可能多地使用它们——从效率的角度来看,这是值得的。

最后一点:GEE 函数甚至支持机器学习任务。这些 GEE 函数易于实现,可以帮助你解决许多问题。只有在你无法使用这些函数解决问题时,才应该考虑从头开始编写 Python 代码。

作为本课的示例,考虑聚类算法的实施。

GEE 函数的示例代码

# Sample the image to create input for clustering
sample_points = clustering_image.sample(
    region=galapagos_aoi,
    scale=30,  # Scale in meters
    numPixels=5000,  # Number of points to sample
    geometries=False  # Don't include geometry to save memory
)

# Apply k-means clustering (unsupervised)
clusterer = ee.Clusterer.wekaKMeans(5).train(sample_points)

# Cluster the image
result = clustering_image.cluster(clusterer)

Python 示例代码

import rasterio
import numpy as np
from osgeo import gdal, gdal_array

# Tell GDAL to throw Python exceptions and register all drivers
gdal.UseExceptions()
gdal.AllRegister()

# Open the .tiff file
img_ds = gdal.Open('Sentinel-2_L2A_Galapagos.tiff', gdal.GA_ReadOnly)
if img_ds is None:
    raise FileNotFoundError("The specified file could not be opened.")

# Prepare an empty array to store the image data for all bands
img = np.zeros(
    (img_ds.RasterYSize, img_ds.RasterXSize, img_ds.RasterCount),
    dtype=gdal_array.GDALTypeCodeToNumericTypeCode(img_ds.GetRasterBand(1).DataType),
)

# Read each band into the corresponding slice of the array
for b in range(img_ds.RasterCount):
    img[:, :, b] = img_ds.GetRasterBand(b + 1).ReadAsArray()

print("Shape of the image with all bands:", img.shape)  # (height, width, num_bands)

# Reshape for processing
new_shape = (img.shape[0] * img.shape[1], img.shape[2])  # (num_pixels, num_bands)
X = img.reshape(new_shape)

print("Shape of reshaped data for all bands:", X.shape)  # (num_pixels, num_bands)

第一个代码块不仅更短,而且它将更有效地处理大型卫星数据集,因为 GEE 函数被设计为可以在云中扩展。

虽然 GEE 的函数功能强大,但在扩大你的项目时,了解云处理的限制是至关重要的。

第 2 课:了解 GEE 云处理能力的限制

能够访问免费云计算资源来处理卫星图像是一种祝福。然而,GEE 对资源分配的公平性进行限制并不令人惊讶。如果你计划用于非商业的大规模项目(例如,研究亚马逊地区的森林砍伐)并且打算遵守免费层限制,你应该相应地计划。我的总体指南是:

  • 限制你区域的尺寸,将它们分割,并分批工作。在我的项目中,我没有这样做,因为我只处理一个小型水系。然而,如果你的项目涉及大型地理区域,这将是一个合乎逻辑的第一步。

  • 通过优先使用 GEE 函数(参见第 1 课)来优化你的脚本。

  • 选择能够帮助你优化计算能力的数据集。例如,在我的上一个项目中,我使用了气候灾害小组红外降水与站点数据(CHIRPS)。原始数据集具有每日时间分辨率。然而,它提供了一个名为“PENTAD”的替代版本,每五天提供一次数据。这五天的降水量总和。使用这个数据集使我能够在不牺牲结果质量的情况下,通过处理压缩版本来节省计算机功率。

  • 检查你的数据集描述,因为它可能揭示出可以节省计算机功率的缩放因子。例如,在我的水平衡项目中,我使用了中分辨率成像光谱仪(MODIS)数据。具体来说,是 MOD16 数据集,这是一个现成的蒸散量(ET)产品。根据文档,我可以将我的结果乘以 0.1 的缩放因子。缩放因子通过调整数据类型有助于减少存储需求。

  • 如果情况最糟,要做好妥协的准备。如果研究标准允许,降低分析分辨率。例如,“reduceRegion”GEE 函数允许你总结一个区域的值(总和、平均值等)。它有一个名为“scale”的参数,允许你更改分析的尺度。例如,如果你的卫星数据分辨率为 10 米,而 GEE 无法处理你的分析,你可以将比例参数调整到更低的分辨率(例如 50 米)。

以我的水均衡和干旱项目为例,考虑以下代码块:

# Reduce the collection to a single image (mean MSI over the time period)
MSI_mean = MSI_collection.select('MSI').mean().clip(pauteBasin)

# Use reduceRegion to calculate the min and max
stats = MSI_mean.reduceRegion(
    reducer=ee.Reducer.minMax(),  # Reducer to get min and max
    geometry=pauteBasin,                 # Specify the ROI
    scale=500,                   # Scale in meters
    maxPixels=1e9                 # Maximum number of pixels to process
)

# Get the results as a dictionary
min_max = stats.getInfo()

# Print the min and max values
print('Min and Max values:', min_max)

在我的项目中,我使用 Sentinel-2 卫星图像计算了一个土壤湿度指数(MSI)。然后,我应用了“reduceRegion”GEE 函数,该函数计算一个区域内值的摘要(平均值、总和等)。

在我的情况下,我需要找到 MSI 的最大和最小值,以检查我的结果是否合理。以下图表显示了研究区域内的 MSI 值空间分布。

帕乌特盆地(厄瓜多尔)2010-2020 年土壤湿度指数月平均值。使用 Google Earth Engine Python API 和 Geemap 创建的图像。数据来源:欧洲航天局(2025);Lehner, B., Grill G. (2013) 和 Lehner, B., Verdin, K., Jarvis, A. (2008)

帕乌特盆地(厄瓜多尔)2010-2020 年土壤湿度指数月平均值。使用 Google Earth Engine Python API 和 Geemap 创建的图像。数据来源:欧洲航天局(2025);Lehner, B., Grill G. (2013) 和 Lehner, B., Verdin, K., Jarvis, A. (2008)。

原始图像具有 10 米分辨率。GEE 在处理数据时遇到了困难。因此,我使用了比例参数,将分辨率降低到 500 米。更改此参数后,GEE 能够处理数据。

第 3 课:优先使用现成的分析产品

我对数据质量非常着迷。因此,我使用数据,但很少在没有验证的情况下信任它。我喜欢投入时间确保数据适合分析。然而,不要让图像校正阻碍你的进度。

我倾向于在图像校正上花费过多时间,这源于我学习遥感图像校正的“老方法”。这意味着使用辅助应用大气和几何校正的软件。

现在,支持卫星任务的科学机构可以提供高度预处理的图像。事实上,GEE 的一个伟大功能是其目录,这使得找到现成的分析产品变得容易。

预处理是任何数据科学项目中耗时最长的任务。因此,它必须得到适当的规划和管理。

在开始项目之前,最佳做法是建立数据质量标准。根据你的标准,分配足够的时间来找到最佳产品(GEE 可以提供便利),并且只应用所需的校正(例如云遮蔽)。

第 4 课:彻底检查 GEE 目录以避免从头开始

如果你像我一样喜欢在 Python 中编程,你可能会经常发现自己从头开始编写所有代码。

作为一名博士生(从编程开始),我编写了一个脚本来在一个研究区域内执行 t 检验。后来,我发现了一个执行相同任务的 Python 库。当我将我的脚本结果与使用库的结果进行比较时,结果是正确的。然而,从一开始就使用库可能会节省我的时间。

我分享这个经验教训是为了帮助你避免这些与 GEE 相关的愚蠢错误。我将提到我水均衡项目的两个例子。

示例 1

为了计算我流域的水均衡,我需要 ET 数据。ET 不是一个观测变量(如降水);它必须计算。

ET 计算并非易事。你可以在教科书中查找方程式并在 Python 中实现它们。然而,一些研究人员已经发表了与这一计算相关的论文,并与社区分享了他们的结果。

这就是 GEE 发挥作用的时候。GEE 目录不仅提供观测数据(正如我最初所想),还提供许多派生产品或模型数据集(例如再分析数据、土地覆盖、植被指数等)。猜猜看?我在 GEE 目录中找到了一个现成的全球 ET 数据集——救星!

示例 2:

我也认为自己是一名地理信息系统(GIS)专业人士。多年来,我为我的工作收集了大量 GIS 数据,例如流域边界 shapefile 格式。

在我的水均衡项目中,我的直觉是将我的流域边界 shapefile 导入我的 GEE 项目中。从那里,我将文件转换为 Geopandas 对象并继续我的分析。

在这种情况下,我没有像示例 1 中那样幸运。我在尝试与这个 Geopandas 对象协同工作,而这个对象与 GEE 的集成并不好。最终,这种方法并不合理。GEE 在其目录中确实有一个易于处理的水域边界产品。

因此,一个关键的经验教训是在可能的情况下始终在 GEE 中维护你的工作流程。

第 5 课:使用 Geemap 进行绘图

如本文开头所述,将 GEE 与 Python 库集成可以非常强大。

然而,即使是简单的分析和图表,集成似乎也不太直接。

这就是 Geemp 发挥作用的地方。Geemap是一个 Python 包,旨在通过 GEE 进行交互式地理空间分析和可视化。

此外,我还发现它可以帮助在 Python 中创建静态图表。我在水均衡和干旱项目中使用了 GEE 和 Geemap 制作图表。这个故事中包含的图像使用了这些工具。

摘要

GEE 是一个强大的工具。然而,作为一个初学者,陷阱是不可避免的。本文提供了技巧和窍门,以帮助您在 GEE Python API 上迈出正确的步伐。

参考文献

欧洲航天局 (2025)。欧洲航天局。(年份)。协调一致的 Sentinel-2 MSI:多光谱仪器,2A 级

Friedl, M., Sulla-Menashe, D. (2022). MODIS/Terra+Aqua Land Cover Type Yearly L3 Global 500m SIN Grid V061 [数据集]. 美国国家航空航天局 EOSDIS 陆地过程分布式主动存档中心。于 2025 年 1 月 15 日从doi.org/10.5067/MODIS/MCD12Q1.061访问。

Lehner, B., Verdin, K., Jarvis, A. (2008): 从航天器高程数据中得出的新全球水文学。Eos,AGU 的 Transactions,89(10): 93–94。

Lehner, B., Grill G. (2013): 全球河流水文学和网络路由:基线数据和研究世界大型河流系统的新方法。水文过程,27(15): 2171–2186。数据可在www.hydrosheds.org获取。

posted @ 2026-03-27 09:52  绝不原创的飞龙  阅读(1)  评论(0)    收藏  举报