Google Earth Engine(GEE)——Landsat8/modis/sentinel2 NDVI时序影像差异对比分析图表

简介: Google Earth Engine(GEE)——Landsat8/modis/sentinel2 NDVI时序影像差异对比分析图表

很多时候我们只管使用数据,而不知道数据之间的差异在那里,所以我们可以选择相同的点然后加载不同的数据集,然后查看某个点的时序影像来实现影像差异对比。

Landsat 8是由美国地质调查局(USGS)运行的陆地观测卫星,于2013年发射。它具有高分辨率的传感器(OLI和TIRS),可捕捉可见光、红外线和热红外线波段的数据,为地球科学家、资源管理人员和环境监测人员提供了有价值的信息。 Landsat 8影像可以用于许多应用,如土地利用/土地覆盖分类、森林管理、水资源管理、城市规划、矿产资源勘探等等。另外,Landsat 8数据也被广泛应用于自然灾害监测和应急响应。

Sentinel-2是欧洲空间局(ESA)推出的地球观测卫星,主要用于环境监测、地表覆盖变化检测、农业、森林和城市规划等领域。Sentinel-2具有高分辨率、广泛的覆盖范围、高频率的重访时间和多光谱能力,能够获取多种光谱波段的高分辨率影像数据,包括可见光、近红外和短波红外等。这些影像数据对于区分地表覆盖类型(如植被、水体、土地利用等)和监测环境变化非常有用。Sentinel-2影像数据可以通过ESA的数据门户或地球观测数据共享平台(GEE)等渠道获取。

MODIS是美国国家航空航天局(NASA)和美国地球观测系统(EOS)的一部分,是一种遥感技术,旨在捕捉地球表面和大气层的图像。MODIS影像可以用于监测和分析地表覆盖、气候变化、环境污染、自然灾害等多个领域的数据,因此在环境科学、气象学、农业、林业、水资源管理、城市规划等领域得到了广泛应用。MODIS影像的分辨率从250m至1km不等,可以提供全球99%覆盖率和每日多次观察,满足了许多科学家、政策制定者和其他研究人员对数据的需求。

函数:

ui.Chart.image.seriesByRegion(imageCollection, regions, reducer, band, scale, xProperty, seriesProperty)

Generates a Chart from an image collection. Extracts and plots the value of the specified band in each region for each image in the collection. Usually a time series.

  • X-axis = Image labeled by xProperty (default: 'system:time_start').
  • Y-axis = Reducer output.
  • Series = Region labeled by seriesProperty (default: 'system:index').

Returns a chart.

Arguments:

imageCollection (ImageCollection):

An ImageCollection with data to be included in the chart.

regions (Feature|FeatureCollection|Geometry|List<Feature>|List<Geometry>):

The regions to reduce.

reducer (Reducer):

Reducer that generates the value for the y-axis. Must return a single value.

band (Number|String, optional):

The band name to reduce using the reducer. Defaults to the first band.

scale (Number, optional):

Scale to use with the reducer in meters.

xProperty (String, optional):

Property to be used as the label for each image on the x-axis. Defaults to 'system:time_start'.

seriesProperty (String, optional):

Property of features in opt_regions to be used for series labels. Defaults to 'system:index'.

Returns: ui.Chart

 

代码:

var  AOI = 
    /* color: #d63000 */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.Geometry.Polygon(
        [[[-103.60307723271508, 44.88240786607988],
          [-103.60307723271508, 44.88233802278273],
          [-103.60242947923798, 44.88233802278273],
          [-103.60242947923798, 44.88240786607988]]], null, false),
    Point_1 = /* color: #98ff00 */ee.Geometry.Point([-103.60279560076852, 44.88238125911955]);
var AOI = AOI, Point_1 = Point_1;
//Sentinel 2 Image ------------------------------------------------------------
var startDateS2 = ee.Date.fromYMD(2016,1,1);
var endDateS2 = ee.Date.fromYMD(2016,8,29);
 
 
var collectionS2 = ee.ImageCollection("COPERNICUS/S2").filterDate(startDateS2,endDateS2).filterBounds(AOI).filterMetadata('CLOUDY_PIXEL_PERCENTAGE', 'less_than', 0.1);
 
 
var S2 = collectionS2.median().clip(AOI)
Map.addLayer(S2, {min:0, max: 3000, bands:"B4,B3,B2"}, 'S2');
Map.centerObject(AOI);
 
