昨天采用chirps数据对江西省的降水量进行分析,取得了不错的效果,今天我们依葫芦画瓢,试试地表温度数据分析,话不多说,咱们上案例!
1.数据来源说明
modis即中分辨率成像光谱仪,由美国宇航局的aqua和terra卫星携带的仪器。它在36个光谱波段以1~2天间隔捕获地球表面图像。空间分辨率一般有1000m,500m,250m,主要用于中等尺度的地球表面研究,数据可追溯到2000年。
本案例选用的数据为modis的mod11a2产品,它提供 1200 x 1200 公里网格内 8 天平均陆地表面温度 (lst),mod11a2 中的每个像素值都是该 8 天内收集的所有相应 mod11a1 lst 像素的简单平均值。选择 8 天的合成周期是因为该周期是 terra 和 aqua 平台的精确地面轨迹重复周期的两倍。需要注意的是,该卫星数据单位是绝对温度,在进行数据分析时,需要将绝对温度转为摄氏度。
代码调用与数据可视化:
var dataset = ee.imagecollection('modis/061/mod11a2')
.filter(ee.filter.date('2018-01-01', '2018-05-01'));
var landsurfacetemperature = dataset.select('lst_day_1km');
var landsurfacetemperaturevis = {
min: 14000.0,
max: 16000.0,
palette: [
'040274', '040281', '0502a3', '0502b8', '0502ce', '0502e6',
'0602ff', '235cb1', '307ef3', '269db1', '30c8e2', '32d3ef',
'3be285', '3ff38f', '86e26f', '3ae237', 'b5e22e', 'd6e21f',
'fff705', 'ffd611', 'ffb613', 'ff8b13', 'ff6e08', 'ff500d',
'ff0000', 'de0101', 'c21301', 'a71001', '911003'
],
};
map.setcenter(6.746, 46.529, 2);
map.addlayer(
landsurfacetemperature, landsurfacetemperaturevis,
'land surface temperature');
2.应用目标
本案例基于gee平台对modis的lst数据进行分析,以期得到:
(1)2001-2021年江西省地表温度时间序列并分析年内温度趋势变化。
(2)2023年年内江西省地表温度时间序列
(3)分析江西省内某点(25°47′n,114°39′e)在(2018-01-01,2021-01-01)的地表温度月度异常变化。
温度月度异常为某特定年份月份的温度与该月份历年温度平均值之间的差值,差值结果的正负代表该月份的温度与长时间尺度平均温度的偏差程度,进而能够判断该月份温度是否异常。
3.代码实现过程
(1)研究区域加载和数据调用
//load the study area
var roi = ee.featurecollection("users/hesuixinya511/province")
.filtermetadata("name","equals","江西");
map.centerobject(roi,7);
map.addlayer(roi,{"color":"red"},"roi");
//access modis data
var modislstday = ee.imagecollection("modis/061/mod11a2").select("lst_day_1km");
var modislstnight = ee.imagecollection("modis/061/mod11a2").select("lst_night_1km");
此处调用的数据为mod11a2产品的1km格网的白天和夜晚的数据用以进行后文的地表温度时间序列分析。
(2)数据预处理—温度转换
//convert absolute temperature to celsius
var daylst = modislstday.map(function(img){
return img.multiply(0.02).subtract(273.15)
.copyproperties(img,["system:time_start","system:time_end"]);
});
var nightlst = modislstnight.map(function(img){
return img.multiply(0.02).subtract(273.15)
.copyproperties(img,["system:time_start","system:time_end"]);
});
这段代码具体解释如下:
①modislstnight是一个图像集合,代表了一系列modis卫星的夜间地表温度数据。
②map()函数是一个图像集合的方法,用于对集合中的每个图像执行相同的操作。在这里,map()函数将应用于modislstnight中的每个图像。
③function(img){...}是一个匿名函数,它定义了对每个图像执行的操作。
④img.multiply(0.02)将每个图像中的像素值乘以0.02。这是因为modis地表温度数据的像素值需要进行缩放。
⑤.subtract(273.15)将每个图像中的像素值减去273.15。这是因为modis地表温度数据的像素值以开尔文(kelvin)为单位,需要转换为摄氏度。
⑥.copyproperties(img,["system:time_start","system:time_end"])将原始图像的时间属性(system:time_start和system:time_end)复制到新的图像中。这样做是为了保留原始图像的时间信息。
最终,var nightlst是一个新的图像集合,其中包含经过处理后的modis地表温度数据。
modis传感器测量的地表温度值是以千开尔文(k)为单位的,而在实际应用中,我们通常更习惯于使用摄氏度(℃)或华氏度(℉)来表示温度。因此,为了方便数据的使用和理解,需要对modis地表温度数据进行缩放转换。乘以0.2的原因是因为modis地表温度数据使用了一个比例因子(scale factor)为0.02的定标参数。这个定标参数是为了将原始的无量纲辐射亮度值转换为以摄氏度为单位的地表温度值。
(3)时间序列分析
/select time period,longperiod and shortperiod
var longperiodday = ee.imagecollection(daylst.filterdate("2001-01-01","2021-01-01"));
var longperiodnight = ee.imagecollection(nightlst.filterdate("2001-01-01","2021-01-01"));
var shortperiodday = ee.imagecollection(daylst.filterdate("2023-01-01","2023-12-31"));
var shortperiodnight = ee.imagecollection(nightlst.filterdate("2023-01-01","2023-12-31"));
print(longperiodday);
//chart long time series
var ldayseries = ui.chart.image
.series(longperiodday,roi,ee.reducer.median(),1000,"system:time_start")
.setoptions({
title:"lst long time day series",
vaxis:{title:"lst celsius"},
});
print(ldayseries);
var lnightseries = ui.chart.image
.series(longperiodnight,roi,ee.reducer.median(),1000,"system:time_start")
.setoptions({
title:"lst long time night series",
vaxis:{title:"lst celsius"},
});
print(lnightseries);
//chart short time series
var sdayseries = ui.chart.image
.series(shortperiodday,roi,ee.reducer.median(),1000,"system:time_start")
.setoptions({
title:"lst short time day series",
vaxis:{title:"lst celsius"},
});
print(sdayseries);
var snightseries = ui.chart.image
.series(shortperiodnight,roi,ee.reducer.median(),1000,"system:time_start")
.setoptions({
title:"lst short time night series",
vaxis:{title:"lst celsius"},
});
print(snightseries);
此处为研究区域的地表温度时间序列分析,分别采用mod11a2的白天和夜间数据,进行20年的年际变化分析以及2023年的年内地表温度变化状况分析,最后结合代码进行图表的打印和展示。得到的结果如下:
①长时间序列地表温度变化
②短时间序列
(4)温度异常计算与图表可视化
//calculate monthly anomalies at a certain point
var point = ee.geometry.point(114.650556,25.791944);
var means = ee.imagecollection(ee.list.sequence(1,12)
.map(function(m){
return daylst.filter(ee.filter.calendarrange(m,m,"month")).mean().set("month",m);
}));
var start = ee.date("2018-01-01");
var months = ee.list.sequence(0,36);
var dates = months.map(function(index){
return start.advance(index,"month");
});
print(dates);
var bymonth = ee.imagecollection.fromimages(
dates.map(function(date){
var beginning = date;
var end = ee.date(date).advance(1,'month');
var mean =daylst.filterdate(beginning,end).mean().set("date",date);
var month = ee.date(date).getrelative("month","year").add(1);
return mean.subtract(
means.filter(ee.filter.eq("month",month)).first()).set("date",date);
})
);
print(bymonth);;
var chart = ui.chart.image.series({
imagecollection:bymonth,
region:point,
reducer:ee.reducer.mean(),
scale:10,
xproperty:"date"
});
print(chart);
这段代码是用来计算月度异常值的代码,下面是每一行代码的详细解释:
①第2行:定义一个点的几何对象,表示要计算月度异常值的位置。
②第3~6行:创建一个图像集合,其中包含每个月的平均值图像。通过遍历1到12的月份,使用filter函数筛选出每个月的图像,然后计算平均值,并将月份信息存储在图像的属性中。
③第7行:定义起始日期为2018年1月1日。
④第8行:创建一个包含0到36的数字列表,表示要计算的月份数量。
⑤第9~11行:根据起始日期和月份数量,生成一个日期列表。通过遍历月份列表,使用advance函数将起始日期逐月向前推进,生成对应的日期。
⑥第12行:打印日期列表,用于调试和查看结果。
⑦第13~22行:创建一个图像集合,其中包含每个月的异常值图像。通过遍历日期列表,使用filterdate函数筛选出每个月的图像,计算平均值,并与之前计算的每月平均值图像进行相减,得到异常值图像。
⑧第23行:打印异常值图像集合,用于调试和查看结果。
⑨第24~31行:创建一个图表对象,用于可视化异常值时间序列。通过指定异常值图像集合、区域、统计方法、分辨率和x轴属性,生成时间序列图表。
4.案例小结
通过采用modis地表温度数据(lst),能够对特定区域的地表温度进行长时间序列和短时间序列分析,lst在气候变化应用中比较广泛,研究人员结合降雨和气温数据能够实现对气象灾害演变的作用,未来可以尝试进一步深度融合。
发表评论