Advertisement

GEE土地分类——基于Landsat 9 数据机器学习的土地分类案例

阅读量:

GEE土地分类——基于Landsat 9 数据及其学习的土地分类案例

代码解释

这段代码采用 JavaScript 编写,并专注于利用 Google Earth Engine 平台(GEE)对 Landsat 图像进行处理以及进行土地覆盖分类。下面将详细阐述各组成部分的功能与作用:

1. 应用缩放因子的函数

复制代码
    function applyScaleFactors(image) {
      var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
      var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
      return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);    
    }
  • 目标:对Landsat遥感图像进行光学与热带波段的比例尺调整。
    • 光学波段:采用特定参数与校正项对近红外光谱区域进行处理。
    • 热带波段:采用不同参数组合对短波热红外光谱区域实施调整。
    • 输出结果:原始影像图及新增的缩放辅助通道数据集。

2. 数据集准备

复制代码
    var dataset = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')
    .filterDate('2023-01-01', '2023-04-30')
    .filterBounds(sa_buf)
    .filterMetadata('CLOUD_COVER', 'less_than', 1)
    .map(applyScaleFactors);
  • 目标:生成Landsat图像集合。
    • 过滤标准

      • 时间范围:限定在2023年1月至4月30日之间。
      • 空间范围:限定在预设的空间范围内(sa_buf)。
      • 气候状况:要求云量不超过1%,以保证图像质量。
    • 映射 :将 applyScaleFactors 函数应用于集合中的每个图像。

3. 可视化设置

复制代码
    var tiatiarea = dataset.median();
    var visualization = {
      bands: ['SR_B4', 'SR_B3', 'SR_B2'],  
      min: 0.0,
      max: 0.3,
    };
    
    Map.centerObject(sa_buf);
    Map.addLayer(tiatiarea.clip(sa_buf), visualization, 'True Color (432)');
  • 目标在于生成并准备用于展示该数据集的中位数图像。
    • 在视觉呈现方面,《可视化》步骤采用波段4、3及2的比例反射模式实现影像的真实色彩显示。
    • 在地理信息叠加操作中,《地图图层》环节需将裁剪后获取的高精度中位数影像叠加至地理底图上完成。

4. 训练数据准备

复制代码
    var TiatiTS = Forest1.merge(Water1).merge(Water2).merge(Forest2).merge(Cropland1)
    .merge(Cropland2).merge(Grassland1).merge(Dense_Shrubs).merge(Bareland1).merge(Clouds)
    .merge(Shadow).merge(Openshrubs1).merge(TeaFarms).merge(Settlement1);
  • 目的 :合并多个训练数据集,代表不同的土地覆盖类别。

5. 采样训练数据

复制代码
    var bands = ['SR_B1', 'SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7'];
    var training = tiatiarea.select(bands).sampleRegions({
      collection: TiatiTS, properties: ['LC'], scale: 30, tileScale: 16
    });
  • 目的 :从中位数图像中采样以创建训练数据集,使用合并的训练点。

6. 分类器训练

复制代码
    var classifier = ee.Classifier.smileGradientTreeBoost(100).train({
      features: training,
      classProperty: 'LC',
      inputProperties: bands
    });
  • 目的 :使用训练数据训练梯度提升树分类器。

7. 分类

复制代码
    var Tiatilulc2023 = tiatiarea.select(bands).classify(classifier);
  • 目的 :使用训练好的分类器对中位数图像进行分类。

8. 显示分类结果

复制代码
    Map.addLayer(Tiatilulc2023, {min: 1, max: 14, palette: [...]}, 'classification');
  • 目的 :将分类图像添加到地图上,并指定不同土地覆盖类别的颜色调色板。

9. 准确性评估

复制代码
    var withRandom = training.randomColumn('random'); 
    var split = 0.7; // 70% 训练,30% 测试
    var trainingSet = withRandom.filter(ee.Filter.lt('random', split));
    var validationSet = withRandom.filter(ee.Filter.gte('random', split));
    var validated = validationSet.classify(classifier);
    var testAccuracy = validated.errorMatrix('LC', 'classification').accuracy();
    var confusionMatrix = validated.errorMatrix('LC', 'classification');
  • 目的:目的是将训练数据分割为训练集和验证集,并用于准确度分析。
    • 计算:计算混淆矩阵的结果及其对应的总体准确率。

10. 导出结果

复制代码
    Export.image.toDrive({
      image: dataset,
      description: 'Tiati2023',
      maxPixels: 10000000000000,
      scale: 30,
      region: sa_buf,
    });
  • 目的 :将最终数据集导出到 Google Drive,以便后续使用。

总结

该代码旨在处理来自Landsat遥感图像的数据,并通过应用特定的缩放因子来优化图像的质量。在生成输出前对分类器的性能进行评估以确保结果的有效性

全部代码