var s2_ndvi = S2.normalizedDifference(['B8', 'B4']).rename('NDVI')
 
var ndviParams = {min: -0.2, max: 0.8, palette: ['red', 'yellow', 'green']};
Map.addLayer(s2_ndvi, ndviParams, 'NDVI');
 
//
 
 
 
 
//TimeSeries ---------------------------------------------
 
var startDate = ee.Date.fromYMD(2018,1,1);
var endDate = ee.Date.fromYMD(2019,12,31);
 
var months = ee.List.sequence(1,12)
var years = ee.List.sequence(2018, 2019);
 
//Sentinel 2 < 15% clouds -----------------------------------------
 
var S2_nocloud = ee.ImageCollection("COPERNICUS/S2").filterDate(startDate,endDate)
                                            .filterBounds(AOI)
                                            .filterMetadata('CLOUDY_PIXEL_PERCENTAGE', 'less_than', 15)
                                     
                                           
var S2_NDVI_nocloud = S2_nocloud.map(function(image){
  return image.normalizedDifference(['B8', 'B4']).rename('NDVI').copyProperties(image, ['system:time_start']);
})
 
 
 
//Chart
 
var titleS2_nocloud = {
  title: 'S2 NDVI < 15% cloud',
  hAxis: {title: 'Time'},
  vAxis: {title: 'NDVI'},
};
 
 
var S2_chart_nocloud = ui.Chart.image.seriesByRegion({
  imageCollection: S2_NDVI_nocloud,
  regions: Point_1,
  reducer: ee.Reducer.mean(),
  band: 'NDVI',
  scale: 20,
  seriesProperty: 'NDVI'
}).setOptions(titleS2_nocloud)
 
print(S2_chart_nocloud);
 
// Sentinel 2 Monthly ------------------------------------------------------------
 
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).copyProperties(image, ['system:time_start']);
}
 
var S2 = ee.ImageCollection("COPERNICUS/S2").filterDate(startDate,endDate)
                                            .filterBounds(AOI)
                                            .map(maskS2clouds);
 
 
 
var Monthly_S2 =  ee.ImageCollection.fromImages(
  years.map(function (y) {
    return months.map(function(m) {
       
      var filtered = S2.filter(ee.Filter.calendarRange(y, y, 'year'))
                    .filter(ee.Filter.calendarRange(m, m, 'month'))
      filtered = filtered.median()
      var NDVI = filtered.expression(
        '((NIR - RED) / (NIR + RED))', {
        'NIR': filtered.select('B8'),
        'RED': filtered.select('B4')
        }).rename('NDVI'); 
     
      return NDVI.set('year', y).set('month', m).set('system:time_start', ee.Date.fromYMD(y, m, 1));                 
    });
  }).flatten()
);
 
//Chart
 
var titleS2_M = {
  title: 'Mean Monthly S2 NDVI',
  hAxis: {title: 'Time'},
  vAxis: {title: 'NDVI'},
};
 
 
var S2_chart_M = ui.Chart.image.seriesByRegion({
  imageCollection: Monthly_S2,
  regions: Point_1,
  reducer: ee.Reducer.mean(),
  band: 'NDVI',
  scale: 20,
  seriesProperty: 'NDVI'
}).setOptions(titleS2_M)
 
print(S2_chart_M);
 
 
//MODIS NDVI --------------------------------------------------------------------------
 
var MD_NDVI = ee.ImageCollection('MODIS/MOD09GA_006_NDVI')
    .filterDate(startDate,endDate)
    .filterBounds(AOI)
    .select('NDVI');
 
 
 var Monthly_MD =  ee.ImageCollection.fromImages(
  years.map(function (y) {
    return months.map(function(m) {
       
      var filtered = MD_NDVI.filter(ee.Filter.calendarRange(y, y, 'year'))
                    .filter(ee.Filter.calendarRange(m, m, 'month'))
      filtered = filtered.median()
      return filtered.set('year', y).set('month', m).set('system:time_start', ee.Date.fromYMD(y, m, 1));                 
    });
  }).flatten()
);
 
