这段代码的主要功能是利用Google Earth Engine(GEE)平台,分析地区的地表温度(LST)数据,并计算城市热岛(SUHI)效应。以下是代码的主要功能和实现逻辑:
数据集
- MODIS/061/MCD12Q1:提供全球土地覆盖类型数据,时间跨度为2001年至2020年。该数据集基于国际地球-生物圈计划(IGBP)、马里兰大学(UMD)等分类方案,提供多种土地覆盖类型。
- MODIS/061/MOD11A2:提供8天平均地表温度(LST)数据,空间分辨率为1公里。该数据集包含白天和夜间的LST数据,并提供质量控制指标。
功能实现
-
区域设置:
- 定义了两个区域:
aoi
(分析区域)和g_urban
(城市区域)。aoi
用于整个分析区域,g_urban
用于城市区域的分析。
- 定义了两个区域:
-
时间范围:
- 分析的时间范围为2014年1月1日至2024年12月31日。
-
土地覆盖数据:
- 使用
MODIS/061/MCD12Q1
数据集,选择LC_Type1
波段,获取土地覆盖类型。
- 使用
-
地表温度数据:
- 使用
MODIS/061/MOD11A2
数据集,选择LST_Day_1km
和LST_Night_1km
波段,分别获取白天和夜间的地表温度。 - 将温度单位从开尔文转换为摄氏度。
- 使用
-
年度平均计算:
- 定义了一个函数
annualMeanLST
,用于计算每个年份的平均地表温度。 - 对白天和夜间的地表温度分别计算年度平均值。
- 定义了一个函数
-
时间序列分析:
- 利用
ui.Chart.image.series
函数,绘制了2014年至2024年期间,白天和夜间地表温度的年度平均值的时间序列图。 - 同时,生成了表格形式的数据,便于查看每年的具体数值。
- 利用
-
城市与乡村对比:
- 对比了城市区域(
g_urban
)和乡村区域(g_cs
)的白天和夜间地表温度。 - 绘制了城市和乡村区域的年度平均温度对比图。
- 对比了城市区域(
-
城市热岛(SUHI)效应:
- 计算了城市区域与乡村区域之间的地表温度差异(SUHI),分别计算了白天和夜间的SUHI。
- 绘制了年度SUHI的时间序列图,并计算了2014年至2024年期间SUHI的平均值。
输出结果
- 地图可视化:在GEE平台上,将分析区域(
aoi
)和城市区域(g_urban
)显示在地图上。 - 时间序列图:展示了2014年至2024年期间,白天和夜间地表温度的年度平均值,以及城市与乡村区域的对比。
- SUHI分析:展示了城市热岛效应的年度变化,并计算了平均SUHI值。
总结
这段代码利用GEE平台,结合MODIS地表温度和土地覆盖数据,对墨西哥城地区的地表温度进行了详细的分析,并计算了城市热岛效应。通过年度平均温度的时间序列分析和城市与乡村区域的对比,可以更好地理解城市化对地表温度的影响。
全部代码
var aoi =
/* color: #d63000 */
/* shown: false */
/* displayProperties: [
{
"type": "rectangle"
}
] */
ee.Geometry.Polygon(
[[[-9.3603515625, 38.91703381047962],
[-9.3603515625, 38.436734248948085],
[-8.8330078125, 38.436734248948085],
[-8.8330078125, 38.91703381047962]]], null, false),
g_urban =
/* color: #98ff00 */
/* displayProperties: [
{
"type": "rectangle"
}
] */
ee.Geometry.Polygon(
[[[-8.90991210937524, 38.74323841549712],
[-8.90991210937524, 38.6982376351335],
[-8.848114013672115, 38.6982376351335],
[-8.848114013672115, 38.74323841549712]]], null, false);Map.addLayer(aoi, {}, 'AOI - CDMX');
//Map.addLayer(g_cs, {}, 'g_cs - CDMX');
Map.addLayer(g_urban, {}, 'g_urban - CDMX');
Map.centerObject(aoi, 10);
// ----------------- PARTE 1: CONFIGURACIÓN -----------------
var startDate = '2014-01-01';
var endDate = '2024-12-31';
var lstPalette = [
'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 -----------------
// ----------------- MODIS LAND COVER DATA -----------------
var modisLandCover = ee.ImageCollection("MODIS/061/MCD12Q1")
.mode()
.select('LC_Type1');
// 4. Visualize Land Cover Data
var landCoverVisualization = {
min: 11.0,
max: 55.0,
palette: lstPalette ,
};
// Función para agregar por año
function annualMeanLST(collection) {
return ee.ImageCollection(
ee.List.sequence(2014, 2024).map(function(year) {
var start = ee.Date.fromYMD(year, 1, 1);
var end = start.advance(1, 'year');
var meanImage = collection
.filterDate(start, end)
.mean()
.set('year', year)
.set('system:time_start', start.millis()); // Para que el eje X funcione
return meanImage;
})
);
}
var lstDay = ee.ImageCollection("MODIS/061/MOD11A2")
.select('LST_Day_1km')
.filterDate(startDate, endDate)
.map(function(image) {
return image.multiply(0.02).subtract(273.15)
.copyProperties(image, image.propertyNames());
});
var lstNight = ee.ImageCollection("MODIS/061/MOD11A2")
.select('LST_Night_1km')
.filterDate(startDate, endDate)
.map(function(image) {
return image.multiply(0.02).subtract(273.15)
.copyProperties(image, image.propertyNames());
});
var lstDayAnnual = annualMeanLST(lstDay);
var lstNightAnnual = annualMeanLST(lstNight);
// ----------------- PARTE 3: SERIES DE TIEMPO -----------------
// Gráfica para LST Diurna (promedio anual)
print(
ui.Chart.image.series({
imageCollection: lstDayAnnual,
region: aoi,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
}).setOptions({
title: 'Average Annual Daytime LST in Mexico City (2014–2024)',
hAxis: {title: 'Year', format: 'yyyy'},
vAxis: {title: 'Temperature (°C)'},
lineWidth: 2,
pointSize: 4,
colors: ['#d6662c']
})
);
//
var lstDayTable = ui.Chart.image.series({
imageCollection: lstDayAnnual,
region: aoi,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
}).setChartType('Table')
.setOptions({
title: 'Valores de LST Diurna por Año',
hAxis: {title: 'Year'},
vAxis: {title: 'Temperatura (°C)'}
});
print(lstDayTable);
//
// Gráfica para LST Nocturna (promedio anual)
print(
ui.Chart.image.series({
imageCollection: lstNightAnnual,
region: aoi,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
}).setOptions({
title: 'Average Annual Nighttime LST in Mexico City(2014–2024)',
hAxis: {title: 'Year', format: 'yyyy'},
vAxis: {title: 'Temperature (°C)'},
lineWidth: 2,
pointSize: 4,
colors: ['#191970']
})
);
/
var lstNightTable = ui.Chart.image.series({
imageCollection: lstNightAnnual,
region: aoi,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
}).setChartType('Table')
.setOptions({
title: 'Valores de LST Diurna por Año',
hAxis: {title: 'Año'},
vAxis: {title: 'Temperatura (°C)'}
});
print(lstNightTable);
/ PARTE 4.- graficas urban zone and countryside ///
// Gráfica para LST Diurna (promedio anual)
print(
ui.Chart.image.series({
imageCollection: lstDayAnnual,
region: g_urban,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
}).setOptions({
title: 'Average Annual Daytime LST (g_urban) in Mexico City (2014–2024)',
hAxis: {title: 'Year', format: 'yyyy'},
vAxis: {title: 'Temperature (°C)'},
lineWidth: 2,
pointSize: 4,
colors: ['#e31a1c']
})
);
print(
ui.Chart.image.series({
imageCollection: lstDayAnnual,
region: g_cs,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
}).setOptions({
title: 'Average Annual Daytime LST (g_cs) in Mexico City (2014–2024)',
hAxis: {title: 'Year', format: 'yyyy'},
vAxis: {title: 'Temperature (°C)'},
lineWidth: 2,
pointSize: 4,
colors: ['#191970']
})
);
GRAFICA SUHI EARLY/
//
// Gráfica para LST Nocturna (promedio anual)
print(
ui.Chart.image.series({
imageCollection: lstNightAnnual,
region: g_urban,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
}).setOptions({
title: 'Average Annual Nighttime LST(g_urban) in Mexico City(2014–2024)',
hAxis: {title: 'Year', format: 'yyyy'},
vAxis: {title: 'Temperature (°C)'},
lineWidth: 2,
pointSize: 4,
colors: ['#e31a1c']
})
);
print(
ui.Chart.image.series({
imageCollection: lstNightAnnual,
region: g_cs,
reducer: ee.Reducer.mean(),
scale: 500,
xProperty: 'system:time_start'
}).setOptions({
title: 'Average Annual Nighttime LST(g_cs) in Mexico City(2014–2024)',
hAxis: {title: 'Year', format: 'yyyy'},
vAxis: {title: 'Temperature (°C)'},
lineWidth: 2,
pointSize: 4,
colors: ['#191970']
})
);
/ PARTE 5.- graficas merge urban zone and countryside ///
// Extraer geometría si son FeatureCollections
var g_cs_geom = g_cs.geometry();
var g_urban_geom = g_urban.geometry();
// Crear FeatureCollection con etiquetas
var regionsList = ee.FeatureCollection([
ee.Feature(g_cs_geom, {'label': 'Countryside'}),
ee.Feature(g_urban_geom, {'label': 'Urban'})
]);
// Gráfica combinada para regiones
var annualChartLST_day = ui.Chart.image.seriesByRegion({
imageCollection: lstDayAnnual,
regions: regionsList,
reducer: ee.Reducer.mean(),
scale: 30,
xProperty: 'system:time_start',
seriesProperty: 'label'
})
.setChartType('ScatterChart')
.setOptions({
title: 'Comparison between the annual daytime average of urban and rural LST - CDMX (2014-2024)',
lineWidth: 2,
pointSize: 5,
interpolateNulls: true,
vAxis: {title: 'Temperature (°C)'},
hAxis: {
title: 'Year',
format: 'yyyy'
},
colors: ['#1f78b4', '#e31a1c']
});
print(annualChartLST_day);
/// Night Graph
// Gráfica combinada para regiones
var annualChartLST_night = ui.Chart.image.seriesByRegion({
imageCollection: lstNightAnnual,
regions: regionsList,
reducer: ee.Reducer.mean(),
scale: 30,
xProperty: 'system:time_start',
seriesProperty: 'label'
})
.setChartType('ScatterChart')
.setOptions({
title: 'Comparison between the annual nighttime average of urban and rural LST - CDMX (2014-2024)',
lineWidth: 2,
pointSize: 5,
interpolateNulls: true,
vAxis: {title: 'Temperature (°C)'},
hAxis: {
title: 'Year',
format: 'yyyy'
},
colors: ['#1f78b4', '#e31a1c']
});
print(annualChartLST_night);
// Función para crear una FeatureCollection con SUHI diurno y nocturno
var suhiYearly = ee.FeatureCollection(
ee.List.sequence(2014, 2024).map(function(year) {
var date = ee.Date.fromYMD(year, 1, 1);
var dayImage = lstDayAnnual.filter(ee.Filter.eq('year', year)).first();
var nightImage = lstNightAnnual.filter(ee.Filter.eq('year', year)).first();
// Reducir a promedios por región
var urbanDay = dayImage.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: g_urban,
scale: 1000,
maxPixels: 1e13
}).get('LST_Day_1km'); // Banda renombrada
var ruralDay = dayImage.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: g_cs,
scale: 1000,
maxPixels: 1e13
}).get('LST_Day_1km');
var urbanNight = nightImage.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: g_urban,
scale: 1000,
maxPixels: 1e13
}).get('LST_Night_1km');
var ruralNight = nightImage.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: g_cs,
scale: 1000,
maxPixels: 1e13
}).get('LST_Night_1km');
// Calcular SUHI
var suhi_day = ee.Number(urbanDay).subtract(ee.Number(ruralDay));
var suhi_night = ee.Number(urbanNight).subtract(ee.Number(ruralNight));
return ee.Feature(null, {
'year': year,
'system:time_start': date.millis(),
'SUHI_Day': suhi_day,
'SUHI_Night': suhi_night
});
})
);
var suhiChart = ui.Chart.feature.byFeature({
features: suhiYearly,
xProperty: 'system:time_start',
yProperties: ['SUHI_Day', 'SUHI_Night']
}).setOptions({
title: 'Annual SUHI (Day vs Night) - CDMX (2014–2024)',
hAxis: {title: 'Year', format: 'yyyy'},
vAxis: {title: 'SUHI (°C)'},
lineWidth: 2,
pointSize: 5,
colors: ['#e31a1c', '#1f78b4'], // Rojo para día, azul para noche
legend: {position: 'bottom'}
});
print(suhiChart);
// Calcular el promedio de todos los años para SUHI Día y Noche
var suhi_day_mean = suhiYearly.aggregate_mean('SUHI_Day');
var suhi_night_mean = suhiYearly.aggregate_mean('SUHI_Night');
// Evaluar e imprimir
ee.Dictionary({
'Promedio SUHI Día (°C)': suhi_day_mean,
'Promedio SUHI Noche (°C)': suhi_night_mean
}).evaluate(function(dict) {
print('📊 Promedio SUHI (2014–2024):');
print('SUHI Día promedio:', dict['Promedio SUHI Día (°C)'].toFixed(2), '°C');
print('SUHI Noche promedio:', dict['Promedio SUHI Noche (°C)'].toFixed(2), '°C');
});
// Imprimir SUHI año por año
suhiYearly.evaluate(function(fc) {
print('🟡 SUHI (°C) por año:');
fc.features.forEach(function(f) {
var year = f.properties.year;
var suhi_day = f.properties.SUHI_Day;
var suhi_night = f.properties.SUHI_Night;
print('year ' + year + ': SUHI Day = ' + suhi_day.toFixed(2) + ' °C, SUHI Night = ' + suhi_night.toFixed(2) + ' °C');
});
});