Google Earth Engine(GEE)——计算LST地表温度的出现的错误
再此代码基础上继续分析,这里需要根据公式来计算LST,但是这里我们查看代码有问题,问题如下:第一个问题:这里的问题就在于我们影像中并没有这个波段,原始波段中仅有ST_B10波段,所以不能拿过代码来就用,我们需要根据波段名称就直接用,所以我们得注意。在进行分析前,一定要查看相应的波段。另外,你使用的是Landsat8的影像,波段的年限是2013年开始,所以for循环不要超过这个期限。
很多时候我们将利用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"
})
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)