GEE(Google earth engine)中的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数据导入的全部内容啦~下次的内容是怎么做城市不透水面提取的年度变化!成果是下面这样:

你可能感兴趣的:(javascript,云计算,数据挖掘,大数据)