GEE代码学习 day18
13.4 计算图像集合的多个百分位图像
在此上下文中,您可以想象访问给定像素的给定 ImageCollection 中给定波段的所有值,并对它们进行排序。例如,第 30 个百分位数是列表中从最小到最大的 30% 的值。这提供了一种简单的方法,通过计算每个像素的值的累积密度函数来探索影像集合中值的可变性。以下代码显示了如何计算 Landsat 8 ImageCollection 的每像素和每个波段的单个第 30 个百分位数。继续将下面的代码粘贴到同一脚本中。
每个像素的30%百分位数是一个统计量,用于描述在一个影像集合(通常是由多个时间点的观测数据组成)中,某个特定像素位置的值低于该百分位数的比例是30%。换句话说,如果我们把该像素位置的所有观测值从小到大排序,30%百分位数就是那个位置上的值,使得有30%的观测值小于或等于它,而70%的观测值大于它。
// compute a single 30% percentile
var p30 = filteredIC.reduce(ee.Reducer.percentile([30]));
Map.addLayer(p30, { min: 0.05, max: 0.35 }, '30%');
我们可以看到,生成的合成图像几乎没有该区域的混浊像素。发生这种情况是因为混浊像素通常具有较高的反射率值。在值的最低端,其他不需要的效果(如云或山丘阴影)通常具有非常低的反射率值。这就是为什么这个第 30 个百分位的合成图像看起来比之前计算的平均合成图像 (meanFilteredIC) 干净得多的原因。请注意,reducer 按像素操作:相邻像素是从不同的图像中提取的。这意味着一个像素的值可以从一个日期的图像中获取,而相邻像素的值可以从完全不同的时间段中提取。尽管与均值和中位数图像一样
我们可以通过查看一系列越来越亮的百分位图像来探索整个 ImageCollection 中的值范围
var percentiles = [0, 10, 20, 30, 40, 50, 60, 70, 80];
// let's compute percentile images and add them as separate layers
percentiles.map(function(p) { var image = filteredIC.reduce(ee.Reducer.percentile([p]));
Map.addLayer(image, { min: 0.05, max: 0.35 }, p + '%'); });
请注意,该代码将每个百分位数图像添加为单独的地图图层,因此您需要转到 Layers 控件并显示/隐藏不同的图层以探索差异。在这里,我们可以看到,低百分位合成图像描绘了较暗、低反射率的陆地特征,例如水和云或山丘阴影,而较高百分位数的合成图像(在我们的示例中> 70%)描绘了云以及与明亮反射率值对应的任何其他大气或陆地效果。
第十四章 聚合时间序列的图像
许多遥感数据集由随时间推移的重复观测组成。观测值之间的间隔可能会有很大差异。例如,Global Precipitation Measurement 数据集每 3 小时生成一次全球雨雪观测数据。气候灾害组红外降水站 (CHIRPS) 项目在每日级别和每五天期间生成一个网格化的全球数据集(Funk 等人,2015 年)。Landsat 8 任务每 16 天生成一次地球上每个位置的新场景。Sentinel-2 任务由两颗卫星组成,每五天对每个位置进行一次成像。
但是,许多应用程序需要以与生成数据集不同的时间间隔计算数据聚合。例如,为了确定降雨异常,将月降雨量与长期月平均值进行比较是有用的。
虽然单个场景提供了信息,但许多日子都是多云的,因此为许多应用程序构建强大的无云时间序列非常有用。可以通过聚合数据以形成从单个场景构建的每月、季节性或每年合成来生成较少多云甚至无云的合成。例如,如果您对检测城市景观的长期变化感兴趣,则创建年度中位数合成可以使您能够检测较长时间间隔内的变化模式,而无需担心日常噪声。
本章将介绍以选定的间隔聚合时间序列中单个图像的技术。我们将获取一年降雨量的 CHIRPS 时间序列,并将其汇总以创建每月降雨时间序列。
CHIRPS 是一个高分辨率的全球网格化降雨数据集,它将卫星测量的降雨量与地面站数据组合在一个一致的长时间序列数据集中。数据由加州大学圣巴巴拉分校提供,从 1981 年至今可用。该数据集在干旱监测和评估陆地上的全球环境变化方面非常有用。卫星数据使用地面站观测进行校准,以创建最终产品。
14.1 筛选图像集合
我们将首先访问 CHIRPS pentad 集合并对其进行过滤以创建一年的时间序列。
var chirps = ee.ImageCollection('UCSB-CHG/CHIRPS/PENTAD');
var startDate = '2019-01-01';
var endDate = '2020-01-01';
var yearFiltered = chirps.filter(ee.Filter.date(startDate, endDate));
print(yearFiltered, 'Date-filtered CHIRPS images');
如果在 Console 中展开打印的集合,您将能够看到单个图像的元数据;请注意,它们的日期戳表示它们每 5 天均匀间隔一次。
14.2 使用日期
ee.Date.fromYMD :该对象旨在根据年、月和日值创建日期对象。以下代码片段显示了如何定义包含 year 值的变量并从中创建日期对象。
var chirps = ee.ImageCollection('UCSB-CHG/CHIRPS/PENTAD');
var year = 2019;
var startDate = ee.Date.fromYMD(year, 1, 1);
现在,我们来确定如何创建结束日期,以便能够指定所需的时间间隔。创建相对于另一个日期的日期的首选方法是使用 advance 函数。它采用两个参数(增量值和时间单位)并返回新日期。下面的代码显示了如何从给定日期创建未来一年的日期。将其粘贴到您的脚本中。
advance
方法是Google Earth Engine (GEE) ee.Date
对象的一个功能,它允许你基于当前日期向前或向后移动指定的时间量。
var endDate = startDate.advance(1, 'year');
使用这些计算日期执行 CHIRPS 数据的筛选。运行后,通过在打印结果中查找图像的日期来检查您是否准确设置了日期。
var yearFiltered = chirps
.filter(ee.Filter.date(startDate, endDate));
print(yearFiltered, 'Date-filtered CHIRPS images');
另一个在 Earth Engine 中非常常用的日期函数是 millis。此函数采用日期对象并返回自 1970 年开始的任意引用日期以来的毫秒数:1970-0101T00:00:00Z。这称为 “Unix 时间戳”;这是将日期转换为数字的标准方法,并允许以高精度轻松比较日期。Earth Engine 对象存储图像和特征的时间戳在称为 system:time_start 和 system:time_end 的特殊属性中。这两个属性都需要提供一个数字而不是日期,而 millis 函数可以帮助你做到这一点。您可以打印调用此函数的结果并自行检查。
当我们需要设置聚合图像的 system:time_start 和 system:time_end 属性时,我们将使用 millis 函数。
print(startDate, 'Start date');
print(endDate, 'End date');
print('Start date as timestamp', startDate.millis());
print('End date as timestamp', endDate.millis());
14.3 聚合图像
现在,我们可以开始将五元组汇总为每月的总和。聚合过程有两个基本步骤。第一个是确定一个时间间隔(在本例中为一个月)的开始日期和结束日期,第二个是求和每个时间间隔内的所有值(在本例中为五分之一)。首先,我们可以设想生成的序列将包含 12 张图像。为了准备为每个月创建映像,我们创建了一个 ee。从 1 到 12 的值列表。我们可以使用 ee.List.sequence 函数,如第 1 章中首次介绍的那样,用于创建 ee 类型的项目列表。
// Aggregate this time series to compute monthly images.
// Create a list of months
var months = ee.List.sequence(1, 12);
接下来,我们编写一个函数,该函数将单个月份作为输入,并返回该月的聚合图像。以 beginningMonth 作为输入参数,我们首先根据 year 和 month 变量创建该月的开始和结束日期。然后,我们筛选集合以查找该月的所有图像。为了创建每月降水量图像,我们应用 ee.Reducer.sum 将一个月的 6 张五面体图像减少为一张图像,其中包含所有五面体的求和值。我们还明确设置了 timestamp 属性 system:time_start和 system:time_end 的结果求和图像。我们还可以设置 year 和 month,这将有助于我们稍后过滤生成的集合。
var total = monthFiltered.reduce(ee.Reducer.sum());
:这行代码对过滤后的数据应用ee.Reducer.sum()
聚合操作,计算指定月份内某个指标(如降水量)的总和。return total.set({ 'system:time_start': startDate.millis(), 'system:time_end': endDate.millis(), 'year': year, 'month': beginningMonth });
:最后,这行代码将计算结果(total
)的属性设置为包括开始和结束时间的毫秒数(millis()
方法将日期转换为自 Unix 纪元以来的毫秒数),以及年份和月份。这些属性有助于在地球引擎中正确地识别和处理数据。
// Write a function that takes a month number
// and returns a monthly image.
var createMonthlyImage = function(beginningMonth)
{ var startDate = ee.Date.fromYMD(year, beginningMonth, 1);
var endDate = startDate.advance(1, 'month');
var monthFiltered = yearFiltered
.filter(ee.Filter.date(startDate, endDate));
// Calculate total precipitation.
var total = monthFiltered.reduce(ee.Reducer.sum());
return total.set({ 'system:time_start': startDate.millis(),
'system:time_end': endDate.millis(),
'year': year, 'month': beginningMonth });
};
map 函数传递列表中的每张图片并运行 createMonthlyImage。该函数首先接收数字“1”并执行,将图像返回给 Earth Engine。然后,它对所有 12 个数字运行数字 “2” 以此类推。结果是一年中每个月的每月图像列表。
使用了 Earth Engine (EE) 的 map()
函数来遍历一个名为 months
的列表,并对列表中的每个月份应用 createMonthlyImage
函数。这个过程为列表中的每个月份生成了一个图像(或更准确地说,是一个图像对象),然后这些图像被收集到一个 ee.ImageCollection
对象中。
// map() the function on the list of months
// This creates a list with images for each month in the list
var monthlyImages = months.map(createMonthlyImage);
// Create an ee.ImageCollection.
var monthlyCollection = ee.ImageCollection.fromImages(monthlyImages);
print(monthlyCollection);
14.4 绘制时间序列
格网化降雨量数据集的一个有用应用是分析降雨模式。我们可以使用新计算的时间序列为某个位置绘制时间序列图。我们可以在任何给定的点或多边形处绘制像素值。在这里,我们为给定坐标创建一个点几何体。
// Create a point with coordinates for the city of Bengaluru, India.
var point = ee.Geometry.Point(77.5946, 12.9716);
Earth Engine 附带一个内置 UI。Chart.image.series 函数。除了 imageCollection 和 region 参数之外,我们还需要提供 scale 值。CHIRPS 数据目录页面显示数据的分辨率为 5566 m,因此我们可以将其用作比例尺。生成的图表将打印在 Console 中。
var chart = ui.Chart.image.series({ imageCollection: monthlyCollection,
region: point,
reducer: ee.Reducer.mean(),
scale: 5566, });
print(chart);
我们可以通过添加轴标签和标题来使图表信息量更大。setOptions 函数允许我们使用 Google 图表中的参数自定义图表。要自定义图表,请将下面的代码粘贴到脚本底部。效果是在编辑器中看到两个图表:一个是旧的数据视图,另一个是自定义图表。
var chart = ui.Chart.image.series({
imageCollection: monthlyCollection,
region: point,
reducer: ee.Reducer.mean(),
scale: 5566 })
.setOptions({ lineWidth: 1,
pointSize: 3,
title: 'Monthly Rainfall at Bengaluru',
vAxis: { title: 'Rainfall (mm)' },
hAxis: { title: 'Month',
gridlines: { count: 12 } } });
print(chart);
创建所选位置从 1981 年到 2021 年的年降水量图表。我们将创建一个年份列表并编写一个函数来创建年度图像,而不是创建月份列表并编写函数来创建年度图像。下面的代码片段将帮助您入门。
var chirps = ee.ImageCollection('UCSB-CHG/CHIRPS/PENTAD');
// Create a list of years
var years = ee.List.sequence(2014, 2024);
// Write a function that takes a year number
// and returns a yearly image
var createYearlyImage = function(beginningYear) {
var startDate = ee.Date.fromYMD(beginningYear, 1, 1);
var endDate = startDate.advance(1, 'year');
var yearsFiltered = yearFiltered
.filter(ee.Filter.date(startDate, endDate));
var total = yearsFiltered.reduce(ee.Reducer.sum());
return total.set({ 'system:time_start': startDate.millis(),
'system:time_end': endDate.millis(),
'year': beginningYear
});
var yearlyImages = years.map(createYearlyImage);
var yearlyCollection = ee.ImageCollection.fromImages(yearlyImages); print(yearlyCollection);
原文地址:https://blog.csdn.net/zzzzuui/article/details/143646378
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!