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