【GEE笔记2】数据整合Reducer/遍历循环.map

该博客介绍了如何使用Google Earth Engine(GEE)进行遥感数据分析,具体操作包括:通过imageCollection筛选特定区域和时间范围的卫星影像,计算NDVI并将其作为新波段添加到影像中,然后利用reduceRegion方法计算每个影像在ROI上的NDVI平均值,并将结果作为属性字段。整个过程展示了GEE中的map函数在并行处理大量影像数据时的高效性。

Reducer是GEE中按照时间、空间、波段等进行整合数据的方法;类似于从部分到整体。

ee.Reducer()可以指定数据整合的方式,如:max\min\mean\etal。

  • 时间:imageCollection.reduce()
  • 空间:image.reduceRegion() ; image.reduceNeighborhood()
  • 波段:image.reduce()
  • Feature Collection 的属性:Feature Collection.reduceColumns()

以计算NDVI数值并添加至影像合集为例

具体需求:
为一个影像集合添加NDVI波段,同时计算每一景影像上roi的NDVI均值

var mean = ndvi.reduceRegion({  
   reducer: ee.Reducer.mean(),  
   geometry: roi,   
   scale: 30  
});  
print("reduceRegion value is: ", mean); 

map遍历循环

  • map:用的最多,执行效率最快,相当于“并行执行任务”,能用 map,就用 map,但是函数里一般不能用 print,Map,toDrive 等方法

  • for、while:就是基本的循环结构语句,但是在GEE里很少用,基本用 map 替代,因为是顺序执行代码,效率太慢

  • iterate:“迭代”,顺序执行,每次执行都在前面执行的结果上继续执行,很遗憾,这次的例子没有体现“迭代”的意思

  • evaluate:主要用来异步导出和显示,加快速度,一般没有返回值,结合 for 和 map 一起用,这里的 map 里可以有 print,Map,toDrive 方法

完整代码:
roi是我自己画的
在这里插入图片描述

var roi = ee.FeatureCollection(geometry);  
Map.addLayer(roi, {color: "red"}, "roi"); // 显示roi 
Map.centerObject(roi, 9); // 以roi为中心,缩放等级9
// 筛选影像 
var Col = ee.ImageCollection("LANDSAT/LC09/C02/T1_TOA")  
              .filterBounds(roi)  
              .filterDate("2022-1-1", "2022-7-1")  
              // 循环遍历影像集合,为每景影像计算并添加一个NDVI波段
              .map(function(image){  
                var ndvi = image.normalizedDifference(["B5", "B4"])  
                                .rename("NDVI");  
                return image.addBands(ndvi);  
              })  
              // 选择NDVI波段用于后续计算
              .select("NDVI")  
              // 循环遍历影像集合,计算每景影像roi的NDVI均值,并赋为新的属性字段“ndvi”
              .map(function(image) {  
                var dict = image.reduceRegion({  
                 reducer: ee.Reducer.mean(),  
                 geometry: roi,  
                 scale: 30  
                });
                var ndvi = ee.Number(dict.get("NDVI"));  
                image = image.set("ndvi", ndvi);  
                return image;  
              });  
// 可视化参数,加载显示新的影像集合,使用first(),返回集合的第一个非空元素,即第一景影像
print("Col", Col);  
var visParam = {  
 min: -0.2,   
 max: 0.8,  
 palette: ["FFFFFF", "CE7E45", "DF923D", "F1B555", "FCD163",   
            "99B718", "74A901", "66A000", "529400", "3E8601",   
            "207401", "056201", "004C00", "023B01", "012E01",   
            "011D01", "011301"]  
};  
Map.addLayer(Col.first().clip(roi), visParam, "Col");  

结果:

在这里插入图片描述

“// 加载研究区域 var aoi = ee.FeatureCollection('projects/ee-yixuwei610/assets/hubei'); var geometry = aoi.geometry(); // 时间范围定义(物候分析需要时间序列) var startDate = '2022-01-01'; var endDate = '2022-12-31'; // 1. 加载时间序列影像集 var s2Collection = ee.ImageCollection('COPERNICUS/S2_SR') .filterBounds(geometry) .filterDate(startDate, endDate) .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 30)) .select(['B2','B3','B4','B5','B6','B7','B8','B8A','B11','B12']); // 2. 计算遥感指数(时间序列) var addIndices = function(img) { var ndvi = img.normalizedDifference(['B8', 'B4']).rename('NDVI'); var evi = img.expression('2.5 * ((NIR - RED) / (NIR + 6*RED - 7.5*BLUE + 1))', { 'NIR': img.select('B8'), 'RED': img.select('B4'), 'BLUE': img.select('B2') }).rename('EVI'); var ndvire1 = img.normalizedDifference(['B8', 'B5']).rename('NDVIre1'); var ndvire2 = img.normalizedDifference(['B8', 'B6']).rename('NDVIre2'); return img.addBands([ndvi, evi, ndvire1, ndvire2]); }; var processedCollection = s2Collection.map(addIndices); // ====== 新增:物候特征曲线可视化 ====== // 创建NDVI时间序列 var ndviCollection = processedCollection.select('NDVI'); // 选取代表性样点(区域中心) var samplePoint = geometry.centroid(); Map.addLayer(samplePoint, {color: 'red'}, '样点位置'); // 创建物候曲线图表 var phenoChart = ui.Chart.image.series({ imageCollection: ndviCollection, region: samplePoint.buffer(100), // 100米缓冲区减少噪声 reducer: ee.Reducer.mean(), scale: 10, xProperty: 'system:time_start' }) .setChartType('ScatterChart') // 散点图更准确显示数据.setOptions({ title: '2022年湖北省NDVI物候特征曲线', hAxis: { title: '日期', format: 'MMM-yy', // 月份-年份格式 gridlines: {count: 12} }, vAxis: { title: 'NDVI指数', minValue: 0, maxValue: 1 }, pointSize: 3, lineWidth: 2, colors: ['#00cc00'], trendlines: {0: { // 添加趋势线使曲线平滑 type: 'polynomial', degree: 4, visibleInLegend: false, color: 'green', lineWidth: 3 }} }); // 在控制台显示图表 print(phenoChart); // 3. 计算中值合成影像(用于纹理和地形) var median_img = processedCollection.median(); // ...后续代码保持不变... // 4. 计算纹理特征 var nir_int = median_img.select('B8').multiply(255).toUint8(); var glcm = nir_int.glcmTexture({size: 3}).select( ['B8_asm', 'B8_contrast', 'B8_var', 'B8_ent', 'B8_idm'] ); // 5. 加载地形数据 var dem = ee.Image('USGS/SRTMGL1_003').select('elevation'); var slope = ee.Terrain.slope(dem).rename('Slope'); // 6. 物候时序特征提取(修复后的函数) // ...物候特征提取代码保持不变... // 7. 特征合成 // ...特征合成代码保持不变... // 8. 导出特征合成影像到Assets // ...导出代码保持不变... // 可视化 Map.centerObject(geometry, 8); Map.addLayer(featureImg.select('NDVI_amplitude'), {min:0, max:0.8}, 'NDVI振幅'); Map.addLayer(featureImg.select('PHASE'), {min:-Math.PI, max:Math.PI}, '物候相位'); “”// 加载样本点(确保已定义) var train points = forest.merge(water).merge(farmland).merge(buildings).merge(grassland);“将样本点选择替换成后面的代码
最新发布
09-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vigo*GIS_RS

来瓶可乐~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值