//Chart
 
var titleMD = {
  title: 'Mean Monthly MODIS NDVI',
  hAxis: {title: 'Time'},
  vAxis: {title: 'NDVI'},
};
 
 
var MD_chart = ui.Chart.image.seriesByRegion({
  imageCollection: Monthly_MD,
  regions: Point_1,
  reducer: ee.Reducer.mean(),
  band: 'NDVI',
  scale: 60,
  seriesProperty: 'NDVI'
}).setOptions(titleMD)
 
print(MD_chart);
 
 
//Landsat 8 ------------------------------------------------------------
 
var L8 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR').filterDate(startDate,endDate)
                                                     .filterBounds(AOI)
                                                    
                                                    
 
var L8_NDVI = L8.map(function(image){
  return image.normalizedDifference(['B5', 'B4']).rename('NDVI').copyProperties(image, ['system:time_start']);
})
//chart
 
var titleL8 = {
  title: 'L8 NDVI',
  hAxis: {title: 'Time'},
  vAxis: {title: 'NDVI'},
};
 
var L8_chart = ui.Chart.image.seriesByRegion({
  imageCollection: L8_NDVI,
  regions: Point_1,
  reducer: ee.Reducer.mean(),
  band: 'NDVI',
  scale: 30,
  seriesProperty: 'NDVI'
}).setOptions(titleL8)
 
print(L8_chart);
 
 
// export to CSV
 
var export_csv = function(img){
  var mon = img.get('month')
  var yea = img.get('year')
  var value = img.reduceRegion(ee.Reducer.mean(), Point_1, 500).get('NDVI')
  var ft = ee.Feature(null, {'year': yea,
                             'month': mon,
                             'value': value});
  return ft;
};
 
// Apply the function to each image in modisLST.
var MD_csv = Monthly_MD.map(export_csv);
 
Export.image.toDrive({
  image: s2_ndvi,
  description: 'Afework_Bibugne',
  scale: 10
});
Export.table.toDrive({collection: MD_csv, selectors: 'year, month, value',folder:"Time_Series", fileFormat:"CSV"});
相关文章
|
7月前
|
数据可视化 定位技术 Sentinel
如何用Google Earth Engine快速、大量下载遥感影像数据?
【2月更文挑战第9天】本文介绍在谷歌地球引擎(Google Earth Engine,GEE)中,批量下载指定时间范围、空间范围的遥感影像数据(包括Landsat、Sentinel等)的方法~
2691 1
如何用Google Earth Engine快速、大量下载遥感影像数据?
|
7月前
|
机器学习/深度学习 算法 数据可视化
基于Google Earth Engine云平台构建的多源遥感数据森林地上生物量AGB估算模型含生物量模型应用APP
基于Google Earth Engine云平台构建的多源遥感数据森林地上生物量AGB估算模型含生物量模型应用APP
251 0
|
7月前
|
数据处理
Google Earth Engine(GEE)——sentinel-1数据处理过程中出现错误Dictionary does not contain key: bucketMeans
Google Earth Engine(GEE)——sentinel-1数据处理过程中出现错误Dictionary does not contain key: bucketMeans
124 0
|
4月前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
99 1
|
6月前
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
168 3
|
2月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
3月前
|
监控 Java Nacos
SpringCloud基础5——微服务保护、Sentinel
sentinel、雪崩问题、流量控制、隔离和降级、授权规则、规则持久化
SpringCloud基础5——微服务保护、Sentinel
|
5月前
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
248 0
|
5月前
|
监控 Dubbo 应用服务中间件
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
通用快照方案问题之Sentinel与SpringCloud和Dubbo的整合如何解决
54 0
|
6月前
|
Java 开发者 Sentinel
Spring Cloud系列——使用Sentinel进行微服务保护
Spring Cloud系列——使用Sentinel进行微服务保护
76 5