现在,您已经知道如何加载和显示图片,接下来需要对图片应用计算。
例如,您可以将 SRTM 高程图像传递给 ee.Terrain 软件包的 slope 方法,从而计算地形的坡度。
代码编辑器 (JavaScript)
// Load the SRTM image. var srtm = ee.Image('CGIAR/SRTM90_V4'); // Apply an algorithm to an image. var slope = ee.Terrain.slope(srtm); // Display the result. Map.setCenter(-112.8598, 36.2841, 9); // Center on the Grand Canyon. Map.addLayer(slope, {min: 0, max :60}, 'slope');
请注意,在代码 ee.Terrain.slope(srtm) 中,srtm 图片作为参数提供给坡度算法。结果应如图 3 所示。
图片数学
ee.Image 类中还有一些方法,可以在图片对象上调用。例如,假设您想使用图像波段进行一些数学运算(有时称为波段数学或地图代数)。例如,您可能对坡向图像的三角运算感兴趣。为此,请先将坡向图片转换为弧度,然后对其调用 sin()。重复使用我们的 srtm 图片,
代码编辑器 (JavaScript)
// Get the aspect (in degrees). var aspect = ee.Terrain.aspect(srtm); // Convert to radians, compute the sin of the aspect. var sinImage = aspect.divide(180).multiply(Math.PI).sin(); // Display the result. Map.addLayer(sinImage, {min: -1, max: 1}, 'sin');
结果应类似于图 4。值得仔细研究一下 aspect.divide(180).multiply(Math.PI).sin() 代码。通过像这样链接多个方法,代码会执行以下操作:“将坡向除以 180,将结果乘以 π,最后取正弦值”。您可以通过这种方式组合方法,对图片执行复杂的数学运算。如需查看数学运算、add()、subtract()、multiply() 等的完整列表,请参阅 Image 文档。
图片统计信息
另一类实用的图像操作涉及计算图像区域中的像素统计信息,或栅格-矢量叠加。如需在 Earth Engine 中计算统计信息,请使用 ee.Reducer 软件包中的类所表示的缩减器。例如,假设您对某个区域的海拔平均值感兴趣。您可以使用几何图形绘制工具绘制多边形来定义区域。
如需以交互方式绘制区域,请获取多边形绘制工具 (
),然后在感兴趣的区域上数字化多边形,完成后点击退出。请注意,生成的 ee.Geometry 对象会自动命名为 geometry,并作为导入项添加到脚本顶部。在导入内容中点击该变量的名称,然后输入新名称,将其重命名为“polygon”。
接下来,使用以下代码获取多边形中的平均像素值:
代码编辑器 (JavaScript)
// Compute the mean elevation in the polygon. var meanDict = srtm.reduceRegion({ reducer: ee.Reducer.mean(), geometry: polygon, scale: 90 }); // Get the mean from the dictionary and print it. var mean = meanDict.get('elevation'); print('Mean elevation', mean);
这里有几点需要注意。首先,请注意 reduceRegion() 是 Image 对象的一种可用方法(点击此处详细了解如何缩减区域)。其次,方法参数在 JavaScript 对象中提供,该对象作为单个参数传递。(具体而言,对象的键是方法参数的名称。这些值是方法的参数)。第三,reducer 参数指定要计算的统计信息类型,geometry 参数指定要计算统计信息的区域。scale 参数是要使用的像素大小(以米为单位)。为避免歧义,在执行缩减操作时,您应始终指定比例,因为 Earth Engine 可能无法根据输入自动确定适当的比例。(详细了解 Earth Engine 中的比例)。
最后,reduceRegion() 的返回值是一个字典,其中键是波段名称,值是波段的像素统计信息。字典上的 get() 方法会返回与作为实参提供的键对应的值。在本例中,srtm 图片有一个波段“elevation”,因此示例代码会从字典中获取该统计信息并将其输出。
运行此代码时,如果您收到如下所示的错误:
不必担心!您可以采取多种措施来解决此错误。reduceRegion() 方法会进行检查,以确保您考虑是否真的要在计算中包含这么多像素。这是为了防止您不小心做出一些愚蠢的事情,例如尝试计算世界上每个 1 米像素的平均值(请勿这样做)。如需解决此错误,请通过向参数字典添加 bestEffort: true 将 bestEffort 参数设置为 true,或将 maxPixels 参数设置为高于默认值 1000 万像素的值,或同时执行这两项操作。如果 bestEffort 为 true,Earth Engine 将自动重新计算比例,以确保不超过 maxPixels。
离题:Earth Engine 中的比例
在前面的示例中,scale 设置为大约 SRTM 图片的原生分辨率。您可以使用以下命令来发现映像的原生分辨率:
代码编辑器 (JavaScript)
var scale = srtm.projection().nominalScale(); print('SRTM scale in meters', scale);
如果您指定的比例小于原生分辨率,Earth Engine 会使用最近邻插值法对输入图像进行重采样,然后将所有这些较小的像素纳入计算。如果您将比例设置为较大值,Earth Engine 将使用输入汇总版本中的输入像素(即从图片金字塔的较高级别获取像素)。如需详细了解 Earth Engine 如何处理缩放,请参阅此文档。
到目前为止,您一直在处理具有单个波段的单个图像。在下一页中,您将了解多波段图像和图像集合。