LXX
读完需要
速读仅需 1 分钟
前言:
最近一直在加班出差,好久没有更新了。忙中偷闲,本文分享通过 GEE 可视化海拔高度与温度曲线图,从而可以更直观地看出海拔与温度的关系。
希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)
1
地表温度 (LST) 是环境监测和气候变化研究中的一个关键参数。通过 Landsat 8 卫星获取的热红外波段数据,我们可以计算地表温度。
(1)原理地表温度的计算主要基于辐射传输方程,该方程描述了地表辐射能量与大气参数之间的关系。辐射传输方程的基本形式如下:其中:
L 是地表向上的辐射亮度。ϵ 是地表发射率。σ 是斯蒂芬-玻尔兹曼常数。T 是地表温度。Latm 是大气向下的辐射亮度。通过反演辐射传输方程,可以得到地表温度 。
(2)方法计算地表温度 (LST) 的具体步骤如下:
2.1 数据获取:从 Landsat 8 卫星获取热红外波段 (Band 10) 数据,该波段提供亮温度 (Brightness Temperature, BT) 信息。
2.2 亮温度转换:Landsat 8 的热红外波段数据提供的是开尔文温度,需要将其转换为摄氏温度。转换公式为:BT (°C)=BT (K)−273.15
2.3 大气参数获取:大气参数,如大气透过率和大气辐射亮度,可以通过 MODIS 数据集 (如 MOD11A2) 获取。这些参数用于校正大气影响。
2.4 辐射传输方程反演:使用辐射传输方程,结合大气参数,计算地表温度辐射传输方程的简化形式如下:
其中:λ 是热红外波段的波长。ρ 是常数。ϵ 是地表发射率,通常取值约为 0.95。Tatm 是大气温度。
此外,Landsat8 数据的 L2 级产品的热红外波段 ST_B10 就直接对应着地表温度,只需计算即可获取摄氏度。
2
(1)定义起点和终点的坐标,并连接成一条直线首先,我们需要定义两点坐标,并将它们连接成一条直线。这条直线将作为我们分析的横断面。
var reno = [-119.821944, 39.527222];
var sf = [-122.416667, 37.783333];
var transect = ee.Geometry.LineString([reno, sf]);
(2)选择影像并按照这条线进行筛选我们将使用 Landsat 8 的影像,并选择这些影像中沿我们定义的直线进行筛选。接下来,我们选择温度波段(B10 波段)。
var landsat8Toa = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var temperature = landsat8Toa.filterBounds(transect)
.select(['B10'], ['temp'])
.map(function(image) {
// 温度值转化为摄氏度
return image.subtract(273.15)
.set('system:time_start', image.get('system:time_start'));
});
(3)提取温度波段并转换为摄氏度 Landsat 8 的 B10 波段提供地表温度信息,但以开尔文为单位。我们需要将其转换为摄氏度。
(4) 计算夏季和冬季的平均温度我们选择特定日期范围内的影像,并计算夏季和冬季的平均温度。
var summer = temperature.filterDate('2014-06-21', '2014-09-23')
.reduce(ee.Reducer.mean())
.select([0], ['summer']);
var winter = temperature.filterDate('2013-12-21', '2014-03-20')
.reduce(ee.Reducer.mean())
.select([0], ['winter']);
(5) 选择数字高程模型(DEM)影像我们从 USGS 获取数字高程模型(DEM)影像,用于提取沿横断面的海拔信息。
var elevation = ee.Image('USGS/NED');
(6) 将起点放入矢量集合,并计算距离我们将两点放入一个矢量集合,并计算距离,用于绘制图表时的 X 轴。
var startingPoint = ee.FeatureCollection(ee.Geometry.Point(sf));
var distance = startingPoint.distance(500000);
(7) 将距离、海拔和温度值合并到一个影像中我们将距离、海拔和夏季、冬季温度值分别作为波段,合并到一个影像中。
var image = distance.addBands(elevation).addBands(winter).addBands(summer);
(8)沿横断面提取数据并转换为数组我们沿着横断面提取数据,并将其转换为数组,以便后续处理。
var array = image.reduceRegion(ee.Reducer.toList(), transect, 1000)
.toArray(image.bandNames());
(9)对数据进行排序我们对提取的数据进行排序,先按距离排序,再按海拔和温度排序。
var distances = array.slice(0, 0, 1);
array = array.sort(distances);
var elevationAndTemp = array.slice(0, 1);
var distance = array.slice(0, 0, 1).project([1]);
(10) 绘制海拔和温度的剖面图绘制海拔和温度的剖面图。
var chart = ui.Chart.array.values(elevationAndTemp, 1, distance)
.setChartType('LineChart')
'Winter 2014', 'Summer 2014'])
.setOptions({
title: '剖面海拔与温度',
vAxes: {
0: {
title: '季节平均温度(摄氏度)'
},
1: {
title: '高度',
baselineColor: 'transparent'
}
},
hAxis: {
title: '距离'
},
interpolateNulls: true,
pointSize: 0,
lineWidth: 1,
series: {
0: {targetAxisIndex: 1},
1: {targetAxisIndex: 0},
2: {targetAxisIndex: 0}
}
});
print(chart);
38.5, 7);
{min: 4000, max: 0});
'FF0000'}); :
从图中可以看到,温度变化显示出夏季和冬季的显著差异。夏季的平均温度较高,而冬季的平均温度较低。图表中的温度变化趋势还可以帮助我们理解不同海拔高度对温度的影响,例如高海拔地区通常温度较低,而低海拔地区温度较高。