扩缩

了解 Earth Engine 如何处理比例对于解读从 Earth Engine 获取的科学结果至关重要。在这里,比例是指像素分辨率。与其他 GIS 和图像处理平台不同,分析规模取决于输出,而不是输入。具体而言,当您请求获取结果、要显示的图片或统计信息时,您需要指定将数据输入分析的比例。此概念如图 1 所示。

金字塔
图 1. Earth Engine 中图像数据集的图形表示。 虚线表示用于汇总 4 像素的 2x2 块的金字塔形政策。Earth Engine 使用输出指定的比例来确定要用作输入的适当图片金字塔级别。

图片金字塔

Earth Engine 中的图片资产以多种尺度存在于图片金字塔中。 金字塔政策(在图 1 中用虚线表示)决定了如何根据下一级更低级别的 2x2 像素块的汇总来计算金字塔给定级别的每个像素。对于连续值图像,金字塔上层的像素值是下一个较低层级像素的平均值。对于离散值图像,金字塔上层的像素值是下一个较低层像素的样本(通常是左上角像素)。

图片金字塔的最低级表示在将图片数据提取到 Earth Engine 时,图片数据的原始分辨率。在提取过程中,系统会(根据金字塔政策)汇总数据,以创建更高级别的金字塔。系统会对数据进行汇总,直到整个图片都适合放入 256x256 像素的图块中。当您在代码中使用图片时,Earth Engine 会选择与分析中指定的比例最接近且不大于该比例的金字塔级别,并根据需要重新采样(默认使用最近邻方法)。

分析规模

Earth Engine 中的分析规模是根据“拉取”方式确定的。请求计算输入的比例取决于输出。例如,如果您向 Code Editor 或 geemap 地图元素添加图片,地图的缩放级别将决定从图片金字塔请求输入的比例。对于其他计算,您可以将 scale 指定为实参。例如,使用具有 30 米原生分辨率的 Landsat 图像的 NIR 波段:

Code Editor (JavaScript)

var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select('B4');

var printAtScale = function(scale) {
  print('Pixel value at '+scale+' meters scale',
    image.reduceRegion({
      reducer: ee.Reducer.first(),
      geometry: image.geometry().centroid(),
      // The scale determines the pyramid level from which to pull the input
      scale: scale
  }).get('B4'));
};

printAtScale(10); // 0.10394100844860077
printAtScale(30); // 0.10394100844860077
printAtScale(50); // 0.09130698442459106
printAtScale(70); // 0.1150854229927063
printAtScale(200); // 0.102478988468647
printAtScale(500); // 0.09072770178318024

Python 设置

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

import ee
import geemap.core as geemap

Colab (Python)

image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select('B4')


def print_at_scale(scale):
  display(
      f'Pixel value at {scale} meters scale',
      image.reduceRegion(
          reducer=ee.Reducer.first(),
          geometry=image.geometry().centroid(),
          # The scale determines the pyramid level from which to pull the input
          scale=scale,
      ).get('B4'),
  )


print_at_scale(10)  # 0.10394100844860077
print_at_scale(30)  # 0.10394100844860077
print_at_scale(50)  # 0.09130698442459106
print_at_scale(70)  # 0.1150854229927063
print_at_scale(200)  # 0.102478988468647
print_at_scale(500)  # 0.09072770178318024

请注意,在此示例中,固定位置(图像重心)的像素值会因缩放而异。这是因为,对于不同的规模,选择的金字塔级别不同。对于类似的缩放比例,最近邻重新采样会导致返回相同的像素值。重要的是,通过调整缩放比例,系统会请求不同的图片输入。

当您通过将图像添加到地图来直观呈现图像时,Earth Engine 会根据缩放级别确定比例。请考虑以下简单示例,该示例仅显示 Landsat 图像:

Code Editor (JavaScript)

var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');
Map.centerObject(image, 17);
Map.addLayer(image, {bands: ['B4', 'B3', 'B2'], max: 0.35}, 'image');

Python 设置

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

import ee
import geemap.core as geemap

Colab (Python)

image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')
m = geemap.Map()
m.center_object(image, 17)
m.add_layer(image, {'bands': ['B4', 'B3', 'B2'], 'max': 0.35}, 'image')
m

地图开始全屏放大,以便原生分辨率像素清晰可见。缩小到足够远的程度后,系统不会显示相同的像素,而是会显示图像金字塔的更高级别。另请注意,代码编辑器和 geemap 地图使用 maps mercator (EPSG:3857) 投影,因此在显示之前,还需要重新投影图片金字塔的适当级别。如需详细了解 Earth Engine 如何处理投影,请参阅“投影”文档