首页 > 其他分享 >C29 在GEE中扩展运算规模

C29 在GEE中扩展运算规模

时间:2024-06-24 09:47:46浏览次数:22  
标签:roi 运算 ee S2 C29 median grid GEE var

  • 当Earth Engine用户从教程转向开发自己的处理脚本时,他们会遇到可怕的错误消息,“计算超时”或“用户内存限制超出”。

本节主要内容:

  • 了解GEE资源使用的限制条件。
  • 熟悉扩展地球引擎操作的多种策略。
  • 管理大型项目和多阶段工作流程。
  • 识别何时使用Python API可能有利于执行大量任务。

 

Earth Engine: Under the Hood (GEE :幕后故事)

GEE是一个并行的分布式系统,当你提交任务时,它会将你的查询碎片分解到不同的处理器上,以更有效地完成它们。

 

 

Topic 1: Scaling Across Time 

1.1 Scaling up with Earth Engine Operators: Annual Daily Climate Data 

作为一个例子,我们将提取美国县多边形的降水、最高温度和最低温度的日时间序列。我们将使用   GRIDMET   气候再分析产品(Abatzoglou 2013),该产品提供1979年至今美国连续地区的每日4000米分辨率网格化气象数据。为了节省实习时间,我们将把重点放在美国中部的印第安纳州、伊利诺伊州和爱荷华州,这三个州共包括293个县。

 

使用 ee.Image.reduceRegions operator

//==========================================================================
//step1:定义featurecall集合,ImageCollection集合和时间序列。
//==========================================================================
// Load county dataset. 
// Filter counties in Indiana, Illinois, and Iowa by state FIPS code. 
// Select only the unique ID column for simplicity. 
var countiesAll = ee.FeatureCollection('TIGER/2018/Counties'); 
var states = ['17', '18', '19']; 
var uniqueID = 'GEOID'; 
var featColl = countiesAll.filter(ee.Filter.inList('STATEFP', states)) 
    .select(uniqueID); 
    
print(featColl.size()); 
print(featColl.limit(1)); 

// Visualize target features (create Figure F6.2.1). 
Map.centerObject(featColl, 5); 
Map.addLayer(featColl); 

// specify years of interest 
var startYear = 2020; 
var endYear = 2020; 

// climate dataset info 
var imageCollectionName = 'IDAHO_EPSCOR/GRIDMET'; 
var bandsWanted = ['pr', 'tmmn', 'tmmx']; 
var scale = 4000;

// Load and format climate data. 
var startDate = startYear + '-01-01'; 
var endYear_adj = endYear + 1; 
var endDate = endYear_adj + '-01-01'; 
var imageCollection = ee.ImageCollection(imageCollectionName) 
    .select(bandsWanted) 
    .filterBounds(featColl) 
    .filterDate(startDate, endDate); 
    
    
// get values at features 
var sampledFeatures = imageCollection.map(function(image) { 
    return image.reduceRegions({ 
            collection: featColl, 
            reducer: ee.Reducer.mean(), 
            scale: scale 
        }).filter(ee.Filter.notNull( 
        bandsWanted)) // drop rows with no data 
        .map(function(f) { // add date property 
            var time_start = image.get( 'system:time_start'); 
            var dte = ee.Date(time_start).format( 'YYYYMMdd'); 
            return f.set('date_ymd', dte); 
        }); 
}).flatten();

print(sampledFeatures.limit(1)); 


// export info 
var exportFolder = 'GEE_scalingUp'; 
var filename = 'Gridmet_counties_IN_IL_IA_' + scale + 'm_' + startYear + '-' + endYear; 
// prepare export: specify properties/columns to include 
var columnsWanted = [uniqueID].concat(['date_ymd'], bandsWanted); 
print(columnsWanted); 


Export.table.toDrive({ 
    collection: sampledFeatures, 
    description: filename, 
    folder: exportFolder, 
    fileFormat: 'CSV', 
    selectors: columnsWanted 
}); 

  