复制代码
    // Applies scaling factors.
    function applyScaleFactors(image) {
      var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
      var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
      return image.addBands(opticalBands, null, true)
              .addBands(thermalBands, null, true);    
    }
    
    
    var dataset = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')
    .filterDate('2023-01-01', '2023-04-30')
    .filterBounds(sa_buf)
    .filterMetadata('CLOUD_COVER', 'less_than', 1)
    .map(applyScaleFactors)
    print('dataset',dataset)
    dataset = dataset;
    var tiatiarea = dataset.median();
    var visualization = {
      bands: ['SR_B4', 'SR_B3', 'SR_B2'],  
      min: 0.0,
      max: 0.3,
    };
     
    Map.centerObject(sa_buf);
    
    Map.addLayer(tiatiarea.clip(sa_buf), visualization, 'True Color (432)');
    // Clip to the output image to Tiati_SubCounty. 
    // var tiati=dataset.first().clip(sa_buf)
    // Map.addLayer(tiati,visualization, 'Tiati');
    
    //Classification of Landsat imagery
    //Tiati Training Site
    var TiatiTS = Forest1.merge(Water1).merge(Water2).merge(Forest2).merge(Cropland1)
    .merge(Cropland2).merge(Grassland1).merge(Dense_Shrubs).merge(Bareland1).merge(Clouds)
    .merge(Shadow).merge(Openshrubs1).merge(TeaFarms).merge(Settlement1)
                
    
    //Creating Training data by overlaying the training points on the image
    //'SR_B4', 'SR_B3', 'SR_B2'
    var bands = ['SR_B1', 'SR_B2', 'SR_B3', 'SR_B4', 'SR_B5', 'SR_B6', 'SR_B7'];
    var training = tiatiarea.select(bands).sampleRegions
    ({collection: TiatiTS, properties: ['LC'], scale: 30, tileScale: 16});
    
    
    Train the classifier test for:
    //•	SVM: ee.Classifier.libsvm()
    //•	Random Forest: ee.Classifier.smileRandomForest()
    //•	CART: ee.Classifier.smileCart()
    //•	Naive Bayes: ee.Classifier.gmoNaiveBayes()
    //•	Tree Boosting (GBT): ee.Classifier.smileGradientTreeBoost()
    //Random Forest
    // var classifier = ee.Classifier.smileRandomForest({
    //   numberOfTrees: 70, 
    //   seed: 1
    //   }).train(training, "LC", tiatiarea.bandNames())
      //Cart Classifier
    // var classifier = ee.Classifier.smileCart().train
    // ({features: training, classProperty: 'LC', inputProperties: bands});
    //Naive Bayes
    // var classifier = ee.Classifier.smileNaiveBayes().train({
    //   features: training,
    //   classProperty: 'LC',
    //   inputProperties: bands
    // });
    
    //Tree Boosting GBT
    var classifier = ee.Classifier.smileGradientTreeBoost(100).train({
      features: training,
      classProperty: 'LC',
      inputProperties: bands
    });
    //SVM Classifier
    // var classifier = ee.Classifier.libsvm().train({
    //   features: training,
    //   classProperty: 'LC',
    //   inputProperties: bands
    // });
    
    // Running the clasification
    var Tiatilulc2023 = tiatiarea.select(bands).classify(classifier);
    
    
    Displaying the classification
    
    
    Map.addLayer(Tiatilulc2023, {min: 1, max: 14, palette: [ 
      '013101', //Dense Forest
      '0000FF', //Water Body1
      '0000FF', //Water Body2
      '04F504', //Sparse Forest dryland forest
      'f5c7f9', //Cropland
      'f5c7f9', //Cropland
      //'00FF00', //Planted Forest/Magroove
      'FFFF00', //Open GRassland
      '7C2800', //Denseshrubs
      'FFFFBA', //Otherland
      'fbf8f9', //Clouds
      '0f0f0f', //Shadows
      'CC6638', //Open Shrubland
     // '00EEEE', //Wetland
      //'0000FF', //Water Body
      'FF00FF', //Teafarms
    
      'F71009', //Settlement
      // 'FFCA00', //Lava Flow  
     // 'FBF6F6', //Sand Dune
      
      ]}, 'classification');
      
     //Add a random column to each feature
     var withRandom = training.randomColumn('random'); 
     var split = 0.7; //60% training, 30% testing
     var trainingSet = withRandom.filter(ee.Filter.lt('random', split));
     var validationSet = withRandom.filter(ee.Filter.gte('random', split));
     //Perform Accuracy Assessment
     var validated = validationSet.classify(classifier);
     var testAccuracy =validated.errorMatrix('LC', 'classification').accuracy();
     var confusionMatrix = validated.errorMatrix('LC', 'classification');
     print('Validation error matrix:', confusionMatrix);
     print('validation overal accuracy:', testAccuracy)
    // Export final mosaic to assets
    Export.image.toDrive({
      image: dataset,
    description: 'Tiati2023',
      maxPixels: 10000000000000,
    scale: 30,
    region: sa_buf,
    });

代码链接

https://code.earthengine.google.com/e6fe8cfcca0b9d2cdd66005a92e4bdaa

结果

分类结果和可视化

全部评论 (0)

还没有任何评论哟~