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_startsystem: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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【优选算法 — 滑动窗口】滑动窗口小专题(一)

长度最小的子数组 长度最小的子数组 题目解析: 对于示例一 对于剩下两种示例: 解法一:暴力枚举 把所有的子数组全部枚举出来,并且枚举出的每一个子数组求和判断,返回长度最小的子数组; 时间复杂度 &…

【数据集】【YOLO】【目标检测】安全帽识别数据集 22789 张,YOLO安全帽佩戴目标检测实战训练教程!

数据集介绍 【数据集】安全帽识别数据集 22789 张,目标检测,包含YOLO/VOC格式标注。数据集中包含2种分类:{0: head, 1: helmet},分别是无安全帽和佩戴安全帽。数据集来自国内外图片网站和视频截图。检测场景为施工地工人安全帽佩…

【Pytorch】model.eval()与model.train()

model.train(): 作用是启用Batch Normalization 和 Dropout 如果模型中有BN层(Batch Normalization)和Dropout,需要在训练时添加model.train()。model.train()是保证BN层能够用到每一批数据的均值和方差。对于Dropout&#x…

Linux 系统结构

Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心,具有很多最基本功能,它…

飞书 富文本(Markdown)

飞书机器人webhook支持Markdown格式,包括表格 表格 |Syntax | Description |\n|-------- | -------- |\n|Header | Title |\n|Paragraph | Text |参考 富文本(Markdown)

深入理解 Vue 3 中的 Props

深入理解 Vue 3 中的 Props Vue 3 引入了 Composition API 等新特性,组件的定义和使用也变得更为灵活。而在组件通信中,Props(属性)扮演了重要角色,帮助父组件向子组件传递数据,形成单向的数据流动&#x…

R语言实战——一些批量对地理数据进行操作的方法

各位朋友在进行数据处理时,当有多张栅格影像时,如果我们都要进行同一操作时,一张一张做很繁琐,用ArcGIS模型构建器是一种比较好的方法。当然,今天小编新学了R语言上面进行批量裁剪,一起来学习一下吧&#x…

【时间之外】IT人求职和创业应知【31】

目录 新闻一:2024年“秦创原沣东杯”陕西省科技工作者创新创业大赛颁奖仪式暨沣东新城机器人产业发展大会盛大启幕 新闻二:声网CEO赵斌:RTE将成为生成式AI时代AI Infra的关键部分 新闻三:“5G工业互联网”融合应用试点城市名单…

使用ThorUi

摘要: 官网 今天遇到一个老项目,使用的是ThorUi组件库!之前没有用过这组件库,所以记录一下不同框架是使用情况! ThorUI 是一个基于 Thorium 的 UI 框架,用于构建跨平台的桌面应用程序。如果你打算使用 Thor…

科研绘图系列:R语言文章组合图形(barplot scatterplot)

文章目录 介绍加载R包数据下载清理环境设置计算资源数据处理图1图2图3图4图5图6图7图8图9系统信息介绍 R语言组合图形 加载R包 library(xlsx) library(reshape2) library(ggplot2) library(ggh4x) library(wbstats

内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?

相关技术 要实现“内网部署,外网访问”,可以使用内网穿透、VPN技术、DMZ主机、端口映射等方法。以下是对这些方法的详细解释: 一、内网穿透 内网穿透是一种技术,它通过将内网设备映射到公网上的方式,实现外网访问内…

从零开始训练一个大语言模型需要多少天?

一,前言 在AI领域,训练一个大型语言模型(LLM)是一个耗时且复杂的过程。几乎每个做大型语言模型(LLM)训练的人都会被问到:“从零开始,训练大语言模型需要多久和花多少钱?”…

ubuntu 22.04 如何调整进程启动后能打开的文件数限制

在 Ubuntu 22.04 中,可以通过修改系统配置来调整进程启动后能够打开的文件数软限制。软限制是指操作系统允许单个进程打开的文件描述符的最大数量。以下是调整该限制的方法: 1. 查看当前限制 首先,你可以通过 ulimit 命令查看当前的软限制和…

Halcon resistor.hedv 使用多个对焦级别提取深度

depth_from_focus * Extract depth using multiple focus levels * 使用多个对焦级别提取深度 Names : [] * 初始化一个空数组,用于存储图像名称 dev_close_window () * 关闭当前打开的图像窗口 for i : 1 to 10 by 1 * 循环开始,从1到10 …

C语言 | Leetcode C语言题解之第546题移除盒子

题目: 题解: int dp[100][100][100];int calculatePoints(int* boxes, int l, int r, int k) {if (l > r) {return 0;}if (dp[l][r][k] 0) {int r1 r, k1 k;while (r1 > l && boxes[r1] boxes[r1 - 1]) {r1--;k1;}dp[l][r][k] calcu…

玩的花,云产品也能拼团了!!!

说起拼单大家都不陌生,电商一贯的营销手段,不过确实可以给消费者省下一笔钱。双11到了,腾讯云产品也玩起了拼团,这明显是对开发人员和各企业的福利。 对于有云产品需求的个人或企业,这次绝对是难得的一次薅羊毛机会。…

win10@win10 配置openssh服务

1.下载离线包:https://github.com/PowerShell/Win32-OpenSSH/releases 2.然后管理员打开powershell,cd到这个安装包放置的目录中来,输入以下命令:powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 此时要注意pow…

独孤思维:曾经副业赚大钱的人,怎么不见了

01 总有一双眼睛默默关注你。 别以为自己每天做项目,日更文章,没人看。 总会有人默默观察你。 看你能坚持多久,看多段时间,你是不是还在。 今天上午,有个2年前认识的副业同行,今天突然跟我发消息。 说…

全面解析:网络协议及其应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 # 全面解析:网络协议及其应用 文章目录 网络协议概述定义发展历程主要优势 主要网络协议应用层协议传输层协议网络层…

Linux系统编程之--多线程

一.线程概述 线程是允许应用程序并法执行多个任务的一种机制,提高操作系统的运行效率. 线程是轻量级的进程(LWP),在Linux环境下线程的本质仍是进程 查看指定进程的LWP号:ps -LF pid 二.进程与线程的区别(重点) 一个进程可以包含多个线程,同一个程序中的所有线程均会独立执行…