c语言sscanf函数的用法是什么
317
2022-09-25
遥感云计算反演地表温度以及时序插值
这是一篇关于基于Google Earth Engine遥感云计算平台反演地表生态参数的文章,希望能够通过这篇文章对大家有所帮助。
什么是Google Earth Engine
Google Earth Engine是一个集科学分析和地理信息数据可视化的综合性平台,能够在线处理遥感影像,帮助方便查看、计算、处理、分析大范围的各种影像等GIS数据。其优点在于非商业用户免费使用、基础数据量大、后台处理运算能力强、具有比较完整的生态开发环境。
什么是地表温度
城市热岛效应是目前全球城市环境面临的巨大问题,热岛效应的产生不仅会对自然环境产生影响,也会影响城市居民的生活水平,地表温度(LST)是表达全球以及区域气候情况的重要参数之一,可以用于表征热岛效应。它通过改变地面与大气间的物质能量平衡,引起气温、降水与植被等时空格局发生连锁反应进而对区域生态环境演变产生重要影响。目前基于遥感数据的地表温度研究已取得丰富成果且应用广泛。
1.LST计算方法
针对高分辨率的LandSat影像,我们可以通过卫星波段反演的方式来进行计算,目前比较常用的算法就是单窗(SWM)算法,单窗算法的优势在于需要的参数较少,一般我们只需要地表比辐射率、大气总透过率、水汽含量这三个参数,比辐射率可通过NDVI进行反演,水体我们可以根据水体指数进行分析计算。下面我们以单期LandSat影像为例,运用GEE云计算平台反演其地表温度。
1.1主函数代码如下
首先是选择感兴趣区域、时间、和卫星型号,我们以2022年6月19日的LandSat 8影像为例
var roi = ee.FeatureCollection("users/folder/shp"); var satellite = 'L8'; var date_start = '2022-06-18'; var date_end = '2022-06-20'; var use_ndvi = true;
运用NDVI计算并显示
var LandsatColl = LandsatLST.collection(satellite, date_start, date_end, roi, use_ndvi); print(LandsatColl); var cmap1 = ['blue', 'cyan', 'green', 'yellow', 'red']; var cmap2 = ['F2F2F2','EFC2B3','ECB176','E9BD3A','E6E600','63C600','00A600']; Map.centerObject(roi,8); Map.addLayer(exImage.select('LST'),{min:290, max:320, palette:cmap1}, 'LST'); Map.addLayer(roi, {color: "white"}, "roi"); var exImage_clip =exImage.qualityMosaic('LST').clip(roi); print("exImage_clip",exImage_clip);
导出数据
Export.image.toDrive({ image: exImage_clip.select('LST'), description: 'LST20220619', folder:'LST', scale: 30, region: roi, fileFormat: 'GeoTIFF', });
2.时序插值
在运用Landsat计算过程中我们会发现存在大量空洞,这是由于LandSat本身的波段信息缺失,导致的计算结果信息缺失,这是我们可以通过时序插值的方式来对空缺的数据进行填补。
使用线性内插的方法对时序影像中的部分缺失数据依据其时间前后的光谱信息对其插值,其中计算影像的顺序也是按照时间顺序进行排列,第一张影像为最早时期的影像,每张影像至少有两个波段,除待插值波段外,应有一个时间波段,为整数类型,代表该影像所处的时间,单位可由自己确定,一个影像集内所有影像需要统一时间单位,该波段应在影像全范围内非NULL,且不可位于影像的第一个波段的位置。 此外每张影像需要保证有一个“system:time_start”的属性,其会传递至插值后的影像,以方便前后对应。timeBandNames 字符串类型,其代表第一个参数imgcoll中影像的时间波段的波段名称。imgcoll_Interpol插值后的结果与imgcoll的影像顺序是保持一致的。
####主要代码如下:
function Interpol(imgcoll, timeBandName) { // length var colsize = imgcoll.size(); var bandNames = imgcoll.first().bandNames(); // make sure first and last NonNull var firstImg = imgcoll.reduce(ee.Reducer.firstNonNull()).rename(bandNames); // yuan var lastImg = imgcoll.reduce(ee.Reducer.lastNonNull()).rename(bandNames); // jin var imgList = imgcoll.toList(colsize); // reset imglist var B = imgList.slice(1,-1); var A = ee.Image(imgList.get(0)); var C = ee.Image(imgList.get(-1)); firstImg = firstImg.set({'system:time_start':A.get('system:time_start')}); // .set({'user:index':A.get('user:index')}); lastImg = lastImg.set({'system:time_start':C.get('system:time_start')}); // .set({'user:index':C.get('user:index')}); var D = B.insert(0, firstImg).add(lastImg); var D_imgcol = ee.ImageCollection(D); // mask imgcol var imgcollmask = imgcoll.map(function(img) { img = img.updateMask(img.select(0).mask()); return img; }); var D_mask = imgcollmask.toList(colsize); var maskBandNames = imgcollmask.first().bandNames(); // interpol var imgcoll_List_Interpol = ee.List.sequence(1, colsize.subtract(2)).map(function(i) { i = ee.Number(i); var pre= ee.ImageCollection(D_mask.slice(0,i.add(1))).reduce(ee.Reducer.lastNonNull()); var cur= D.get(i); var next=ee.ImageCollection(D_mask.slice(i,-1)).reduce(ee.Reducer.firstNonNull()); pre=ee.Image(pre).rename(maskBandNames); cur=ee.Image(cur).rename(bandNames); // next=ee.Image(next).rename(maskBandNames); var DOY_pre = pre.select(timeBandName); var DOY_cur = cur.select(timeBandName); var DOY_next= next.select(timeBandName); var cur_date = cur.get('system:time_start'); var interpol = pre.add(next.subtract(pre).multiply(DOY_cur.subtract(DOY_pre).divide(DOY_next.subtract(DOY_pre)))) .set({'system:time_start':cur_date}); return interpol; }); // insert first and last img var imgcoll_Interpol = ee.ImageCollection(imgcoll_List_Interpol.insert(0,firstImg).add(lastImg)); return imgcoll_Interpol; } exports = {Interpol:Interpol}
分享就到这里,如果有好的改进建议欢迎评论!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~