// A Sentinel-2 surface reflectance image, reflectance bands selected, //ROI สำหรับดึงภาพ Sentinel 2 //var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017'); //var roi = countries.filter(ee.Filter.eq('country_na', 'Thailand')); // A Sentinel-2 surface reflectance image, reflectance bands selected, // serves as the source for training and prediction in this contrived example. // Function to mask clouds using the Sentinel-2 QA band. function maskS2clouds(image) { var qa = image.select('QA60') // Bits 10 and 11 are clouds and cirrus, respectively. var cloudBitMask = 1 << 10; var cirrusBitMask = 1 << 11; // Both flags should be set to zero, indicating clear conditions. var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and( qa.bitwiseAnd(cirrusBitMask).eq(0)) // Return the masked and scaled data, without the QA bands. return image.updateMask(mask) .select("B.*") .copyProperties(image, ["system:time_start"]) } var img = ee.ImageCollection('COPERNICUS/S2_SR') .filterDate('2021-01-01', '2022-01-01') .filterBounds(roi) .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10)) .map(maskS2clouds) .median(); // ESA WorldCover land cover map, used as label source in classifier training. var lc = ee.Image('ESA/WorldCover/v100/2020'); // Remap the land cover class values to a 0-based sequential series. var classValues = [10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100]; var remapValues = ee.List.sequence(0, 10); var label = 'lc'; lc = lc.remap(classValues, remapValues).rename(label).toByte(); // Add land cover as a band of the reflectance image and sample 100 pixels at // 10 m scale from each land cover class within a region of interest. var sample = img.addBands(lc).stratifiedSample({ numPoints: 100, classBand: label, region: roi, scale: 10, tileScale: 4, geometries: true }); // Add a random value field to the sample and use it to approximately split 80% // of the features into a training set and 20% into a validation set. sample = sample.randomColumn(); var trainingSample = sample.filter('random <= 0.8'); var validationSample = sample.filter('random > 0.8'); // Train a 10-tree random forest classifier from the training sample. var trainedClassifier = ee.Classifier.libsvm().train({ features: trainingSample, classProperty: label, inputProperties: img.bandNames() }); // Get information about the trained classifier. print('Results of trained classifier', trainedClassifier.explain()); // Get a confusion matrix and overall accuracy for the training sample. var trainAccuracy = trainedClassifier.confusionMatrix(); print('Training error matrix', trainAccuracy); print('Training overall accuracy', trainAccuracy.accuracy()); // Get a confusion matrix and overall accuracy for the validation sample. validationSample = validationSample.classify(trainedClassifier); var validationAccuracy = validationSample.errorMatrix(label, 'classification'); print('Validation error matrix', validationAccuracy); print('Validation accuracy', validationAccuracy.accuracy()); // Classify the reflectance image from the trained classifier. var imgClassified = img.classify(trainedClassifier); // Add the layers to the map. var classVis = { min: 0, max: 10, palette: ['006400' ,'ffbb22', 'ffff4c', 'f096ff', 'fa0000', 'b4b4b4', 'f0f0f0', '0064c8', '0096a0', '00cf75', 'fae6a0'] }; Map.centerObject(roi,13) Map.addLayer(img.clip(roi), {bands: ['B4', 'B8', 'B3'], min: 100, max: 3500}, 'Sentinel-2'); Map.addLayer(lc.clip(roi), classVis, 'ESA WorldCover',false); Map.addLayer(imgClassified.clip(roi), classVis, 'Classified'); Map.addLayer(roi, {color: 'white'}, 'ROI', false, 0.5); Map.addLayer(trainingSample, {color: 'black'}, 'Training sample', false); Map.addLayer(validationSample, {color: 'white'}, 'Validation sample', false);