以下是将您提供的代码转化为中文博客的内容:
基于Google Earth Engine的植被指数与地表温度分析
一、研究背景与目的
在城市化快速发展的今天,城市热岛效应和植被覆盖变化成为环境科学研究的热点。本文旨在利用Google Earth Engine平台,分析墨西哥城(CDMX)地区的植被指数(NDVI)和地表温度(LST)变化情况,以期为城市规划和生态环境保护提供科学依据。
二、数据与方法
(一)研究区域与数据
研究区域为墨西哥城(CDMX),其地理坐标范围大致为东经-99.24502375380841到-99.12966730849591,北纬19.419140119882353到19.553781536579162。数据来源于Google Earth Engine平台的Landsat 8卫星影像,时间跨度为2013年1月1日至2024年12月31日。
(二)数据处理与分析方法
1. 数据预处理
对Landsat 8影像数据进行了一系列预处理操作。首先,应用了缩放因子,将影像的光学波段和热波段数据转换为实际的反射率和亮度温度。其次,进行了云层掩膜处理,通过分析影像的质量评估(QA)波段,去除云层和云影干扰,确保数据的准确性。
2. 指数计算
计算了植被指数(NDVI)和地表温度(LST)。NDVI是通过归一化植被指数公式计算得到的,用于反映植被覆盖度和生长状况。LST则是基于热红外波段数据,结合植被覆盖度信息,通过物理模型反演得到的,用于表征地表温度状况。
3. 时间序列分析
对2014年至2024年的LST数据进行了年际平均计算,生成了时间序列数据。通过绘制时间序列图表,分析了LST随时间的变化趋势,并进行了线性回归分析,拟合了LST随年份变化的线性趋势线。
三、结果与分析
(一)植被指数(NDVI)分析
通过计算得到的平均NDVI影像显示,墨西哥城地区的植被覆盖存在明显的空间差异。NDVI值从-1到1不等,其中正值表示植被覆盖较好,负值则表示植被覆盖较差或为非植被区域。从影像中可以看出,城市中心区域的NDVI值相对较低,而周边山区和绿地的NDVI值较高,这表明城市化对植被覆盖产生了显著影响。
(二)地表温度(LST)分析
平均LST影像揭示了墨西哥城地区的地表温度分布特征。LST值范围为11℃到55℃,其中高温区域主要集中在城市中心和工业区,而低温区域则多分布在植被覆盖较好的山区和水域附近。这说明城市热岛效应在该地区较为明显,城市建筑和人类活动对地表温度产生了显著的提升作用。
(三)时间序列分析
LST年际平均时间序列图表显示,2014年至2024年间,墨西哥城地区的LST整体呈上升趋势。线性回归分析结果表明,LST与年份之间存在显著的正相关关系,斜率为正值,表明随着时间的推移,地表温度逐渐升高。这一趋势可能与城市化进程的加快、人口增长以及气候变化等因素有关。
四、结论与展望
本文利用Google Earth Engine平台,对墨西哥城地区的植被指数(NDVI)和地表温度(LST)进行了分析。结果表明,城市化对植被覆盖和地表温度产生了显著影响,城市中心区域植被覆盖减少,地表温度升高。未来的研究可以进一步探讨不同土地利用类型对NDVI和LST的影响,以及气候变化与城市热岛效应之间的相互作用。此外,还可以结合实地观测数据,对模型结果进行验证和改进。
:以上内容是根据您提供的代码进行的中文转化和解读,代码中的注释和变量名等信息为分析提供了重要依据。
全部代码
// 定义研究区域的几何多边形
var aoi =
/* color: #0b4a8b */
/* displayProperties: [
{
"type": "rectangle"
}
] */
ee.Geometry.Polygon( // 创建一个几何多边形对象,用于表示研究区域
[[[-99.24502375380841, 19.553781536579162], // 多边形的顶点坐标
[-99.24502375380841, 19.419140119882353],
[-99.12966730849591, 19.419140119882353],
[-99.12966730849591, 19.553781536579162]]], null, false);
Map.addLayer(aoi, {}, 'AOI - CDMX'); // 将研究区域添加到地图上
Map.centerObject(aoi, 10); // 将地图中心定位到研究区域,并设置缩放级别
// ----------------- PARTE 1: CONFIGURACIÓN -----------------
// 定义时间范围
var startDate = '2013-01-01'; // 开始日期
var endDate = '2024-12-31'; // 结束日期
// 定义 NDVI 的颜色调色板
var ndviPalette = [
'#800000', '#a52a2a', '#b22222', '#cd5c5c', '#e9967a',
'#f08080', '#fa8072', '#f4a460', '#f0e68c', '#fffacd',
'#ffffe0', '#d9f99d', '#bbf7d0', '#86efac', '#4ade80',
'#22c55e', '#16a34a', '#15803d', '#166534', '#14532d',
'#0f3d22'
];
// 定义 NDVI 的标签
var ndviLabels = [
'-1.0', '-0.9', '-0.8', '-0.7', '-0.6',
'-0.5', '-0.4', '-0.3', '-0.2', '-0.1',
' 0.0', ' 0.1', ' 0.2', ' 0.3', ' 0.4',
' 0.5', ' 0.6', ' 0.7', ' 0.8', ' 0.9',
' 1.0'
];
// 定义 LST 的颜色调色板
var lstPalette2 = [
'0000ff', // Azul (frío) 冷色
'00bfff', // Azul claro 浅蓝色
'00ffbf', // Verde-azulado 青绿色
'00ff00', // Verde 绿色
'bfff00', // Verde amarillento 黄绿色
'ffff00', // Amarillo 黄色
'ffbf00', // Naranja claro 浅橙色
'ff8000', // Naranja fuerte 深橙色
'ff4000', // Naranja-rojo 橙红色
'ff0000', // Rojo puro 纯红色
'b30000', // Rojo oscuro 深红色
'7f0000' // Rojo muy oscuro (extremo calor) 极热深红色
];
// ----------------- PARTE 2: FUNCIONES -----------------
// 应用缩放因子的函数
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 cloudMask(image) {
var cloudShadowBitmask = (1 << 3); // 定义云影掩膜位
var cloudBitmask = (1 << 5); // 定义云掩膜位
var qa = image.select('QA_PIXEL'); // 选择 QA_PIXEL 波段
var mask = qa.bitwiseAnd(cloudShadowBitmask).eq(0) // 创建云影掩膜
.and(qa.bitwiseAnd(cloudBitmask).eq(0)); // 创建云掩膜
return image.updateMask(mask); // 更新图像掩膜
}
// 计算 NDVI 和 LST 的函数
function computeLST(image) {
var ndvi = image.normalizedDifference(['SR_B5', 'SR_B4']).rename('ndvi'); // 计算 NDVI
// 固定的 NDVI 最小值和最大值(可根据需要调整)
var ndviMin = -0.2;
var ndviMax = 0.8;
var fv = ((ndvi.subtract(ndviMin)).divide(ndviMax - ndviMin)).pow(2); // 计算植被分数
var em = fv.multiply(0.004).add(0.986).rename('em'); // 计算发射率
var thermal = image.select('ST_B10').rename('thermal'); // 选择热波段
var lst = thermal.expression( // 计算 LST
'(TB / (1 + (0.00115 * (TB / 1.438)) * log(em))) - 273.15',
{
'TB': thermal,
'em': em
}).rename('LST');
return image.addBands(ndvi).addBands(lst).copyProperties(image, ['system:time_start']); // 添加 NDVI 和 LST 波段,并复制时间属性
}
// ----------------- PARTE 3: COLECCIÓN LANDSAT -----------------
// 创建 Landsat 图像集合
var landsatCollection = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2') // 选择 Landsat 8 数据集
.filterBounds(aoi) // 按研究区域过滤
.filterDate(startDate, endDate) // 按时间范围过滤
.map(applyScaleFactors) // 应用缩放因子
.map(cloudMask) // 应用云层掩膜
.map(computeLST); // 计算 NDVI 和 LST
// ----------------- PARTE 4: MEDIANAS PARA MAPA -----------------
// 计算 NDVI 和 LST 的平均值
var meanNdvi = landsatCollection.select('ndvi').mean().clip(aoi); // 计算 NDVI 平均值并裁剪到研究区域
var meanLst = landsatCollection.select('LST').mean().clip(aoi); // 计算 LST 平均值并裁剪到研究区域
// ----------------- PARTE 5: VISUALIZACIÓN EN MAPA -----------------
Map.centerObject(aoi, 10); // 将地图中心定位到研究区域
Map.addLayer(meanNdvi, {min: -1, max: 1, palette: ndviPalette}, 'NDVI 2024'); // 将 NDVI 平均值添加到地图
Map.addLayer(meanLst, {min: 11, max: 55, palette: lstPalette2}, 'LST 2024'); // 将 LST 平均值添加到地图
// ----------------- PARTE 6: SERIES DE TIEMPO -----------------
// ---------------- SERIE ANUAL DE LST (PROMEDIO POR AÑO) ----------------
var years = ee.List.sequence(2014, 2024); // 创建年份列表
// 计算每年 LST 平均值的函数
var annualLST = ee.ImageCollection.fromImages(
years.map(function(year) {
var start = ee.Date.fromYMD(year, 1, 1);
var end = start.advance(1, 'year');
var yearCollection = landsatCollection
.filterDate(start, end)
.select('LST');
var meanImage = yearCollection.mean()
.set('year', year)
.set('system:time_start', start.millis());
return meanImage;
})
);
// Gráfica de LST anual
var annualChartLST = ui.Chart.image.seriesByRegion({
imageCollection: annualLST,
regions: aoi,
reducer: ee.Reducer.mean(),
scale: 30,
xProperty: 'system:time_start'
})
.setChartType('ScatterChart') // <-- IMPORTANTE: cambiar tipo de gráfico
.setOptions({
title: 'LST Annual Average - CDMX (2014-2024)',
lineWidth: 2,
pointSize: 5,
interpolateNulls: true,
vAxis: {title: 'Temperature (°C)'},
hAxis: {
title: 'Año',
format: 'yyyy',
slantedText: false
},
colors: ['#e31a1c'],
trendlines: {
0: {
type: 'linear',
color: 'black',
lineWidth: 2,
opacity: 0.7,
showR2: true, // Muestra el R^2 en la gráfica
visibleInLegend: true
}
}
});
print(annualChartLST);
// --- Calcular regresión lineal y mostrar ecuación de tendencia ---
var lstRegression = ee.FeatureCollection(
annualLST.map(function(image) {
var year = ee.Number(image.get('year'));
var mean = image.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: aoi,
scale: 30,
maxPixels: 1e13
}).get('LST');
return ee.Feature(null, {'year': year, 'LST': mean});
})
);
// Calcular regresión lineal (LST = m*año + b)
var regression = lstRegression.reduceColumns({
reducer: ee.Reducer.linearFit(),
selectors: ['year', 'LST']
});
// Obtener pendiente y ordenada al origen
var slope = regression.get('scale');
var intercept = regression.get('offset');
// Imprimir ecuación en consola
print('Ecuación de la línea de tendencia LST:',
'LST =', slope, '* año +', intercept);
Map.setOptions('SATELLITE');