1.2 Scaling Across Time by Batching: Get 20 Y ears of Daily Climate Data

     通过批处理跨时间缩放: 获得20年的每日气候数据

//==========================================================================
//step1:定义featurecall集合,ImageCollection集合和时间序列。
//==========================================================================
// Load county dataset. 
// Filter counties in Indiana, Illinois, and Iowa by state FIPS code. 
// Select only the unique ID column for simplicity. 
var countiesAll = ee.FeatureCollection('TIGER/2018/Counties'); 
var states = ['17', '18', '19']; 
var uniqueID = 'GEOID'; 
var featColl = countiesAll.filter(ee.Filter.inList('STATEFP', states)) .select(uniqueID); 
    
print(featColl.size()); 
print(featColl.limit(1)); 

// Visualize target features (create Figure F6.2.1). 
Map.centerObject(featColl, 5); 
Map.addLayer(featColl); 

// specify years of interest 
//var startYear = 2020; 
var startYear = 2001;
var endYear = 2020; 
//===============================================================================================

// climate dataset info 
var imageCollectionName = 'IDAHO_EPSCOR/GRIDMET'; 
var bandsWanted = ['pr', 'tmmn', 'tmmx']; 
var scale = 4000;

//=========================================================================================

// export info 
var exportFolder = 'GEE_scalingUp'; 
var filenameBase = 'Gridmet_counties_IN_IL_IA_' + scale + 'm_';


//==============================================================================================
for (var i = startYear; i <= endYear; i++) {        // for each year.... 
// Load climate collection for that year. 
    var startDate = i + '-01-01';
    
    var endYear_adj = i + 1; 
    var endDate = endYear_adj + '-01-01'; 
    var imageCollection = ee.ImageCollection(imageCollectionName) 
    .select(bandsWanted) 
    .filterBounds(featColl) 
    .filterDate(startDate, endDate);    

    var sampledFeatures = imageCollection.map(function(image) { 
      return image.reduceRegions({ 
             collection: featColl, 
             reducer: ee.Reducer.mean(),         
             tileScale: 1, 
             scale: scale 
        }).filter(ee.Filter.notNull(bandsWanted))  // remove rows without data 
        .map(function(f) {                  // add date property 
            var time_start = image.get('system:time_start'); 
            var dte = ee.Date(time_start).format('YYYYMMdd'); 
            return f.set('date_ymd', dte); 
          });
    }).flatten();
     // prepare export: specify properties/columns to include 
    var columnsWanted = [uniqueID].concat(['date_ymd'], bandsWanted); 
    print(columnsWanted); 
    var filename = filenameBase + i; 


    Export.table.toDrive({ 
        collection: sampledFeatures, 
        description: filename, 
        folder: exportFolder, 
        fileFormat: 'CSV', 
        selectors: columnsWanted 
      });
}

  结果:

 

 2.1 Scaling Across Space via Spatial Tiling 

举个例子:基于S2 SR产品合成无云影像。

//===============================step1====================================
//定义感性兴趣区、时间范围、函数
var roi = ee.Geometry.Point([-122.33524518034544, 47.61356183942883]); 

// Dates over which to create a median composite. 
var start = ee.Date('2019-03-01'); 
var end = ee.Date('2019-09-01'); 

// Specify module with cloud mask functions. 
var s2mask_tools = require('projects/gee-edu/book:Part F - Fundamentals/F6 - Advanced Topics/F6.2 Scaling Up/modules/s2cloudmask.js');

//===============================step2====================================
//load S2的三种影像产品
// Sentinel-2 surface reflectance data
//'COPERNICUS/S2_SR'已更新为'COPERNICUS/S2_SR_HARMONIZED'
var s2Sr = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') 
    .filterDate(start, end) 
    .filterBounds(roi) 
    .select(['B2', 'B3', 'B4', 'B5']);
print("s2Sr" ,s2Sr);
    
