Google Earth Engine 下载遥感影像——以Landsat 8数据为例

目录

1、Google Earth Engine(GEE)简介

1.1 开发环境

1.2 说明书

 2、GEE账号注册

3、GEE 查询库内卫星影像以及调用

3.1 数据集Datasets

3.2 加载影像

3.2.1 绘制感兴趣区

3.2.2 加载landsat 8数据集 

 3.3 影像的预处理

3.3.1 剔云处理

3.3.2 影像裁切

 4、GEE影像上传和导出

4.1 上传本地文件

4.2 在GEE上导出影像数据

 5、GEE共享以及全套代码


1、Google Earth Engine(GEE)简介

        遥感大数据云计算服务平台为区域或全球土地利用空间信息的获取提供了新的途径和方法。GEE 云平台是一款专门用于处理卫星影像数据和其他地球观测数据的云端运算平台,不但存储了完整的对地观测卫星影像数据,以及环境和社会经济等数据,还提供足够的运算能力对这些数据进行处理,成为解决遥感数据收集困难和处理效率低下问题的新途径。

官方网址https://earthengine.google.com/

1.1 开发环境

 在Guides中介绍了该云计算平台是由JS开发的共同Python语言。所以有这方面基础的读者可是说非常容易上手。在开发环境(Development Environment)中提到,一般有两种方式进行编译:1中是使用平台自带的(如下图)Code Editor网页版,另一种是通过搭建Python环境在本地进行编译。

1.2 说明书

 安利这个平台强烈的第一个原因就是它真的把说明书做的非常出色!

查看说明书的方式:官方网址右上角菜单栏Platform->Documentation->Reference. 即可。

非常的清晰,并且语法,示例一气呵成,更是有 吴秋生老师的视频讲解

第二个原因就是该平台的功能强大性,这个后续会做详细说明。


 2、GEE账号注册

        由于GEE是谷歌公司开发的一款云端计算平台,访问该网站需要科学上网才行。当你注册的时候,如果即使在科学上网的情况下遇到了无法接收到国内手机短信的情况,可以通过某宝来解决(别问我为什么知道)。申请完之后一般需要等官网发邮件通知,1-3天左右,这里强烈建立使用学校邮箱或者企业邮箱注册!!!

3、GEE 查询库内卫星影像以及调用

3.1 数据集Datasets

查看数据集的方式:官方网址右上角菜单栏Datasets.这里我们直接查看Landsat数据集。

这里我们可以看到Landsat数据集来源于USGS,被分为了Collection2 和 Collection1两种产品的数据集,Collection1产品是2016年建立的,现在被Collection2所取代。我们知道USGS将产品分为了3类:①T1:满足几何和辐射质量要求的数据;②T2:不符合T1级别要求的数据;③RT:实时数据,尚未评估的数据(最多需要一个月)。

这里我们点进Landsat8 Surface Reflectance(SR) T1产品进行查看。

 里面由详细的数据产品描述,波段组成,图像属性等等,“ee.ImageCollection("LANDSAT/LC08/C02/T1_L2")”是导入加载影像所需要的关键代码。即这里用到的是“ee.ImageCollection()”这个API函数。如果还不够直观,下面还提供了示例,可供查看。

3.2 加载影像

这里将在“Earth Engine Code Editor”中实现。

3.2.1 绘制感兴趣区

方法一:直接在地图上绘制想要的感兴趣区多边形;

方法二:先通过4.1节的方法上传已有的矢量边界,然后通过如下代码调用:

var collectionName = 'users/city/Nanjing';
var roi = ee.FeatureCollection(collectionName);

 接着导入roi使之显示在地图上,代码如下:

//在地图中心显示感兴趣区roi以及缩放
Map.centerObject(roi, 7);  
//添加一个显示roi的图层并设置参数
Map.addLayer(roi, {color: "red"}, "roi");

 点击 "RUN",运行完之后如下图:

3.2.2 加载landsat 8数据集 

代码如下,以及运行后的结果:

//选择要导出的数据类型
var dataset = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')  //选择数据集
                .filterBounds(roi) //区域筛选
                .filterDate('2021-06-01', '2021-10-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,
};

//添加一个新的显示Landsat8影像的图层
Map.addLayer(dataset, visualization, 'Landsat8');

 3.3 影像的预处理

3.3.1 剔云处理

        可以看到符合该时间段的影像已经被调用并且加载在地图上。但是云量还是没有设定,所以下一步我们将进行剔云处理。核心代码如下:

//去云处理 
function maskL8sr(image) {
  var cloudShadowBitMask = (1 << 3);
  var cloudsBitMask = (1 << 5);
  var qa = image.select('QA_PIXEL');    //注意:Collection2产品中将“pixel_qa”改为“QA_PIXEL”
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
                 .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  return image.updateMask(mask);
}
剔云后,云量控制在了可用范围以内

3.3.2 影像裁切

我们可以发现影像超出研究区所在范围,这里我们实现在地图上完成对影像的裁切,代码如下:

//对影像进行裁切
var l8Img = dataset.mosaic().clip(roi); 


 4、GEE影像上传和导出

4.1 上传本地文件

        要上传和管理地理空间数据集,需要使用代码编辑器中的资产管理器(Assets)。资产管理器位于代码编辑器左侧的资产选项卡上。

点击 “NEW” 图标,我们可以看到如图所示的选项,有栅格类型(.tiff)、矢量类型(.shp)和表格类型(.csv)等.        这里我将本地的 “Nanjing”矢量边界文件上传到GEE当中。

这里需要注意的是,

.shp文件是主文件,存储空间对象的坐标点信息,比如构成点、线、面对象的坐标点序列。

