最近问如何批量导出集合的小伙伴非常多,一个一个回复太麻烦,我这里直接给一段例子代码吧:
-
var l8 = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR");
-
var roi = /* color: #d63000 */ee.Geometry.Polygon(
-
[[[115.64960937499995, 39.112756306811285],
-
[116.28681640624995, 39.163883889810315],
-
[116.21540527343745, 39.58850167846649],
-
[115.70454101562495, 39.6054326422912]]]);
-
Map.centerObject(roi, 8);
-
function rmL8Cloud(image) {
-
var cloudShadowBitMask = (1 << 3);
-
var cloudsBitMask = (1 << 5);
-
var qa = image.select('pixel_qa');
-
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
-
.and(qa.bitwiseAnd(cloudsBitMask).eq(0));
-
return image.updateMask(mask);
-
}
-
var l8Imgs = l8.filterBounds(roi)
-
.filterDate("2018-1-1", "2018-3-1")
-
.map(rmL8Cloud);
-
print("l8Imgs", l8Imgs);
-
Map.addLayer(l8Imgs, {min:0, max:3000, bands:["B4","B3","B2"]}, "l8Imgs");
-
Map.addLayer(roi, {color: "red"}, "roi");
-
//影像集合导出方法
-
function exportImageCollection(imgCol) {
-
var indexList = imgCol.reduceColumns(ee.Reducer.toList(), ["system:index"])
-
.get("list");
-
indexList.evaluate(function(indexs) {
-
for (var i=0; i<indexs.length; i++) {
-
var image = imgCol.filter(ee.Filter.eq("system:index", indexs[i])).first();
-
image = image.toInt16();
-
Export.image.toDrive({
-
image: image.clip(roi),
-
description: indexs[i],
-
fileNamePrefix: indexs[i],
-
region: roi,
-
scale: 30,
-
crs: "EPSG:4326",
-
maxPixels: 1e13
-
});
-
}
-
});
-
}
-
exportImageCollection(l8Imgs);
代码分析:
我这里说几个要注意的地方吧
(1)这里使用的是异步导出数据方式 evaluate() 方法
(2)导出代码中有一句话
image = image.toInt16();
这句话的作用是将image影像的波段都强制转为Int16类型数据,这么做的原因是使用toDrive()方法影像的波段类型必须是一致的,这点和导出到Asset不太一样
(3)region参数必须要设置,同时需要注意的是它的类型是geometry,不是featureCollection。如果我们用的是矢量集合,那么一般做法是:
featureCollection.geometry().bounds()作为region的参数
(4)maxPixels必须设置,因为我们在导出大范围的影像时候会出现默认参数过小导致导出失败(默认参数是1e8)
(5)crs推荐设置为EPSG:4326
运行结果:
导出界面
导出到drive后
来源请引用:地理遥感生态网科学数据注册与出版系统