// Sentinel-2 Level 1C data (top-of-atmosphere).
//'COPERNICUS/S2'已更新为'COPERNICUS/S2_HARMONIZED'
var s2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED') 
    .filterBounds(roi) 
    .filterDate(start, end) 
    .select(['B7', 'B8', 'B8A', 'B10']); 
print("s2" ,s2);
    
// Cloud probability dataset - used in cloud mask function 
var s2c = ee.ImageCollection('COPERNICUS/S2_CLOUD_PROBABILITY') 
    .filterDate(start, end) 
    .filterBounds(roi); 
print("s2c" ,s2c); 

//应用云掩膜,将cloud probability dataset 合并到surface reflectance.
var withCloudProbability = s2mask_tools.indexJoin(s2Sr, s2c, 'cloud_probability');
print("withCloudProbability" ,withCloudProbability);

// Join the L1C data to get the bands needed for CDI. 
var withS2L1C = s2mask_tools.indexJoin(withCloudProbability, s2, 'l1c'); 


//对合并的影像都循环使用一下云掩膜函数,将输出结果转换为影像集合。
var masked = ee.ImageCollection(withS2L1C.map(s2mask_tools.maskImage)); 


//===============================step3====================================
//生成和可视化中值合成影像
// Take the median, specifying a tileScale to avoid memory errors. 
var median = masked.reduce(ee.Reducer.median(), 8); 

// Display the results. 
Map.centerObject(roi, 12); 
Map.addLayer(roi); 

var viz = { 
   bands: ['B4_median', 'B3_median', 'B2_median'], 
   min: 0, 
   max: 3000 
}; 
Map.addLayer(median, viz, 'median'); 

 

 结果:

 

2.2 Generate a Regional Composite Through Spatial Tiling 

      通过空间平铺生成区域合成影像

