很多时候我们将利用Landsat中的ST波段进行分析,这里我们首先再GEE原有的代码中进行初始影像的查看代码如下:

var dataset = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
    .filterDate('2021-05-01', '2021-06-01');

// Applies scaling factors.
function applyScaleFactors(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}

dataset = dataset.map(applyScaleFactors);

var visualization = {
  bands: ['SR_B4', 'SR_B3', 'SR_B2'],
  min: 0.0,
  max: 0.3,
};

Map.setCenter(-114.2579, 38.9275, 8);

Map.addLayer(dataset, visualization, 'True Color (432)');

再此代码基础上继续分析,这里需要根据公式来计算LST,但是这里我们查看代码有问题,问题如下:

 

 第一个问题:

Image (Error)

Image.select: Pattern 'B10' did not match any bands.

这里的问题就在于我们影像中并没有这个波段,原始波段中仅有ST_B10波段,所以不能拿过代码来就用,我们需要根据波段名称就直接用,所以我们得注意。在进行分析前,一定要查看相应的波段。另外,你使用的是Landsat8的影像,波段的年限是2013年开始,所以for循环不要超过这个期限。

 然后我们再看最后一个错误:

Image (Error)

Image.parseExpression: Expression parse error at character 28: 'T/(1+(10.9*T/1438e10-2)*log(ε))-273.15' ^.

0.135335*1438

表达式错误:

(T/((1+(10.9*T/1438)*ε1)-273.15))也就是这个错误,我们需要重新编辑这个函数

expression(expression, map)

Evaluates an arithmetic expression on an image, possibly involving additional images.

The bands of the primary input image are available using the built-in function b(), as b(0) or b('band_name').

Variables in the expression are interpreted as additional image parameters which must be supplied in opt_map. The bands of each such image can be accessed like image.band_name or image[0].

Both b() and image[] allow multiple arguments, to specify multiple bands, such as b(1, 'name', 3). Calling b() with no arguments, or using a variable by itself, returns all bands of the image.

If the result of an expression is a single band, it can be assigned a name using the '=' operator (e.g.: x = a + b).

Returns the image computed by the provided expression.

Arguments:

this:image (Image):

The Image instance.

expression (String):

The expression to evaluate.

map (Dictionary<Image>, optional):

A map of input images available by name.

Returns: Image

 我们需要把这个表达式分开写即可

代码:

var table = 
    /* color: #d63000 */
    /* displayProperties: [
      {
        "type": "rectangle"
      }
    ] */
    ee.FeatureCollection(
        [ee.Feature(
            ee.Geometry.Polygon(
                [[[-117.21659619808196, 40.394322402297234],
                  [-117.21659619808196, 39.246787819587716],
                  [-115.37089307308196, 39.246787819587716],
                  [-115.37089307308196, 40.394322402297234]]], null, false),
            {
              "system:index": "0"
            })]);
var roi = table
//导入自己的研究区,将其定义为roi
function applyScaleFactorsL89(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}
function applyScaleFactors(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}

function cloudmaskL89(image) {
  // Bits 3 and 5 are cloud shadow and cloud, respectively.
  var cloudShadowBitMask = (1 << 4);
  var cloudsBitMask = (1 << 3);
  // Get the pixel QA band.
  var qa = image.select('QA_PIXEL');
  // Both flags should be set to zero, indicating clear conditions.
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
                 .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  return image.updateMask(mask);
}
for(var i = 2011;i<=2020;i++){
var L8_SR = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')//加载L8_SR影像
var img_SR = L8_SR.filterBounds(roi)
           .filterDate(i+'-01-01', i+'-12-31')
           .filterMetadata('CLOUD_COVER', 'less_than',20)
           .map(applyScaleFactorsL89)
           .map(cloudmaskL89)
           .median();
 print(img_SR)          
var L8_B10 = img_SR.select('B10').multiply(0.1)
print(L8_B10)
var L8_LST = function(image, min, max) {
  min = min || 0
  max = max || 0.9
  var ndvi =  ee.Image(0).expression("(nir-red)/(nir+red)", {'nir': image.select('SR_B5'), 'red': image.select('SR_B4')}).rename('ndvi')
  var pv = ee.Image(0).expression("((ndvi-min)/(max-min))**2", {ndvi: ndvi, min: min, max: max}).rename('pv')
  var ε = ee.Image(0).expression("0.004*pv+0.986", {pv: pv})
  var T = ee.Image(0).expression("1321.08/log(774.89/(L8_B10)+1)", {L8_B10: L8_B10})
  var LST = ee.Image(0).expression("T/(1+(10.9*T/1438e10-2)*log(ε))-273.15", {T: T, ε: ε})
  return LST
}
print(L8_LST)
var EMM1 = L8_LST(img_SR, 0, 0.9)
var EMM = EMM1.clip(roi);
img_SR = img_SR.addBands(EMM.rename('LST').toFloat())
var SR_LST= img_SR.select('LST')
print(SR_LST)
Export.image.toDrive({
      image: SR_LST,
      description: i+'year_median',
      region: roi,
      maxPixels: 1e13,
      folder: 'LST',
      scale: 30,
      crs: "EPSG:4326"
    })
}

