1

I am trying to calculate an NDVI over time (say, the span of 30 years) for a certain area of the United States. I think it's possible with Landsat 5,7, and 8 together. The goal is to understand change in peak vegetation over time to evaluate the efficacy of natural parks policy in a certain locality.

Question: If I were to download images from 5,7, and 8 and calculate NDVI, would the results be comparable between satellites? If they are not, is it possible to make transformations to make them comparable?

4
  • Welcome to GIS.SE. Please consider splitting your question into two separate ones, since answering multiple questions within one thread can easily confuse others seeking for advice on similar topics.
    – Erik
    Jan 14, 2019 at 14:06
  • Welcome to gis.stackechange.com. Usually 'open ended' questions like this either get ignored or get answered poorly. To help you get awesome answers to this, can you elaborate on your question and also suggest what you have tried so far? Are you looking for annual or monthly NDVI images? Do you aim to capture seasonality or decadal scale changes? Would you like to try this in QGIS, ArcMap or Google's Earth Engine?
    – GeoMonkey
    Jan 14, 2019 at 14:11
  • You would need to make sure the imagery was acquired at a similar time of year. Also, all of the imagery would require atmospheric correction. Have you looked into using Google Earth Engine to do the analysis?
    – Aaron
    Jan 14, 2019 at 14:48
  • Have you looked at MODIS or ESA Copernicus NDVI or LAI data? You could composite a 300m timeseries with two measurements per month over a fairly long period. The processed Copernicus 300m data starts in 2013 and the 1000m in 1998. This type of data will facilitate a much more robust analysis than the number of scenes that you will get with Landsat. Also, be aware that there have been a slew of recent papers addressing the type of analysis you are proposing and, it is critical that historic land tenure be accounted for in your controls. Jan 14, 2019 at 16:04

2 Answers 2

1

What you are looking for is the Landsat 'Analysis Ready Data' that USGS provides. This data set has been calibrated as thoroughly as they've been able to do and in theory should allow for an analysis such as the one you outline.
Specifically, you will want to use the 'SR'-product, which is short for 'Surface Reflectance'.

Once you have the data downloaded and ready, the key element is to avoid incorrect conclusions caused by seasonality etc., but that is an entirely different question to the one that you've asked.

0
// set study area
var roi = table;
Map.addLayer(roi, {'color':'grey'}, 'studyArea');
Map.centerObject(roi);

// define cloud removal functions for Landsat-5/7/8
function rmL457Cloud(image) {
  var qa = image.select('pixel_qa');
  // If the cloud bit (5) is set and the cloud confidence (7) is high
  // or the cloud shadow bit is set (3), then it's a bad pixel.
  var cloud = qa.bitwiseAnd(1 << 5)
                  .and(qa.bitwiseAnd(1 << 7))
                  .or(qa.bitwiseAnd(1 << 3));
  // Remove edge pixels that don't occur in all bands
  var mask2 = image.mask().reduce(ee.Reducer.min());
  return image.updateMask(cloud.not()).updateMask(mask2)
              .copyProperties(image)
              .copyProperties(image, ["system:time_start",'system:time_end','system:footprint']);
}

function rmL8Cloud(image) { 
  var cloudShadowBitMask = (1 << 3); 
  var cloudsBitMask = (1 << 5); 
  var qa = image.select('pixel_qa'); 
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0) 
                 .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  return image.updateMask(mask)
              .copyProperties(image)
              .copyProperties(image, ["system:time_start",'system:time_end']);
} 


// set some gloabl variables
var year_start = 1990;
var year_end = 2020;
var month_start = 7;
var month_end = 8;

var LC8_BANDS = ['B4',  'B5']; //Landsat 8
var LC7_BANDS = ['B3',  'B4']; //Landsat 7
var LC5_BANDS = ['B3',  'B4']; //Llandsat 5
var STD_NAMES = ['Red', 'NIR']; 

// var ImgFVC = FVC_year(2010,roi,month_start,month_end);
// Map.addLayer(ImgFVC, {'min':0,'max':1,'palette':['#A9A9A9','00FF00']}, 'ImgFVC');


  // define dates
  var Date_start = ee.Date.fromYMD(1990, month_start, 1); 
  var Date_end =  ee.Date.fromYMD(2020, month_end, 1).advance(1,'month');
  
  // define Image Collections
  var l8=ee.ImageCollection("LANDSAT/LC08/C01/T1_SR")
                        .filterDate(Date_start,Date_end)
                        .filter(ee.Filter.calendarRange(month_start,month_end,'month'))
                        .filterBounds(roi)//
                        // .filter(ee.Filter.lte('CLOUD_COVER',10))//云量过滤
                        .map(rmL8Cloud)
                        .select(LC8_BANDS, STD_NAMES); 
  var l7=ee.ImageCollection("LANDSAT/LE07/C01/T1_SR")
                          .filterDate(Date_start,Date_end)
                          .filter(ee.Filter.calendarRange(month_start,month_end,'month'))
                         .filterBounds(roi)//
                          // .filter(ee.Filter.lte('CLOUD_COVER',10))//云量过滤
                          .map(rmL457Cloud)
                          .select(LC7_BANDS, STD_NAMES); 
  var l5=ee.ImageCollection("LANDSAT/LT05/C01/T1_SR")
                          .filterDate(Date_start,Date_end)
                          .filter(ee.Filter.calendarRange(month_start,month_end,'month'))
                          .filterBounds(roi)//
                          // .filter(ee.Filter.lte('CLOUD_COVER',10))//云量过滤
                          .map(rmL457Cloud)
                          .select(LC5_BANDS, STD_NAMES); 
  // compute col composite                          
  var LandsatCol = ee.ImageCollection(l5.merge(l7).merge(l8));
  print(LandsatCol)
1
  • Is that serious? learned Mar 6, 2023 at 6:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.