Error in Change detection classification_GEE: Image.sampleRegions: Invalid numInputs: 0

29 Views Asked by At

I am doing change setection analysis In Google Earth Engine and when l run my code it gives me several errors and they are related to Image.sampleRegions: Invalid numInputs: 0.

The list of errors is as follows ;

ComputedObject (Error) Image.sampleRegions: Invalid numInputs: 0.

Dictionary (Error) Image.sampleRegions: Invalid numInputs: 0.

before_classified: Layer error: Image.sampleRegions: Invalid numInputs: 0.

Here is my code....................................................................................

//Load Image and Study Area
    var s2 = ee.ImageCollection('COPERNICUS/S2_SR');
    var eThekwini = ee.FeatureCollection('users/tryleematongera/eThekwini_Municipal_Boundary');
    var urban = ee.FeatureCollection('users/tryleematongera/Urban');
    var bare = ee.FeatureCollection('users/tryleematongera/bare');
     var water = ee.FeatureCollection('users/tryleematongera/Water');
      var forest = ee.FeatureCollection('users/tryleematongera/forest');
      var grassland = ee.FeatureCollection('users/tryleematongera/grassland');
       var cropland = ee.FeatureCollection('users/tryleematongera/cropland');
    var geometry = eThekwini.geometry();

    Map.centerObject(geometry);

    var rgbVis = {
    min: 0.0,
    max: 3000,
  bands: ['B4', 'B3', 'B2'], 
};

// 2017 Jan
var filtered = s2
  .filter(ee.Filter.date('2017-01-01', '2017-02-01'))
  .filter(ee.Filter.bounds(geometry))
  .select('B.*');
  
var before = filtered.median().clip(geometry);
// Display the input composite.
Map.addLayer(before.clip(geometry), rgbVis, 'before');

//Merge Ground Control Points
var training = water.merge(urban).merge(forest).merge(grassland).merge(bare).merge(cropland);

// Overlay the point on the image to get training data.
var training = before.sampleRegions({
  collection: training, 
  properties: ['landcover'], 
  scale: 10
});

// Train a classifier.
var classifier = ee.Classifier.smileRandomForest(50).train({
  features: training,  
  classProperty: 'landcover', 
  inputProperties: before.bandNames()
});

// // Classify the image.
var beforeClassified = before.classify(classifier);
var palette = ['#1334d6', '#ff253f', '#1d8b14', '#15ff50', '#ffffef', '#e8f210' ];
var classifiedVis = {min: 0, max: 5, palette: palette};
Map.addLayer(beforeClassified.clip(geometry), classifiedVis, 'before_classified');

// 2023 Jan
var after = s2
  .filter(ee.Filter.date('2023-01-01', '2023-02-01'))
  .filter(ee.Filter.bounds(geometry))
  .select('B.*')
  .median();

Map.addLayer(after.clip(geometry), rgbVis, 'after');

// Classify the image.
var afterClassified= after.classify(classifier);
Map.addLayer(afterClassified.clip(geometry), classifiedVis, 'after_classified');

// Reclassify from 0-5 to 1-6
var beforeClasses = beforeClassified.remap([0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6]);
var afterClasses = afterClassified.remap([0, 1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6]);

// Show all changed areas
var changed = afterClasses.subtract(beforeClasses).neq(0);
Map.addLayer(changed.clip(geometry), {min:0, max:1, palette: ['white', 'red']}, 'Change');

// We multiply the before image with 100 and add the after image
// The resulting pixel values will be unique and will represent each unique transition
// i.e. 102 is urban to bare, 103 urban to water etc.
var merged = beforeClasses.multiply(100).add(afterClasses).rename('transitions');

// Use a frequencyHistogram to get a pixel count per class
var transitionMatrix = merged.reduceRegion({
  reducer: ee.Reducer.frequencyHistogram(), 
  geometry: geometry,
  maxPixels: 1e10,
  scale:10,
  tileScale: 16
});
// This prints number of pixels for each class transition
print(transitionMatrix.get('transitions'));

// If we want to calculate the area of each class transition
// we can use a grouped reducer

// Divide by 1e6 to get the area in sq.km.
var areaImage = ee.Image.pixelArea().divide(1e6).addBands(merged);
// Calculate Area by each Transition Class
// using a Grouped Reducer
var areas = areaImage.reduceRegion({
      reducer: ee.Reducer.sum().group({
      groupField: 1,
      groupName: 'transitions',
    }),
    geometry: geometry,
    scale: 100,
    tileScale: 4,
    maxPixels: 1e10
    }); 

// Post-process the result to generate a clean output
var classAreas = ee.List(areas.get('groups'));
var classAreaLists = classAreas.map(function(item) {
      var areaDict = ee.Dictionary(item);
      var classNumber = ee.Number(areaDict.get('transitions')).format();
      var area = ee.Number(areaDict.get('sum')).round();
      return ee.List([classNumber, area]);
    });
var classTransitionsAreaDict = ee.Dictionary(classAreaLists.flatten());
print(classTransitionsAreaDict);

Link to the code.... https://code.earthengine.google.com/88cc4d097bf510c37a4936a4fd67b3dd

I have tried to troubleshoot the code and l dont seem to win

0

There are 0 best solutions below