如何让你的 Google Earth Engine JavaScript 运行得更快

如何让你的 Google Earth Engine JavaScript 运行得更快
如何让你的 Google Earth Engine JavaScript 运行得更快

优化 Google Earth Engine 脚本的执行时间

Google Earth Engine (GEE) 是一个用于分析大规模地理空间数据的强大平台。然而,用户经常会遇到执行时间的问题,即使他们的脚本看起来很简单。需要几分钟才能运行的脚本可能会影响工作效率并延迟洞察力。

在本例中,用户创建了一个简单的脚本来处理 Sentinel 和 Landsat 8 数据。尽管很简单,但该脚本的执行时间大约需要 3-5 分钟。了解发生这种情况的原因以及如何优化脚本对于高效的数据处理至关重要。

GEE 脚本的性能取决于多个因素,包括数据大小、过滤和计算复杂性。减少执行时间涉及识别脚本中的瓶颈,例如不必要的操作或减慢处理速度的大型数据集。

本文将探讨 GEE 中执行时间缓慢的可能原因,并提供优化给定脚本的实用技巧。通过实施这些策略,用户可以显着提高地理空间数据分析任务的速度和性能。

命令 使用示例
normalizedDifference() 此函数用于通过计算两个波段之间的差值除以它们的总和来计算 NDVI、NDWI 和 NDSI 等指数。它特定于需要植被、水和雪指数的遥感分析。
filterBounds() 过滤图像集合以仅包含与给定几何图形相交的图像。在这种情况下,它将卫星数据限制在定义的兴趣点周围的区域,通过排除不相关的数据来提高处理效率。
filterDate() 此命令将图像集合限制在特定日期范围内。对于我们的问题,分析 Sentinel 和 Landsat 数据集同一时间段之间的差异至关重要。
addBands() 向集合中的每个图像添加新的计算波段(例如 NDVI、NDWI 和 NDSI)。这对于将多个索引应用于同一图像集合而不创建单独的数据集至关重要。
unmask() 用指定值填充蒙版像素。在我们的脚本中,它用于揭露永久水域,确保整个区域的数据处理一致。
reduce() 使用指定的缩减器函数缩减图像集合,例如 ee.Reducer.percentile()。在这里,它用于计算像素值的第 30 个百分位数,优化合成图像的生成。
clip() 将图像裁剪到指定感兴趣区域的边界。这可确保仅处理与该区域相关的数据,从而加快执行速度。
gt() 该命令代表“大于”,用于根据阈值创建二进制图像。在这种情况下,它会识别出水出现率大于 80% 的区域。
map() 将函数应用于集合中的每个图像。在我们的示例中,它应用 addIndices 函数来计算集合中所有图像的 NDVI、NDWI 和 NDSI,从而简化了工作流程。

优化 GEE 脚本以提高效率

在提供的脚本中,目标是提取和处理来自两个不同来源的卫星图像:Sentinel 和 Landsat。这 谷歌地球引擎 (GEE) 平台允许用户访问大量卫星数据并应用过滤、索引和可视化等各种操作。该脚本中使用的关键功能之一是 归一化差异() 函数,用于计算 NDVI、NDWI 和 NDSI 等重要指数。这些指数对于分析特定区域的植被、水和积雪至关重要。该脚本首先定义一个兴趣点,并使用提供的坐标将地图置于该兴趣点的中心。

该脚本应用多个过滤器,例如 过滤日期()过滤器边界(),减少正在处理的数据量,从而缩短执行时间。例如, 过滤器边界() 确保仅包含与感兴趣区域相交的图像,同时 过滤日期() 将图像限制在特定日期范围内。这对于处理 Sentinel 和 Landsat 图像等大型数据集至关重要,因为它可以最大限度地减少计算负载。此外, 筛选 云覆盖范围有助于丢弃云过多的图像,确保更好的分析质量。

该脚本的一个重要方面是 添加带() 函数,它将计算的指数(NDVI、NDWI、NDSI)添加到图像中,以便可以进行进一步分析。该脚本还包含一个使用 JRC 全球地表水数据集数据的永久水罩。水掩模有助于排除水含量高(大于 80%)的区域,否则可能会影响植被和雪分析的结果。这是通过 gt()取消屏蔽() 函数,允许脚本根据像素值隔离区域。

最后,该脚本使用 减少() 函数与百分位数缩减器一起生成表示所选像素值的第 30 个百分位数的合成图像。然后将该合成图像剪切到感兴趣的区域,并使用以下方法在地图上进行可视化: 夹子() 功能。视觉参数是为 Sentinel 和 Landsat 合成图像定义的,允许用户使用适当的颜色设置来查看它们。通过结合过滤、屏蔽和合成生成等各种图像处理步骤,该脚本提供了一种分析卫星图像的有效方法,但可以应用进一步优化来减少执行时间。

优化 Google Earth Engine 脚本执行以加快处理速度

该解决方案使用 Google Earth Engine (GEE),重点是通过减少数据检索时间和简化操作来优化性能。 JavaScript 用作脚本语言。

