Google Earth Engine – Analyzing Landsat 8 Collection 2 Anomalies in TIRS1 Data

cloudmaskinggoogle-earth-enginelandsat 8

I am looking to use Landsat 8 TIRS1 data over a region in the Yukon, Canada and I am getting persistent masked pixels (from the PIXEL_QA or the ST_QA bands) along what appears to be the same Focal Plane Module. It's present in every single image I query over this region (circled in red) as well as persistent regions across wide swaths of the Yukon, NWT, and Northern BC. The images do not have this persistent missing data region in Collection 1 (also linked in code below). I can't find anything about this in known issues from Landsat (potentially b/c Collection 2 is so new).

Update1: I double checked with a direct download of a scene from USGS EarthExplorer and the masked regions are there – so it's not and Earth Engine issue.

Update2: the USGS EROS office called me (I left a message with the help desk) and they mentioned a potential issues with the ASTER GED data that might be causing this. They are investigating and will follow up with me (hopefully in detail via email).

There isn't a coding solution here – I want to know if anyone has seen this and might offer an answer as to the cause (e.g. something in the process of C2 or simply an error that hasn't been identified previously). The OLI data are OK and do not get masked, just the TIRS data (turn on rgb in earth engine). Here's code to visualze the problem and a GEE link is below:

var PT = 
    /* color: #98ff00 */
    /* shown: false */
    ee.Geometry.Point([-137.77926112557552, 64.46710800208606]);
Map.centerObject(PT, 8)



// random 3 time periods to illustrate
var T1 = ee.Date("2014-01-01")
var T2 = ee.Date("2017-01-01")
var T3 = ee.Date("2020-01-01")


// filter onto a scene with recurring masked data
// NOTE I have not applied the C2 scale factors (but this doesn't matter here)
var C2 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
    .filterBounds(PT)

// 3 different time slices from Collection 2
var C2_T1 = C2
    .filterDate(T1, T1.advance(1,'year')).sort("system:time_start")
var C2_T2 = C2 
    .filterDate(T2, T2.advance(1,'year')).sort("system:time_start")
var C2_T3 = C2 
    .filterDate(T3, T3.advance(1,'year')).sort("system:time_start")



// now 3 from Collection 1
var C1 = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
    .filterBounds(PT)

var C1_T1 = C1    
    .filterDate(T1, T1.advance(1,'year')).sort("system:time_start")
var C1_T2 = C1    
    .filterDate(T2, T2.advance(1,'year')).sort("system:time_start")
var C1_T3 = C1    
    .filterDate(T3, T3.advance(1,'year')).sort("system:time_start")



// viz the C2s
var C2rgbViz = {bands:['SR_B4','SR_B3','SR_B2'], min:-5000, max:70000};
var C2tirViz = {bands:['ST_QA'], min:120, max:750, palette: ['#440154', '#433982', '#30678D', '#218F8B', '#36B677', '#8ED542', '#FDE725']};
Map.addLayer(C2_T1.first(), C2tirViz, "C2 T1 ST_QA")
Map.addLayer(C2_T1.first(), C2rgbViz, "C2 T1 RGB", false)
Map.addLayer(C2_T2.first(), C2tirViz, "C2 T2 ST_QA")
Map.addLayer(C2_T2.first(), C2rgbViz, "C2 T2 RGB", false)
Map.addLayer(C2_T3.first(), C2tirViz, "C2 T3 ST_QA")
Map.addLayer(C2_T3.first(), C2rgbViz, "C2 T3 RGB", false)


// viz the C1s
var C1rgbViz = {bands:['B4','B3','B2'], min:-5000, max:16000};
var C1tirViz = {bands:['pixel_qa'], min:120, max:750, palette: ['#440154', '#433982', '#30678D', '#218F8B', '#36B677', '#8ED542', '#FDE725']};
Map.addLayer(C1_T1.first(), C1tirViz, "C1 T1 ST_QA", false)
Map.addLayer(C1_T1.first(), C1rgbViz, "C1 T1 RGB", false)
Map.addLayer(C1_T2.first(), C1tirViz, "C1 T2 ST_QA", false)
Map.addLayer(C1_T2.first(), C1rgbViz, "C1 T2 RGB", false)
Map.addLayer(C1_T3.first(), C1tirViz, "C1 T3 ST_QA", false)
Map.addLayer(C1_T3.first(), C1rgbViz, "C1 T3 RGB", false)

Link to Earth Engine code to visualize problem:

https://code.earthengine.google.com/1fd4e633e2fcb727d60e87190696209d

enter image description here

Best Answer

USGS clarified that indeed gaps in ASTER GED lead to gaps in Landsat Collection 2 ST (Surface Temperature). This can be seen in Earth Engine:

var c1 = ee.Image('LANDSAT/LC08/C01/T1_SR/LC08_063015_20140219');
Map.addLayer(c1,  {bands:['B10']}, 'C1 SR B10', false);
var c2 = ee.Image('LANDSAT/LC08/C02/T1/LC08_063015_20140219');
var c2_st = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_063015_20140219');
Map.addLayer(c2_st, {bands:['ST_B10']}, 'C2 ST_B10');
Map.addLayer(c2, {bands:['B10']}, 'C2 TOA B10', false);
Map.centerObject(c2)
Map.addLayer(ee.Image('NASA/ASTER_GED/AG100_003'), {}, 'ASTER GED')

Landsat Collection 3 should address this problem.

If any workarounds are found meanwhile for Collection 2, they will be listed on the EE catalog page for Landsat 8 Level 2.

Related Question