.dbf文件存储空间对象对应的属性表信息,比如一个面对象可能有名称、编码、面积等,这些信息都保存在dbf文件中。这个文件可以用excel单独打开。

.prj文件存储空间坐标系统,指明了shp文件包含的坐标点是在哪个坐标系下的。这个文件是个普通的文本文件,可以用记事本打开。

.shx文件存储索引信息,指明空间对象的隶属关系。

以上四个文件是打开shp主文件所必须的(如果没有prj文件,但此时缺乏地理坐标系统,是不完整的,在GEE上导入会报错),它们共同构成一个完整的shp文件系统,不要丢失。

        

上传成功后,在刷新左侧的菜单栏,可以看到刚刚上传的Nanjing矢量文件,单击进入details界面,可以看到其存放的位置同时也是调用的代码。 


4.2 在GEE上导出影像数据

最后,我们将所选择的遥感数据导出,代码如下:

//导出L8影像  Landsat8 all bands loop to Drive
var bands = l8Img.bandNames().getInfo();

for (var i=0; i<l8Img.bandNames().size().getInfo();i++){
  print(bands[i]);

  Export.image.toDrive({
    image: l8Img.select(bands[i]),        //设置要输出的影像
    fileNamePrefix: "Landsat8_"+bands[i], 
    //folder: "training01",               //设置下载影像在Drive中存储的文件夹名称(可不设置)
    scale:30,    //空间分辨率,单位:米
    description: "Landsat8_"+bands[i],    // 设置下载任务tasks的名称
    maxPixels:1e13,                       //单幅影像输出的最大像元数
    region:roi.geometry().bounds()        //要下载影像的范围
  });
}

         然后我们将影像上传到云端计算机ToDrive,等待上传完成之后即可在云端计算机内下载对应影像,可以根据自己所需要的波段进行下载,很灵活,但是上传到云端的速度其实挺慢的。


 5、GEE共享以及全套代码

 GEE的在线编译器提供共享功能,复制网址即可自动加载页面内的代码,非常实用!

 分享网址:https://code.earthengine.google.com/b0ec40c02823eb3048d0dab9fac60090

//设置感兴趣区域roi
var roi = ee.FeatureCollection("users/knight20211211022/Nanjing");

//定义导出影像数据函数,三个参数
function exportImage(image, region, fileName) { 
  Export.image.toDrive({  
      image: image,  //设置要输出的影像
      description: "Drive-"+fileName,  // 设置下载任务tasks的名称
      fileNamePrefix: fileName,  //设置下载影像的名称
      //folder: "training01",  //设置下载影像在Drive中存储的文件夹名称(可不设置)
      scale: 30, //空间分辨率,单位:米
      region: region,  //要下载影像的范围
      maxPixels: 1e13, //单幅影像输出的最大像元数
      fileFormat:"GeoTIFF", //设置影像导出格式,注意GeoTIFF格式需要所有波段存储类型一致(如不能同时存Int16和Int32)
      crs: "EPSG:4326"  //投影信息,一般是采用默认方式,通常可以设置为EPSG:4326
  }); 
}

//去云处理 
function maskL8sr(image) {
  var cloudShadowBitMask = (1 << 3);
  var cloudsBitMask = (1 << 5);
  var qa = image.select('QA_PIXEL');
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
                 .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  return image.updateMask(mask);
}

// 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);
}

//选择要导出的数据类型
var dataset = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')  //选择数据集
                .filterBounds(roi) //区域筛选
                .filterDate('2021-06-01', '2021-10-01');  //时间筛选


dataset = dataset.map(applyScaleFactors);
dataset = dataset.map(maskL8sr);

//对影像进行裁切
var l8Img = dataset.mosaic().clip(roi); 

//导出L8影像  Landsat8 all bands loop to Drive
var bands = l8Img.bandNames().getInfo();

for (var i=0; i<l8Img.bandNames().size().getInfo();i++){
  print(bands[i]);

  Export.image.toDrive({
    image: l8Img.select(bands[i]),        //设置要输出的影像
    fileNamePrefix: "Landsat8_"+bands[i], 
    //folder: "training01",               //设置下载影像在Drive中存储的文件夹名称(可不设置)
    scale:30,    //空间分辨率,单位:米
    description: "Landsat8_"+bands[i],    // 设置下载任务tasks的名称
    maxPixels:1e13,                       //单幅影像输出的最大像元数
    region:roi.geometry().bounds()        //要下载影像的范围
  });
}

//可视化参数设置
var visualization = {
  bands: ['SR_B4', 'SR_B3', 'SR_B2'],
  min: 0.0,
  max: 0.3,
  gamma:1.4,
};

//添加一个新的显示Landsat8影像的图层
Map.addLayer(l8Img, visualization, 'Landsat8');

//在地图中心显示感兴趣区roi以及缩放
Map.centerObject(roi, 9);  
//添加一个显示roi的图层并设置参数
Map.addLayer(roi, {color: "red"}, "roi");

 OVER!

        最后想说一句,其实 在进行landsat 8 影像数据预处理的时候就可以发现,GEE的一个强大之处在于其可以很方便的自动获取遥感影像,并且直接在上面进行处理和分析。如果只是用作下载影像的话可以说是有点大材小用的了。我们大可直接在平台上进行波段运算,数据研究,分类制图等一系列的操作。笔者也才接触GEE不久,仍在学习中~  吴秋生老师做了很详细的视频介绍,真的很有用!

 

来源:Knight_076

物联沃分享整理
物联沃-IOTWORD物联网 » Google Earth Engine 下载遥感影像——以Landsat 8数据为例

发表评论