GEE必须会教程—一文教你华南地区NDVI趋势可视化分析(代码分享)

本期将带来NDVI的变化趋势分析,一个地区究竟是变绿了,还是植被退化了,如何进行量化呢?小编给出了代码,后期将带来详细的解释,大家可以先尝试着分析一下代码。

上代码!

var region=ee.FeatureCollection('users/hesuixinya511/South_China');
var empty = ee.Image().toByte();
var outline = ee.Image()
                .toByte()
                .paint({
                  featureCollection:region,
                  color:0,
                  width:2
                });
Map.addLayer(outline, {palette: "black"}, "outline");
Map.centerObject(region,6);

var mod13 = ee.ImageCollection('MODIS/006/MOD13Q1');
var mod13Summer = mod13.filterDate('2000-01-01', '2020-12-31')
  .filter(ee.Filter.calendarRange(2000, 2020, 'year'))
  .map(function(img) {
  return img.set('year', img.date().get('year'));
  });
print(mod13Summer);
//按年份jion数据
var mod13SummerAnnualJoin = ee.Join.saveAll('same_year').apply({
  primary: mod13Summer.distinct('year'),
  secondary: mod13Summer,
  condition: ee.Filter.equals({leftField: 'year', rightField: 'year'})
});
print(mod13SummerAnnualJoin);

//添加年份作为新的波段
var summerStats = ee.ImageCollection(mod13SummerAnnualJoin.map(function(img) {
  var year = img.get('year');
  var yearCol = ee.ImageCollection.fromImages(img.get('same_year'));
  var mean = yearCol.select('NDVI').mean();
  var yr = ee.Image.constant(ee.Number(year)).toShort();
  return ee.Image.cat(yr, mean).rename(['year', 'mean']).set('year', year);
}));
print(summerStats,'summerStats');

//lineChart
var NDVI_mean = summerStats.select("mean"). map(function(image){
                       return image.multiply(0.0001).set(image.toDictionary(image.propertyNames()));
                     });
var Yearly_chart = ui.Chart.image.series({
    imageCollection: NDVI_mean.select('mean'),
    region: region,
    reducer: ee.Reducer.mean(),
    scale: 500,
    xProperty: 'year',
    }).setOptions({
      interpolateNulls: true,
      lineWidth: 2,
      title: 'NDVI Yearly Seires',
      vAxis: {title: 'NDVI'},
      hAxis: {title: 'Date'},
      trendlines: { 0: {title: 'NDVI_trend',type:'linear', showR2: true,  color:'red', visibleInLegend: true}}
    });
print(Yearly_chart);

//sensSlope 
var sens = summerStats.reduce(ee.Reducer.sensSlope());
print(sens,'sens');
//linearFit
var fit=summerStats.reduce(ee.Reducer.linearFit());
print(fit,'fit');
//slop 可视化 
var visParams = {
  opacity: 1,
  bands: ['slope'],
  min: -55,
  max: 55,
  palette:
    ['8c510a', 'd8b365', 'f6e8c3', 'f5f5f5', 'd9f0d3', '7fbf7b', '1b7837']
};
Map.addLayer(sens.clip(region), visParams, 'Sen\'s slope');
var vis = {min: -55, max: 55, palette: ['8c510a', 'd8b365', 'f6e8c3', 'f5f5f5', 'd9f0d3', '7fbf7b', '1b7837']};
var palettes = require('users/gena/packages:palettes');
function makeColorBarParams(palette) {
  return {
    bbox: [0, 0, 1, 0.1],
    dimensions: '300x10',
    format: 'png',
    min: 0,
    max: 1,
    palette: palette,
  };
}
var type=((sens.select('slope').gt(0)).multiply(1))
.add((sens.select('slope').lte(0)).multiply(2))
Map.addLayer(type.clip(region),{min:1,max:2,palette:['#3CB371','#B22222']},'G_or_B',false)
Export.image.toDrive({
  image:type.clip(region),
  description:"Drive",
  fileNamePrefix:"Graph",
  folder:"Graph1",
  scale:500,
  region:region,
  crs:"EPSG:4326",
  maxPixels:1e13
})
var colorBar = ui.Thumbnail({
  image: ee.Image.pixelLonLat().select(0),
  params: makeColorBarParams(['8c510a', 'd8b365', 'f6e8c3', 'f5f5f5', 'd9f0d3', '7fbf7b', '1b7837']),
  style: {stretch: 'horizontal', margin: '0px 8px', maxHeight: '40px'},
});
var legendLabels = ui.Panel({
  widgets: [
    ui.Label(vis.min, {margin: '4px 8px'}),
    ui.Label(
        (vis.max / 2),
        {margin: '4px 8px', textAlign: 'center', stretch: 'horizontal'}),
    ui.Label(vis.max, {margin: '4px 8px'})
  ],
  layout: ui.Panel.Layout.flow('horizontal')
});
var legendTitle = ui.Label({
  value: 'Annual growing season NDVI trend',
  style: {fontWeight: 'bold'}
});
var legendPanel = ui.Panel([legendTitle, colorBar, legendLabels]);
Map.add(legendPanel);
function getHistogram(Img, geometry) {
  var hist = Img.select('slope').reduceRegion({
    reducer: ee.Reducer.autoHistogram(),
    geometry: geometry,
    scale: 250,
    maxPixels: 1e13,
  });
  var histArray = ee.Array(hist.get('slope'));
  var binBottom = histArray.slice(1, 0, 1);
  var nPixels = histArray.slice(1, 1, null);
  var histColumnFromArray =
    ui.Chart.array.values({array: nPixels, axis: 0, xLabels: binBottom})
      .setChartType('LineChart')
      .setOptions({
        title: 'vegetation condition trend histogram',
        hAxis: {title: 'Slope'},
        vAxis: {title: 'Pixel count'},
        pointSize: 0,
        lineSize: 2,
        colors: ['1b7837'],
        legend: {position: 'none'}
      });
  return histColumnFromArray;
}
var histogram=(getHistogram(sens.select('slope')
.updateMask(((sens.select('slope')).gt(-200)).and ((sens.select('slope')).lt(200))), region));
var Greening_Area=((type.eq(1)).updateMask(type.eq(1)).multiply(ee.Image.pixelArea())).reduceRegion({
        reducer:ee.Reducer.sum(),
        geometry:region,
        scale :250,
        maxPixels:1e13
        });