var pointJSP = ee.Geometry.Point([86.465263, 20.168076]);
Map.centerObject(pointJSP, 14);
// Combine date variables for flexibility
var startDate = '2024-02-01';
var endDate = '2024-03-01';
// Function to add NDVI, NDWI, NDSI
var addIndices = function(image) {
  var ndvi = image.normalizedDifference(['NIR', 'RED']).rename('NDVI');
  var ndwi = image.normalizedDifference(['NIR', 'SWIR1']).rename('NDWI');
  var ndsi = image.normalizedDifference(['SWIR1', 'SWIR2']).rename('NDSI');
  return image.addBands(ndvi).addBands(ndwi).addBands(ndsi);
};
// Use fewer data points by filtering for cloud-free pixels only once
var sentinel = ee.ImageCollection('COPERNICUS/S2_SR')
  .filterBounds(pointJSP)
  .filterDate(startDate, endDate)
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30));

使用 GEE 的高效数据处理来最大限度地减少脚本延迟

该解决方案通过结合指数计算和阈值来集成优化的数据处理。 JavaScript 用于 Google Earth Engine 处理。

var landsat8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
  .filterBounds(pointJSP)
  .filterDate(startDate, endDate)
  .filter(ee.Filter.lt('CLOUD_COVER', 30));
// Apply water mask for permanent water areas
var waterMask = ee.Image('JRC/GSW1_4/GlobalSurfaceWater').select('occurrence').gt(80).unmask();
// Add indices to Landsat 8 imagery
var landsatIndices = landsat8.map(addIndices);
var composite = landsatIndices.reduce(ee.Reducer.percentile([30])).clip(pointJSP).mask(waterMask.eq(0));
Map.addLayer(composite, {bands: ['RED', 'GREEN', 'BLUE'], min: 0, max: 3000}, 'Landsat Composite');
Map.addLayer(waterMask, {min: 0, max: 1, palette: ['white', 'blue']}, 'Water Mask', false);

提高遥感脚本的效率

使用 Google Earth Engine (GEE) 脚本时的一个关键考虑因素是确保有效处理操作。虽然 Sentinel 和 Landsat 等大型数据集的使用在环境分析中很常见,但庞大的数据量可能会减慢脚本的执行速度。提高性能的一种方法是确保只处理必要的数据。使用类似命令 过滤器边界()过滤日期() 最小化数据集大小,这有助于简化计算。选择特定的日期范围和地理区域可以显着减少执行时间。

影响 GEE 脚本性能的另一个方面是数据的处理方式。该脚本示例使用函数来计算重要指数,例如 NDVI、NDWI 和 NDSI。这些索引作为条带添加到图像集合中,从而可以进行更彻底的分析。然而,一个常见的错误是将此类函数应用于整个数据集而不首先进行过滤。在过滤后应用此类操作至关重要,以避免对不相关数据进行不必要的计算。

可视化是脚本中另一个可以优化的元素。添加太多层或复杂的可视化可能会导致处理时间陷入困境。该脚本使用预定义的视觉参数来渲染合成,但可以通过禁用某些层来提高性能,除非明确需要它们。这有助于保持脚本轻量级,同时保持其功能。使用 夹子() 命令还确保仅渲染必要的区域,从而减少整体处理负担。

有关优化 Google Earth Engine 脚本的常见问题

  1. 如何提高 GEE 脚本的性能?
  2. 优化使用 filterDate(), filterBounds(),并在处理之前减小数据集的大小。
  3. 为什么我的 GEE 脚本需要这么长时间才能运行?
  4. 大型数据集和复杂的计算会减慢执行速度。使用 reduce()clip() 将处理限制在相关区域。
  5. 我可以减少 GEE 中处理的图像数量吗?
  6. 是的,通过申请 filter() 用于云覆盖和 filterDate() 重点关注特定时期。
  7. 如何简化脚本中的索引计算?
  8. 使用类似的函数 addBands() 简化一步添加多个指数(例如 NDVI、NDWI)的过程。
  9. 是否可以仅可视化基本层?
  10. 是的,禁用不必要的图层并使用简化的可视化参数 Map.addLayer() 为了更好的性能。

关于优化 GEE 脚本的最终想法

优化 Google Earth Engine 脚本涉及高效处理大型数据集、尽早应用过滤器以及减少不必要的数据操作。专注于重要领域,例如过滤 日期 和位置可以显着减少处理时间。

通过合并诸如 添加频段 并且使用阈值掩码来消除不相关的数据,可以进一步提高脚本性能。这些技术可以简化执行,提供更快的结果并更好地利用 Google Earth Engine 平台。

优化 Google Earth Engine 脚本的来源和参考
  1. 本文是使用基于 Google Earth Engine 官方文档的内容创建的,该文档提供了对脚本优化技术的见解。 Google 地球引擎指南
  2. 从 GEE 社区论坛收集了更多信息,提供了用于提高复杂脚本性能的讨论和解决方案。 Google 地球引擎社区
  3. 处理大型数据集的最佳实践参考了以下链接提供的遥感文献和教程。 美国宇航局地球观测站