Google earth engine下载哨兵影像
前言
这里是超分任务之下载Sentinel-2光学影像。通过GEE平台处理并下载。
/**
* 注意加载自己的shp数据
*/
var roi:
/**
* 定义云掩膜函数
*/
function maskS2clouds(image) {
var qa = image.select('QA60');
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
return image.updateMask(mask).divide(10000);
}
/**
* 定义文件名规范化函数(这里是因为我的shp属性名中有特殊字符需要处理,不影响数据下载)
*/
function normalizeFileName(name) {
return name
.replace(/\s+/g, '_') // 将空格替换为下划线
.replace(/[áàãâä]/g, 'a') // 替换带重音的a
.replace(/[éèêë]/g, 'e') // 替换带重音的e
.replace(/[íìîï]/g, 'i') // 替换带重音的i
.replace(/[óòõôö]/g, 'o') // 替换带重音的o
.replace(/[úùûü]/g, 'u') // 替换带重音的u
.replace(/[ñ]/g, 'n') // 替换ñ
.replace(/[^a-zA-Z0-9_]/g, ''); // 移除其他特殊字符
}
/***************************************
* 数据准备阶段 *
***************************************/
// 1. 处理Sentinel-2数据
var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate('2020-01-01', '2020-12-31')
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 5))
.map(maskS2clouds)
.select('B2','B3','B4','B8')
.mean();
/***************************************
* 数据统计和缩放 *
***************************************/
// 计算Sentinel-2每个波段的统计值
var s2Stats = s2.reduceRegion({
reducer: ee.Reducer.minMax(),
geometry: roi,
scale: 10,
maxPixels: 1e9
});
// 对Sentinel-2数据进行分波段缩放(归一化)
var s2_scaled = ee.Image([
s2.select('B2').unitScale(s2Stats.get('B2_min'), s2Stats.get('B2_max')).multiply(255).uint8(),
s2.select('B3').unitScale(s2Stats.get('B3_min'), s2Stats.get('B3_max')).multiply(255).uint8(),
s2.select('B4').unitScale(s2Stats.get('B4_min'), s2Stats.get('B4_max')).multiply(255).uint8(),
s2.select('B8').unitScale(s2Stats.get('B8_min'), s2Stats.get('B8_max')).multiply(255).uint8()
]).rename(['B2', 'B3', 'B4', 'B8']);
// 打印统计值以供参考
print('Sentinel-2 statistics:', s2Stats);
/***************************************
* 批量导出功能实现 *
***************************************/
// 将矢量集合转换为客户端列表
var cityList = roi.toList(roi.size()).getInfo();
// 遍历每个城市
cityList.forEach(function(cityFeature) {
// 获取城市属性并规范化名称
var cityName = normalizeFileName(cityFeature.properties.UC_NM_MN);// UC_NM_MN是我要加载的属性字段名,需要替换为自己的shp数据字段名
var cityGeometry = ee.Geometry(cityFeature.geometry);
// 导出缩放后的Sentinel-2数据(导出至Google Drive)
Export.image.toDrive({
image: s2_scaled.clip(cityGeometry),
description: 'S2_' + cityName + '_8bit',
fileNamePrefix: 'S2_' + cityName + '_8bit',
folder: 'spain_opt',
region: cityGeometry,
scale: 10,
crs: 'EPSG:4326',
maxPixels: 1e13,
fileFormat: 'GeoTIFF'
});
});
/***************************************
* 地图可视化 *
***************************************/
// 添加图层预览
Map.centerObject(roi, 8);
// 添加原始Sentinel-2预览
Map.addLayer(s2.clip(roi), {
bands: ['B4', 'B3', 'B2'],
min: 0,
max: 0.3
}, 'Sentinel-2 Original');
// 添加缩放后的Sentinel-2预览
Map.addLayer(s2_scaled.clip(roi), {
bands: ['B4', 'B3', 'B2'],
min: 0,
max: 255
}, 'Sentinel-2 8-bit');