print('Greening area (km2)',ee.Number(Greening_Area.get('slope')).divide(1000000))
var Browning_Area=((type.eq(2)).updateMask(type.eq(2)).multiply(ee.Image.pixelArea())).reduceRegion({
        reducer:ee.Reducer.sum(),
        geometry:region,
        scale :250,
        maxPixels:1e13
        });
print('Browning area (km2)',ee.Number(Browning_Area.get('slope')).divide(1000000))
var dict = ee.Image.pixelArea()  
            .addBands(type.int())  
            .reduceRegion({  
              reducer:ee.Reducer.sum().group({  
                groupField:1,  
                groupName:'type',  
              }),  
              geometry:region,  
              scale:250,  
              maxPixels:1e13  
            });  
var groups = ee.List(dict.get("groups"));  
var typeNames = ee.List(["Greening","Browning"]);  
var featureList = groups.map(function(group){  
  group = ee.Dictionary(group);  
  var area = ee.Number(group.get("sum"));  
  area = area.divide(1000000);  //km2
  var type = ee.Number(group.get("type"));  
  var f = ee.Feature(null, {  
    "type": type,   
    "area": area,   
    "name": typeNames.get(type.subtract(1))
  });  
  return f;  
});  
var areaFCol = ee.FeatureCollection(featureList);  
var totalArea = ee.Number(areaFCol.aggregate_sum("area"));  
areaFCol = areaFCol.map(function(f){  
  var typearea = ee.Number(f.get("area"));  
  f = f.set("type_area", typearea);  
  f = f.set("percent",typearea.divide(totalArea).multiply(100));
  return f;  
});  
print(areaFCol ,'areaFCol');
var piechart =
  ui.Chart.feature.byFeature(areaFCol)
    .setChartType('PieChart')
    .setOptions({
      xProperty: 'name',
      yProperties: 'percent',
      title: 'Area Percent of Greening and Browning pixles',
      legend: {position:'none'},//top-right
      width: 200,
      height: 200,
      is3D: true,
      colors: ['#3CB371','#B22222'],
    });
var panel2 = ui.Panel();
panel2.style().set({
  width: '350px',
  position: 'top-right'
});
var Area_table=(ui.Chart.feature.byFeature(areaFCol.select(['name','type_area']),
    'name')
  .setChartType('Table'));
var legendTitle = ui.Label({
  value: 'Area statistic of greening and browning area (Km2)',
  style: {fontWeight: 'bold'}
});
panel2.add(histogram).add(piechart).add(legendTitle).add(Area_table);  
Map.add(panel2);

最后你可以看到华南地区NDVI随时间的变化趋势

也可以看到绿了还是退化了的面积统计:

当然也可以看到可视化的地图哦:

今天的分享到这里就结束了,有不懂可以私聊小编哦,更多内容欢迎大家关注小编的公众号“梧桐GIS”,谢谢大家的支持!

  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算多年NDVI趋势,可以使用Google Earth Engine (GEE)平台进行分析。以下是一个示例代码,用于计算多年NDVI趋势: ```javascript // 定义感兴趣区域 var roi = ee.Geometry.Rectangle(\[xmin, ymin, xmax, ymax\]); // 加载MODIS NDVI数据集 var collection = ee.ImageCollection('MODIS/006/MOD13Q1') .filterDate('2000-01-01', '2020-12-31') .filterBounds(roi) .select('NDVI'); // 计算每年的平均NDVI var yearlyNDVI = collection.map(function(image) { var year = ee.Date(image.get('system:time_start')).get('year'); return image.set('year', year); }).reduce(ee.Reducer.mean().group({ groupField: 1, groupName: 'year' })); // 拟合线性趋势 var trend = yearlyNDVI.select(\['NDVI_mean'\]).reduce(ee.Reducer.linearFit()); // 可视化结果 Map.addLayer(trend, {min: -0.03, max: 0.03, bands: \['scale'\], palette: \['blue', 'white', 'red'\]}, 'NDVI Trend'); // 输出结果 print(trend); ``` 在这个示例代码中,我们首先定义了感兴趣区域(roi),然后加载了MODIS NDVI数据集,并筛选了指定的时间范围和感兴趣区域。接下来,我们计算了每年的平均NDVI,并使用reduce函数拟合了线性趋势。最后,我们将结果可视化,并输出了拟合的线性趋势。 请注意,示例代码中的xmin、ymin、xmax和ymax需要根据你的具体研究区域进行设置。此外,你还可以根据需要调整时间范围和NDVI可视化参数。 希望这个示例代码能帮助你计算多年NDVI趋势。如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值