本文介绍在谷歌地球引擎(Google Earth Engine,GEE)中,批量下载指定时间范围、空间范围的遥感影像数据(包括Landsat、Sentinel等)的方法。
本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第21
篇,更多GEE文章请参考专栏:GEE学习与应用。
我们之前多次介绍过基于官方网站或者GEE平台,对常见遥感影像数据产品加以下载的方法。但是,我们还一直没有介绍在GEE中,不加任何其他复杂的二次筛选与计算需求,而是直接下载指定时间范围与空间范围的遥感影像数据的最简单方法;那么在这里,我们就介绍一下这个最简单、原始的下载方法。
当然,这里需要提一句:GEE下载遥感影像除了需要网络可以出国外,还有一个约束条件,就是Google Drive的大小——如果大家需要下载的遥感影像超过了自己的Google Drive大小(一般普通的账号,这个大小就是15 G
),那么就得手动分批次下载,即每一次下载部分数据后,就清空一下Google Drive,然后再继续下载。
首先,本文用到的代码如下。这个代码下载的是2019
年里,在四川省黄龙附近某个区域的所有哨兵2号遥感影像数据;大家可以先看代码,然后结合自己的实际需求,对这个代码加以修改,从而下载自己所需的遥感影像数据。
var batch = require('users/fitoprincipe/geetools:batch');
var lon3 = 104.0111;
var lat3 = 32.8925;
var lon4 = 104.0883;
var lat4 = 33.0061;
var rectangle_small = ee.Geometry.Rectangle([lon3, lat3, lon4, lat4]);
var lon1 = 103.9500;
var lat1 = 32.8154;
var lon2 = 104.1920;
var lat2 = 33.0460;
var rectangle = ee.Geometry.Rectangle([lon1, lat1, lon2, lat2]);
var startDate = '2019-01-01';
var endDate = '2020-01-01';
var collection = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterBounds(rectangle_small)
.filterDate(startDate, endDate)
.select(["B2", "B3", "B4", "B5", "B6", "B7", "B8", "B8A"])
.map(function(image) {
return image.clip(rectangle);
});
Map.addLayer(rectangle, {}, 'Bounding Box');
Map.addLayer(collection, {}, "Images");
var options = {
// name: '{system_date}',
// dateFormat: 'yyyy-MM-dd',
scale: 10,
maxPixels: 10000000000000,
region: rectangle
};
batch.Download.ImageCollection.toDrive(collection, "Sentinel", options)
代码具体含义如下。
首先,var batch = require('users/fitoprincipe/geetools:batch');
这句代码导入了GEE中一位个人作者所写的批处理工具库,用于进行批量下载操作。关于这一点,大家参考文章Google Earth Engine谷歌地球引擎ImageCollection数据下载即可。
其次,我们定义了两个矩形几何体rectangle_small
和rectangle
。这些几何体定义了我这里感兴趣区域的范围,其中 rectangle_small
是较小的矩形范围,用于过滤Sentinel-2影像集合,而rectangle
是较大的矩形范围,用于裁剪图像。换句话说,我这里的需求是,获取所有落入到rectangle_small
这个较小的矩形范围的遥感影像,然后对于这些遥感影像,将他们再按照rectangle
这个较大的矩形范围加以裁剪;最后下载的就是落入rectangle_small
区域的、按照rectangle
区域裁剪后的遥感影像。
随后,我们定义了起始日期和结束日期startDate
和endDate
。这些日期用于在时间范围内过滤Sentinel-2影像集合。
接下来,我们使用ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
获取Sentinel-2影像集合;如果大家这里需要其他的遥感影像产品,就修改其产品名称即可。接着,使用filterBounds()
函数根据rectangle_small
过滤图像集合,然后使用filterDate()
函数根据日期范围过滤图像集合。
其次,使用select()
函数选择特定的波段。在这里,我是选择了影像中的B2
、B3
、B4
、B5
、B6
、B7
、B8
和B8A
波段;这里大家需要什么波段,就对照着数据产品在GEE官网中的介绍,按照需求选择波段即可。随后,使用map()
函数对图像集合中的每个影像应用clip()
函数,以裁剪图像为rectangle
范围内的区域。
接下来,可以使用Map.addLayer()
将rectangle
添加到地图中作为边界框的可视化;可以使用Map.addLayer()
将图像集合collection
添加到地图中进行可视化。这里的可视化只是为了确认我们所选择研究区域是没有问题的,如下图所示;所以这里的代码大家想要就要,不想要就注释掉。
最后,我们定义了下载选项options
,包括输出文件的比例尺、最大像素数和下载区域。并使用batch.Download.ImageCollection.toDrive()
函数将图像集合collection
下载到Google Drive中,以Sentinel
作为文件夹的名称。关于这一点,大家参考文章Google Earth Engine谷歌地球引擎ImageCollection数据下载即可。
执行上述代码,即可在Tasks中看到生成的任务列表,每一个任务就是每一景遥感影像的下载。
运行上述任务后,遥感影像将出现在Google Drive中的指定文件夹内,如下图所示。
然后,大家再将Google Drive中的遥感影像文件下载到本地即可。
至此,大功告成。