当我们使用表达式不能一步到位的时候,我们就可以进行拆分,拆分后就可以实现了,另外,不要使用科学计数,要用数学增长的数字,这样表达式才可以。 

修改后的代码:

var roi = table
//导入自己的研究区,将其定义为roi
function applyScaleFactorsL89(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}
function applyScaleFactors(image) {
  var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
  var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
  return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);
}

function cloudmaskL89(image) {
  // Bits 3 and 5 are cloud shadow and cloud, respectively.
  var cloudShadowBitMask = (1 << 4);
  var cloudsBitMask = (1 << 3);
  // Get the pixel QA band.
  var qa = image.select('QA_PIXEL');
  // Both flags should be set to zero, indicating clear conditions.
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
                 .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  return image.updateMask(mask);
}
for(var i = 2018;i<=2020;i++){
var L8_SR = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')//加载L8_SR影像
var img_SR = L8_SR.filterBounds(roi)
           .filterDate(i+'-01-01', i+'-12-31')
           .filterMetadata('CLOUD_COVER', 'less_than',30)
           .map(applyScaleFactorsL89)
           .map(cloudmaskL89)
           .median();
 print(img_SR)          
var L8_B10 = img_SR.select('ST_B10').multiply(0.1)
print(L8_B10)
var L8_LST = function(image, min, max) {
  min = min || 0
  max = max || 0.9
  var ndvi =  ee.Image(0).expression("(nir-red)/(nir+red)", {'nir': image.select('SR_B5'), 'red': image.select('SR_B4')}).rename('ndvi')
  var pv = ee.Image(0).expression("((ndvi-min)/(max-min))**2", {ndvi: ndvi, min: min, max: max}).rename('pv')
  var ε = ee.Image(0).expression("0.004*pv+0.986", {pv: pv})
  var e =  ee.Image(ε.log())
  //print("ε1",ε1)
  var ss = 0.135335*1438
  var k = 273.15
  print(ss)
  var T = ee.Image(0).expression("1321.08/log(774.89/(L8_B10)+1)", {L8_B10: L8_B10})
  print(T)
  //var LST = ee.Image(0).expression("(T/((1+(10.9*T/1438)*ε1)-273.15))", {T: T, ε1: ε1})
    //var LST = ee.Image(0).expression("((((10.9 * T) / ss) * ε1 ) - k) ", {T: T, ε1: ε1, ss:ss, k:k})
     //var LST = ee.Image(0).expression("(10.9 * T )/ (ss * ε1) ", {T: T, ε1: ε1, ss:ss, k:k})
     //var LST = ee.Image(0).expression('T/(1+(10.9.multip(T)/1438)*.multip(K)-273.15', {T: T, ε1: ε1, k:k})
      //var LST = ee.Image(0).expression('T/(1+(10.9*T/ss)*log(ε))-273.15' , {T: T.select("constant"), ε1: ε1.select("constant"),ss:ss, k:k})
  //print(LST)
  var l1 = ee.Image(0).expression('(T*10.9/ss+1)*e' , {T: T.select("constant"),e:e,ss:ss})
var l2 = ee.Image(0).expression('(1/T)*l1-273.15' , {T: T.select("constant"), l1:l1})
  return l2
}
print(L8_LST)
var EMM1 = L8_LST(img_SR, 0, 0.9)
var EMM = EMM1.clip(roi);
img_SR = img_SR.addBands(EMM.rename('LST').toFloat())
var SR_LST= img_SR.select('LST')
print(SR_LST)
Export.image.toDrive({
      image: SR_LST,
      description: i+'year_median',
      region: roi,
      maxPixels: 1e13,
      folder: 'LST',
      scale: 30,
      crs: "EPSG:4326"
    })
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