You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Google Earth Engine中分类像元面积计算报错求助

问题分析与解决方案

首先,咱们来看你遇到的错误核心:Image.select: Pattern 'classifier' did not match any bands,这是因为你在统计像元数量时犯了几个关键错误,我来一步步拆解并修正:

错误点梳理

  1. 用错了影像对象:你调用image1.select('classifier'),但image1是原始的Sentinel-2影像,并没有分类结果的波段。分类后的结果存在你定义的classified变量里,应该用这个影像来统计。
  2. 波段名称错误:分类后的影像默认波段名是classification,而不是你写的classifier,所以找不到对应的波段。
  3. 小麦分类编号调用错误:你试图用wheat2.toString()来获取分类键,但wheat2是你的训练样本要素集,小麦对应的分类编号是你注释里的3,应该直接用这个数值作为键来提取像元数量。
  4. 调色板语法错误:你在添加分类图层时,palette的数组写法少了开头的[,会导致图层加载失败。

修正后的完整代码

// 加载Sentinel-2影像并筛选
var image = ee.Image(sent2 
  .filterBounds(geometry2) 
  .filterDate('2016-01-01', '2016-03-31') 
  .sort("CLOUD_COVERAGE_ASSESSMENT") 
  .first()); 
print("A Sentinel-2 scene:", image); 

// 裁剪研究区几何范围
var image1 = image.clip(geometry2); 
// 合并训练样本要素集
var newfc = forest.merge(gram2).merge(baresoil).merge(wheat2).merge(mustard2); 
var bands = ['B8', 'B4', 'B3']; 
// 生成训练样本
var training = image1.select(bands).sampleRegions({
  collection: newfc, 
  properties: ['landcover'], 
  scale: 10
}); 

// 使用CART训练分类器
var classifier = ee.Classifier.cart().train({
  features: training, 
  classProperty: 'landcover', 
  inputProperties: bands
}); 

// 执行分类(修正调色板语法)
var classified = image1.select(bands).classify(classifier); 
Map.addLayer(classified, {
  min: 0, 
  max: 4, 
  palette: ['0D5D07','B47610','F7C537','7CE72E','EFF60E']
},'classification'); 

// 分类编号对应:0=森林 1=裸土 2=gram 3=小麦 4=芥菜
var PIXEL_SCALE = 10; // Sentinel-2对应波段分辨率(米)
var PIXEL_AREA = PIXEL_SCALE * PIXEL_SCALE; // 单像元面积(平方米)

// 计算多边形内各分类的像元数量(修正影像对象和波段名)
var regionCoverHistogram = classified.select('classification')
  .reduceRegion({
    reducer: ee.Reducer.frequencyHistogram(), 
    geometry: geometry2, 
    scale: PIXEL_SCALE,
    maxPixels: 1e13 // 避免大区域计算时的像素数量限制
  }); 
print('classified class pixel count within region', regionCoverHistogram); 

// 计算小麦面积(修正分类编号调用)
var wheatPixelCount = ee.Dictionary(regionCoverHistogram.get('classification')).get('3'); 
var wheatArea = ee.Number(wheatPixelCount).multiply(PIXEL_AREA); 
print('Wheat Area (sq meters) in region', wheatArea); 

// 可选:将面积转换为公顷(1公顷=10000平方米)
var wheatAreaHectare = wheatArea.divide(10000);
print('Wheat Area (hectares) in region', wheatAreaHectare);

额外优化说明

  • 添加了maxPixels: 1e13参数:当研究区较大时,默认的像素数量限制会导致计算失败,这个参数可以解除限制。
  • 增加了公顷单位的转换:方便实际应用中查看常用的面积单位。
  • 修正了调色板的数组语法:确保分类图层能正常显示颜色。

现在运行修正后的代码,应该就能正确统计各分类的像元数量和面积了。

内容的提问来源于stack exchange,提问作者neetu rathi

火山引擎 最新活动