GEE(Google earth engine)中的Landsat影像的选择和去云(附代码)
关于Landsat影像的导入和去云,这一篇就够了!
1.获取校正过的Landsat 影像
在这里可以看到GEE提供的全部Landsat数据:Landsat Collections in Earth Engine | Earth Engine Data Catalog | Google Developers
随便点进去,比如Landsat8,有三个数据,一个是地表面反射率数据,一个是大气层顶部的反射率数据,一个是raw。大气层顶部的反射数据需要进行大气校正才可以得到地表反照率。而raw数据自带了一个simplecomposite函数可以一步实现大气校正+去云(但亲测效果真的很靠运气,而且不是很好)。所以我推荐直接用地表反射率数据,不必为难自己去做校正,自己去云小问题。
这里有个坑,地表反射率数据每一个波段都是空的!!!!!所以看到显示影像全是白色的时候不要害怕,本来就是这样的。请按照GEE的官方代码,自行套用,这个是Landsat8复制过来的代码:
var dataset = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterDate('2021-05-01', '2021-06-01');
// Applies scaling factors.
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);
}
dataset = dataset.map(applyScaleFactors);
var visualization = {
bands: ['SR_B4', 'SR_B3', 'SR_B2'],
min: 0.0,
max: 0.3,
};
Map.setCenter(-114.2579, 38.9275, 8);
Map.addLayer(dataset, visualization, 'True Color (432)');
上面那个代码是在Terms of use 上面找的。注意!不同的Landsat型号的上面那个代码是有细微差别的!不可以用同一个代码(自己曾经栽坑)!
这里还有一个坑,Landsat5数据在1986后半年才有数据!虽然是1984才发射的!这里极易报错(如果不注意的话)。
数据搞到了,现在开始去云。
2.去云
很多代码直接无脑median()是很有问题的!有一些代码去云还是用mean(),这个更有问题!我下面的方法不一定是最方便的,但是应该是效果最好的。先说两种去云的方式:
(1)使用函数去云。
这是我在csdn经常看到的。怎么说呢......还是看运气。有时候去了和没去一个样,有时候也works.因为相关的文章很多,这里就不贴具体的博文了。
(2)用median()。
这个也是用得很多的。其实原理很直接明了,云的反射率很高,没有云的反射率就比较低,你先用cloud cover筛一遍,再用median也不错。但注意!一定要多多尝试cloud cover的阈值!不然很有可能你得到的结果精度不高,或者存在有些地方云还是没去掉。
我先说为什么可能得到的精度不高。某一个pixel,如果有好几张相片都拍到,如果你监测城市用地的变化,那如果你这个pixel用的是年初的,另外旁边一个Pixel用的是年末的,那么你这一块城市用地到底是什么个情况很难说。所以对于这种应用场景,建议你设置一个时间的range,挑冬天没什么云的时候来搞。如果你想看农用地,那么一年得多大变化啊,所以更应该设置时间range。至于云为什么去不掉就不用多说了,假设你这一块有云的影像超过了半数,那就去不掉。所以建议先一点一点提高cloud cover的阈值,直到他刚好能覆盖完整研究区。
上面这些经验真的我试了好几天!血泪教训!
代码贴出来(你看这个2的阈值肯定就是一点一点去试出来的,同时设置了一下时间):
// Applies scaling factors for landsat 8.
function applyScaleFactors8(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);
}
var landsat8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterBounds(roi)
.filterDate('2022-04-01', '2022-12-30')
.map(applyScaleFactors8)
.filter(ee.Filter.lt('CLOUD_COVER',2))
.median();
我师姐和我说,最好不要像这样一句代码写这么长,这样debug的时候就比较费劲(不管了)。可以这样去debug,你复制https://code.earthengine.google.com/这个网址,打开一个新的网页粘贴上去,就开了一个新窗口,然后就可以快乐debug目标代码啦~代码里面的filter就不解释了,总之就是用3个filter去限制时间和空间和云量。
以上就是Landsat数据导入的全部内容啦~下次的内容是怎么做城市不透水面提取的年度变化!成果是下面这样:
更多推荐
所有评论(0)