• GEE开发之Sentinel-2计算NDVI和数据分析



    前言:主要介绍哨兵2号卫星下计算NDVI的值、遥感影像和数据的获取。


    1 基础知识

    Sentinel-2:中文名哨兵2号卫星。

    • Sentinel-2是一种宽测绘带、高分辨率、多光谱成像任务,支持哥白尼土地监测研究,包括植被、土壤和水覆盖的监测,以及内陆水道和沿海地区的观察。
    • Sentinel-2 L2数据从scihub下载。它们是通过运行sen2cor计算的。警告:ESA没有为所有一级资产生成二级数据,早期的二级覆盖范围不是全局的。
    • 这些资源包含12个UINT16光谱带,代表按10000缩放的SR(与L1数据不同,没有B10)。还有几个L2特定的频段(有关详细信息,请参阅频段列表)。有关详细信息,请参阅Sentinel-2用户手册。此外,存在三个QA频带,其中一个(QA60)是具有云掩码信息的位掩码频带。有关更多详细信息,请参阅如何计算云遮罩的完整解释。
    • Sentinel-2 L2资产的EE资产ID具有以下格式:哥白尼/S2\U SR/20151128 002653\U 20151128 102149\U T56MNN。这里,第一个数字部分表示感应日期和时间,第二个数字部分代表产品生成日期和时间。最后一个6个字符的字符串是一个唯一的颗粒标识符,指示其UTM网格参考(请参阅MGRS)。

    NDVI的计算公式:NDVI = (近红外波段 - 红波段) / (近红外波段 + 红波段)
    针对每种卫星的波段,选用的波段都有所不同,公式如下:

    • Landsat8: NDVI = (band5 - band4) / (band5 + band4)
    • Sentinel2: NDVI = (band8 - band4) / (band8 + band4)
    • Modis: NDVI = (band2 - band1) / (band2 + band1)
    • ETM/TM: NDVI = (band4 - band3) / (band4 + band3)
    • AVHRR: NDVI = (CH2 - CH1) / (CH2 + CH1)

    2 影像、数据、变化趋势实现

    代码如下(以鹿邑县为例)

    //以鹿邑县为例子
    var geometry = ee.FeatureCollection('users/www1573979951/luyixian')
    Map.centerObject(geometry,7)
    //颜色设置 
    var colorizedVis = {
      min: -0.8,
      max: 0.8,
      palette: ['blue', 'white', 'green'],
    };
     
    //使用QA波段去云
    function maskS2clouds(image) {
      var qa = image.select('QA60');
      // Bits 10 and 11 are clouds and cirrus, respectively.
      var cloudBitMask = 1 << 10;
      var cirrusBitMask = 1 << 11;
      // Both flags should be set to zero, indicating clear conditions.
      var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
          .and(qa.bitwiseAnd(cirrusBitMask).eq(0));
      return image.updateMask(mask).divide(10000).set(image.toDictionary(image.propertyNames()));
    }
    
    //NDVI的计算公式
    function createNDVI(image){
      var ndvi = image.normalizedDifference(["B8","B4"]).rename('NDVI');
      return image.addBands(ndvi);
    }
    
    //特别注意的是,在数学变换之后,保持原始影像的属性,所以这里.set(image.toDictionary(image.propertyNames()));
    var S2_COL = ee.ImageCollection("COPERNICUS/S2")
    .filterDate("2020-01-01", "2020-12-31")
    .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',20))
    .filterBounds(geometry)
    .map(maskS2clouds)
    .map(createNDVI)
    .select('NDVI');
    print(S2_COL)
    Map.addLayer(S2_COL.mean().clip(geometry), colorizedVis, 'col');
    
    //趋势线代码 
    var S2_chart = ui.Chart.image.series({
        imageCollection: S2_COL.select('NDVI'),
        region: geometry,
        reducer: ee.Reducer.mean(),
        scale: 500
        }).setOptions({
          interpolateNulls: true,
          lineWidth: 2,
          title: 'NDVI Time Seires',
          vAxis: {title: 'NDVI'},
          hAxis: {title: 'Date'},
          trendlines: { 0: {title: 'NDVI_trend',type:'linear', showR2: true,  color:'red', visibleInLegend: true}}
        });
    print(S2_chart);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    遥感影像截图:
    在这里插入图片描述
    数据集截图(51个数据集):
    在这里插入图片描述
    表格数据以及变化趋势截图:
    在这里插入图片描述
    CSV数据:
    在这里插入图片描述

    3 月平均数据的变化趋势

    代码如下(以鹿邑县为例):

    //以鹿邑县为例子
    var geometry = ee.FeatureCollection('users/www1573979951/luyixian')
    Map.centerObject(geometry,7)
    //颜色设置 
    var colorizedVis = {
      min: -0.8,
      max: 0.8,
      palette: ['blue', 'white', 'green'],
    };
     
    //使用QA波段去云
    function maskS2clouds(image) {
      var qa = image.select('QA60');
      // Bits 10 and 11 are clouds and cirrus, respectively.
      var cloudBitMask = 1 << 10;
      var cirrusBitMask = 1 << 11;
      // Both flags should be set to zero, indicating clear conditions.
      var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
          .and(qa.bitwiseAnd(cirrusBitMask).eq(0));
      return image.updateMask(mask).divide(10000).set(image.toDictionary(image.propertyNames()));
    }
    
    //NDVI的计算公式
    function createNDVI(image){
      var ndvi = image.normalizedDifference(["B8","B4"]).rename('NDVI');
      return image.addBands(ndvi);
    }
    
    //特别注意的是,在数学变换之后,保持原始影像的属性,所以这里.set(image.toDictionary(image.propertyNames()));
    var S2_COL = ee.ImageCollection("COPERNICUS/S2")
    .filterDate("2020-01-01", "2020-12-31")
    .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE',20))
    .filterBounds(geometry)
    .map(maskS2clouds)
    .map(createNDVI)
    .select('NDVI');
    print(S2_COL)
    Map.addLayer(S2_COL.median().clip(geometry), colorizedVis, 'col');
    
    
    var years = ee.List.sequence(2020, 2020);
    var months = ee.List.sequence(1, 12);
    var S2_monthlymeanNDVI =  ee.ImageCollection.fromImages(
      years.map(function (y) {
        return months.map(function(m) {
        return S2_COL.filter(ee.Filter.calendarRange(y,y, 'year')).filter(ee.Filter.calendarRange(m, m, 'month')).mean().set('year', y).set('month', m).set('system:time_start', ee.Date.fromYMD(y, m, 1));
        });
      }).flatten()
    );
    // Create a monthly time series chart.
    var plotNDVI = ui.Chart.image.seriesByRegion(S2_monthlymeanNDVI, geometry,ee.Reducer.mean(),
    'NDVI',500,'system:time_start')
                  .setChartType('LineChart').setOptions({
                    interpolateNulls: true,
                    title: 'NDVI Monthly time series',
                    hAxis: {title: 'Date'},
                    vAxis: {title: 'NDVI',viewWindowMode: 'explicit', viewWindow: {max: 0.7,min: 0.3,},gridlines: {count: 10,}},
                    trendlines: { 0: {title: 'NDVI_trend',type:'linear', showR2: true,  color:'red', visibleInLegend: true}}});
    // Display.
    print(plotNDVI);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    影像截图:
    在这里插入图片描述
    表格变化趋势图:
    在这里插入图片描述
    CSV数据截图:
    在这里插入图片描述

  • 相关阅读:
    一文看懂拉格朗日乘子法、KKT条件和对偶问题
    如何进行数据库分库分表
    【阅读】一周翻过《构建之法》,笔记整理
    Python类和对象怎么使用
    使用C语言实现各种排序(总结)
    数字化营销系统如何赋能实体找准客户,找到业绩爆发点?
    专访 | 许伟 ——贡献榜 Top4 也只是“开源小白”
    基于Java Web的云端学习系统的设计与实现
    虚拟机Ubuntu20.04 网络连接器图标开机不显示怎么办
    TV蓝牙无法被搜索问题解决记录:REQUEST_DISCOVERABLE ActivityNotFoundException
  • 原文地址:https://blog.csdn.net/qq_32306361/article/details/126087702