在 google earth engine 中映射一个函数以重命名整个图像集合中的波段
Mapping a function to rename bands across an image collection in google earth engine
我有一个功能可以可视化不同日期的图像。但是,我需要同时使用 landsat 7 和 8,因为我想要的日期早于 2013 年。问题是 landsat 7 和 8 对波段的排序不同,因此以相同的方式可视化图像需要不同的代码。为了解决这个问题,我正在尝试重命名 landsat 7 图像集合中的红色、绿色、蓝色和 NIR 波段以匹配 landsat 8。这样我就可以编写一个通用代码,该代码将适用于来自 landsat 7 和 8 的图像。下面是我编写的代码(假设 landsat 7 已被导入并称为 'landsat7',并且还导入了一个包围感兴趣区域的几何体,称为 'bounds')。
// Function to rename landsat 7 bands to match landsat 8 bands
var adjustBands = function(landsat7){
var adjust = ee.ImageCollection(landsat7)
.filterDate('2010-01-01', '2010-05-01')
.filterBounds(bounds).first();
return adjust.select(['B4', 'B3', 'B2', 'B1'],['B5', 'B4', 'B3','B2']);
}
print('adjust', adjustBands(landsat7));
//apply function to entire image collection
var l7a = landsat7.map(adjustBands);
但是,当我 运行 代码时出现错误:地图错误(ID=LE07_001004_20000610):Image.select:需要参数 'input'。有什么建议吗?
看起来您正在将一个函数映射到一个集合,但在函数内部您正在读取同一个集合。确保将函数映射到集合时,函数本身仅将单个图像作为其参数并且 returns 单个图像。如果我想合并 Landsat 集合,下面是我如何处理波段重命名:
function renameBandsETM(image) {
var bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B7', 'pixel_qa'];
var new_bands = ['B', 'G', 'R', 'NIR', 'SWIR1', 'SWIR2', 'pixel_qa'];
return image.select(bands).rename(new_bands);
}
var etm = ee.ImageCollection('LANDSAT/LE07/C01/T1_SR')
.map(renameBandsETM)
然后我对 LC8 图像做同样的事情,考虑到不同的波段命名系统:
function renameBandsOLI(image) {
var bands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'pixel_qa'];
var new_bands = ['B', 'G', 'R', 'NIR', 'SWIR1', 'SWIR2', 'pixel_qa'];
return image.select(bands).rename(new_bands);
}
var oli = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.map(renameBandsOLI);
然后您可以合并集合:
var landsat = ee.ImageCollection(etm.merge(oli));
您可以从图像集合中调用 .select()
函数,第一个参数是您想要 select 的波段列表,第二个参数是要重命名波段的列表。
var adjustBands = landsat7.select(['B4', 'B3', 'B2', 'B1'],['B5', 'B4', 'B3','B2'])
无需在图像集合上映射函数来重命名波段,因为该方法会产生不必要的开销。
我有一个功能可以可视化不同日期的图像。但是,我需要同时使用 landsat 7 和 8,因为我想要的日期早于 2013 年。问题是 landsat 7 和 8 对波段的排序不同,因此以相同的方式可视化图像需要不同的代码。为了解决这个问题,我正在尝试重命名 landsat 7 图像集合中的红色、绿色、蓝色和 NIR 波段以匹配 landsat 8。这样我就可以编写一个通用代码,该代码将适用于来自 landsat 7 和 8 的图像。下面是我编写的代码(假设 landsat 7 已被导入并称为 'landsat7',并且还导入了一个包围感兴趣区域的几何体,称为 'bounds')。
// Function to rename landsat 7 bands to match landsat 8 bands
var adjustBands = function(landsat7){
var adjust = ee.ImageCollection(landsat7)
.filterDate('2010-01-01', '2010-05-01')
.filterBounds(bounds).first();
return adjust.select(['B4', 'B3', 'B2', 'B1'],['B5', 'B4', 'B3','B2']);
}
print('adjust', adjustBands(landsat7));
//apply function to entire image collection
var l7a = landsat7.map(adjustBands);
但是,当我 运行 代码时出现错误:地图错误(ID=LE07_001004_20000610):Image.select:需要参数 'input'。有什么建议吗?
看起来您正在将一个函数映射到一个集合,但在函数内部您正在读取同一个集合。确保将函数映射到集合时,函数本身仅将单个图像作为其参数并且 returns 单个图像。如果我想合并 Landsat 集合,下面是我如何处理波段重命名:
function renameBandsETM(image) {
var bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B7', 'pixel_qa'];
var new_bands = ['B', 'G', 'R', 'NIR', 'SWIR1', 'SWIR2', 'pixel_qa'];
return image.select(bands).rename(new_bands);
}
var etm = ee.ImageCollection('LANDSAT/LE07/C01/T1_SR')
.map(renameBandsETM)
然后我对 LC8 图像做同样的事情,考虑到不同的波段命名系统:
function renameBandsOLI(image) {
var bands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'pixel_qa'];
var new_bands = ['B', 'G', 'R', 'NIR', 'SWIR1', 'SWIR2', 'pixel_qa'];
return image.select(bands).rename(new_bands);
}
var oli = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
.map(renameBandsOLI);
然后您可以合并集合:
var landsat = ee.ImageCollection(etm.merge(oli));
您可以从图像集合中调用 .select()
函数,第一个参数是您想要 select 的波段列表,第二个参数是要重命名波段的列表。
var adjustBands = landsat7.select(['B4', 'B3', 'B2', 'B1'],['B5', 'B4', 'B3','B2'])
无需在图像集合上映射函数来重命名波段,因为该方法会产生不必要的开销。