// Specify helper functions. 
var s2mask_tools = require('projects/gee-edu/book:Part F - Fundamentals/
F6 - Advanced Topics/F6.2 Scaling Up/modules/s2cloudmask.js'); // Set the Region of Interest: Washington, USA. var roi = ee.FeatureCollection('TIGER/2018/States') .filter(ee.Filter.equals('NAME', 'Washington')); // Specify grid size in projection, x and y units (based on projection). var projection = 'EPSG:4326'; // WGS84 lat lon var dx = 2.5; var dy = 1.5; // Dates over which to create a median composite. var start = ee.Date('2019-03-01'); var end = ee.Date('2019-09-01'); // Make grid and visualize. var proj = ee.Projection(projection).scale(dx, dy); var grid = roi.geometry().coveringGrid(proj); Map.addLayer(roi, {}, 'roi'); Map.addLayer(grid, {}, 'grid');

  

 

 创建一个新的空ImageCollection资产,用作导出目的地

 

//==================================step1============================================
// Specify helper functions. 
var s2mask_tools = require('projects/gee-edu/book:Part F - Fundamentals/F6 - Advanced Topics/F6.2 Scaling Up/modules/s2cloudmask.js');

// Set the Region of Interest: Washington, USA. 
var roi = ee.FeatureCollection('TIGER/2018/States') 
    .filter(ee.Filter.equals('NAME', 'Washington')); 
    
// Specify grid size in projection, x and y units (based on projection). 
var projection = 'EPSG:4326'; // WGS84 lat lon 
var dx = 2.5; 
var dy = 1.5; 

// Dates over which to create a median composite. 
var start = ee.Date('2019-03-01'); 
var end = ee.Date('2019-09-01'); 

// Make grid and visualize. 
var proj = ee.Projection(projection).scale(dx, dy); 
var grid = roi.geometry().coveringGrid(proj); 
Map.addLayer(roi, {}, 'roi'); 
Map.addLayer(grid, {}, 'grid');

// Export info. 
var assetCollection = 'projects/ee-maziwei306/assets/S2compositeWA'; 
var imageBaseName = 'S2_median_'; 

// Get a list based on grid number. 
var gridSize = grid.size().getInfo(); 
//应该谨慎使用getInfo,并且不要在for循环中使用它
var gridList = grid.toList(gridSize);

//==================================step2============================================
//通过循环批量生成每个网格的合成图像任务导出
// In each grid cell, export a composite 
for (var i = 0; i < gridSize; i++) { 
// Extract grid polygon and filter S2 datasets for this region. 
    var gridCell = ee.Feature(gridList.get(i)).geometry(); 
    var s2Sr = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') 
        .filterDate(start, end) 
        .filterBounds(gridCell) 
        .select(['B2', 'B3', 'B4', 'B5']); 
        
    var s2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED') 
        .filterDate(start, end) 
        .filterBounds(gridCell) 
        .select(['B7', 'B8', 'B8A', 'B10']); 
        
    var s2c = ee.ImageCollection('COPERNICUS/S2_CLOUD_PROBABILITY') 
        .filterDate(start, end) 
        .filterBounds(gridCell); 
        
// Apply the cloud mask. 
    var withCloudProbability = s2mask_tools.indexJoin(s2Sr, s2c, 'cloud_probability'); 
    var withS2L1C = s2mask_tools.indexJoin(withCloudProbability, s2, 'l1c'); 
    var masked = ee.ImageCollection(withS2L1C.map(s2mask_tools.maskImage)); 
    
// Generate a median composite and export. 
    var median = masked.reduce(ee.Reducer.median(), 8); 
    
// Export. 
    var imagename = imageBaseName + 'tile' + i; 
    Export.image.toAsset({ 
        image: median, 
        description: imagename, 
        assetId: assetCollection + '/' + imagename, 
        scale: 10,
        region: gridCell, 
        maxPixels: 1e13 
    }); 
} 

  

 

//==================================step3============================================
// 加载图像采集和拼接成单个图像 
var assetCollection = 'projects/ee-maziwei306/assets/S2compositeWA'; 
var composite = ee.ImageCollection(assetCollection).mosaic(); 

// Display the results 
var geometry = ee.Geometry.Point([-120.5873563817392, 47.39035206888694 ]); 
Map.centerObject(geometry, 6); 

var vizParams = { 
    bands: ['B4_median', 'B3_median', 'B2_median'], 
    min: 0, 
    max: 3000 
}; 

Map.addLayer(composite, vizParams, 'median'); 

  

 

3.1 Multistep Workflows and Intermediate Assets 

      多步骤工作流和中间资产

通常,我们的目标需要几个处理步骤,不能在一个地球引擎计算链中完成。在这些情况下,最好的策略是将任务分解成单独的部分,这些部分被创建、存储在资产中,并跨多个脚本使用。每个顺序脚本创建一个中间输出,这个中间输出将成为下一个脚本的输入。

举个栗子:

考虑确定灌溉农业用地的土地利用分类任务:包括要用到卫星数据、综合天气信息、土壤信息 作物类型位置等。可以按以下几个步骤去实现:

  • 生成年或月NDVi的卫星合成数据;
  • 将气候数据处理成月或季度值;
  • 从地面真值层生成随机点位置,用作特征训练数据集和准确性验证,并提取这些特征的复合值和天气值。
  • 训练分类器并应用它,可能跨越多年;研究人员经常会实现多个分类器,并比较不同方法的性能。
  • 执行分类后的后处理步骤,例如去除“斑点”。
  • 使用每个行政边界的总面积来评估地面真相验证点和政府统计数据的准确性。
  • 将结果导出为空间层、可视化或其他格式。

 

标签:roi,运算,ee,S2,C29,median,grid,GEE,var
From: https://www.cnblogs.com/bltstop/p/18247279

相关文章

  • NumPy运算
    NumPy运算本篇博客将讲述NumPy中的一些运算符,我将其分成五类:基本运算比较运算标量运算数学函数统计函数1.基本运算运算符函数说明+add(a,b)加-subtract(a,b)减*multiply(a,b)乘/divide(a,b)除%mod(a,b)求余**power(a,b)......
  • 计组--信息编码和数据表示and运算方法运算器(复习专用)
    文章目录前言一、数值的格式二、定点机器数的表示方式1.原码表示法:2.补码表示法:3.反码表示法:4.移码表示法:三、浮点机器数的表示方式(规格化)四、定点数的加减乘除运算五、定点运算器的组成与结构六、浮点运算总结前言学无止境,笔勤不辍。真正开始复习计组,就会发现......
  • 科学计算库Numpy库(2.数组之间的运算)
    文章目录前言一、数组运算二、数组广播三.数组与标量间的运算总结前言Numpy数组不需要遍历循环,即可对每个元素执行批量的算术运算操作,这个过程叫做矢量化运算。不过。如果两个数组的大小(ndarray.shape)不同,则它们进行算术运算时会出现广播机制。除此之外,数组......
  • python---四则运算
    1.四则运算编写一个Python程序,生成“加减乘除”四则运算的练习,并能判断结果是否正确。程序可以选择进行哪种运算,根据输入的数据判断运算结果是否正确,最后给出正确性统计。代码:importrandomright=0count=0print("输入1为加法")print("输入2为减法")print("输入3为乘法"......
  • 定点加法与减法运算
     目录1.补码加法2.补码减法3.证书的概念与检测方法4.基本的二进制加法/减法器在计算机科学领域,定点加法和减法运算是最基础的算术运算之一。本文将详细介绍如何使用补码进行加法和减法,并讨论证书的概念与检测方法,最后介绍基本的二进制加法器和减法器的工作原理。......
  • CHATGPT说这个运算放大器是比较器,我说这是运放典型的同相比例放大器,一个光控电路分析
    纠正图1光控电路该电路来自一个问题,链接见文末。因GPT的分析有误,特此纠正。引用图片和答案用于分析,如侵权请联系本人。电路分析:该电路为光控灯电路,灯光为LED发光二极管D。光敏电阻RG的阻值和光线强度关系,光线暗,电阻大,光线亮则电阻小;光敏电阻的暗电阻在1000K......
  • C++拷贝构造函数、运算符重载函数、赋值运算符重载函数、前置++和后置++重载等的介绍
    文章目录前言一、拷贝构造函数1.概念2.特征3.编译器生成默认拷贝构造函数4.拷贝构造函数典型使用场景二、运算符重载函数三、赋值运算符重载函数1.赋值运算符重载格式2.赋值运算符只能重载成类的成员函数不能重载成全局函数3.编译器生成一个默认赋值运算符重载四......
  • 数据宽度,逻辑运算
    一、数据宽度数据宽度指的是在计算机中表示数据时所占用的内存空间大小,它决定了数据在内存中的表示范围和精度。数据宽度通常以位(bit)或字节(Byte)为单位来衡量,不同的数据类型有不同的宽度要求。在计算机科学中,数据宽度是一个基本概念,它涉及到如何有效地在内存中存储和处理数据。位......
  • C++学习笔记----重载运算符
    运算符重载运算符重载可以在通过成员函数或者全局函数进行重载,编译器提供了内置的运算符;我们可以通过定义对应的函数和参数进行重载,也可以使用编译器提供的名称`operator运算符()`进行重载;运算符重载本质是对内置的运算符函数进行重载:函数相同,参数不同;返回引用和地址需要思......
  • C语言-运算、输出函数
    学习目标:运算输入输出函数学习内容:位运算:复合运算符条件运算符:?:问号是三目运算符,形式为:<表达式1>?<表达式2>:<表达式3>如:x>y?x+18:y-20;解释:如果x>y,则运行x+18,反之,运行y-20。逗号运算符:运算规则:先计算左侧的表达式,在计算右侧的表达式,最后返回右侧表达式的值(......