0

I am working on a land use classification program using the RS algorithm of the GEE platform. The codes are as the following link.

https://code.earthengine.google.com/7e99f1de58c1251bd9bff0ff7af9368b

Specific codes:

  var table = ee.FeatureCollection("users/zongxuli/Jing_Jin_Ji");
  //Set up bands and corresponding band names
  var inBands = ee.List([1,2,3,4,5,7,6,'pixel_qa'])
  var outBands = ee.List(['blue','green','red','nir','swir1','temp', 'swir2','pixel_qa'])


  // Get Landsat data
  var l8s = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR")
  .filterDate(2019-01-01,2019-12-31)
  .filterBounds(table)
  .select(inBands,outBands)
  .filter(ee.Filter.lt("CLOUD_COVER",10))

   function getIndexes(image){

   //   Normalized Difference Vegitation Index(NDWI)
   var ndvi = image.normalizedDifference(['nir','red']).rename("ndvi");
   image = image.addBands(ndvi);


   //   Normalized Difference Snow Index(NDWI)  
   var ndsi = image.normalizedDifference(['green','swir1']).rename("ndsi");
   image = image.addBands(ndsi);


   //   Normalized Difference Water Index(NDWI)
   var ndwi = image.normalizedDifference(['nir','swir1']).rename("ndwi");
   image = image.addBands(ndwi);


   // add Enhanced Vegetation Indexes
   var evi = image.expression('2.5 * ((NIR - RED) / (NIR + 6 * RED - 7.5 * BLUE + 1))', {
        'NIR' : image.select('nir'),
        'RED' : image.select('red'),
        'BLUE': image.select('blue') }).float();
   image = image.addBands(evi.rename('evi'));


   // Add Index-Based Built-Up Index (IBI)
   var ibiA = image.expression('2 * SWIR1 / (SWIR1 + NIR)', {
   'SWIR1': image.select('swir1'),
   'NIR'  : image.select('nir')}).rename(['IBI_A']);

   var ibiB = image.expression('(NIR / (NIR + RED)) + (GREEN / (GREEN + SWIR1))', {
   'NIR'  : image.select('nir'),
   'RED'  : image.select('red'),
   'GREEN': image.select('green'),
   'SWIR1': image.select('swir1')}).rename(['IBI_B']);

   var ibiAB = ibiA.addBands(ibiB);
   var ibi = ibiAB.normalizedDifference(['IBI_A', 'IBI_B']);

   image = image.addBands(ibi.rename('ibi'));


   return(image);
   }

   function getTopography(image,elevation) {

   // Calculate slope, aspect and hillshade
   var topo = ee.Algorithms.Terrain(elevation);

   // From aspect (a), calculate eastness (sin a), northness (cos a)
   var deg2rad = ee.Number(Math.PI).divide(180);
   var aspect = topo.select(['aspect']);
   var aspect_rad = aspect.multiply(deg2rad);
   var eastness = aspect_rad.sin().rename(['eastness']).float();
   var northness = aspect_rad.cos().rename(['northness']).float();

   // Add topography bands to image
   topo = topo.select(['elevation','slope','aspect']).addBands(eastness).addBands(northness);
   image = image.addBands(topo);


   return(image);
   }

   // Get an image to train and apply classification to.
   var image = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
   .filterBounds(table)
   .first();

   // get bands
   var bands=image.bandNames();
   print(bands);

   // integers starting from zero in the training data.
   var label = 'lcode'; 

   // Overlay the points on the imagery to get training.
   var trainings = image.select(bands).sampleRegions({
   collection: l8s, //.filterDate(2019-01-01,2019-12-31),
   properties: [label],
   scale: 30
   });

   // The randomColumn() method will add a column of uniform random
   // numbers in a column named 'random' by default.
   var sample = trainings.randomColumn();

   var split = 0.7;  // Roughly 70% training, 30% testing.
   var training = sample.filter(ee.Filter.lt('random', split));
   print(training.size());

   // Random forest
   var classifier = (ee.Classifier.smileRandomForest(15)
          .train({
              features: training,
              classProperty: label,
              inputProperties: bands
            }));
   var classified = image.classify(classifier);
   print(classified);

So far, I always received the wrong message "Number (Error) Empty date ranges not supported for the current operation." when running the program. What am I doing wrong?

Braiam
  • 1
  • 11
  • 47
  • 78
zongxu li
  • 1
  • 2
  • Welcome to SO! There is a better chance that you will get a high quality answer if you provide a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example). Please do not share code or the expected output as link. – above_c_level Jul 23 '20 at 11:10
  • That's a bunch of lines of code. Do you know which line is generating the error? cf "minimal" in the first comment. As a guess, what data type does the `filterDate()` method expect? You're currently passing it two `int`s - `filterDate(2017,1976)`. I wouldn't be surprised if it expects something different than years as integers. – Tom Morris Jul 24 '20 at 00:21
  • Thanks, Tom. Following your suggestion, I changed the date code as integers, but I still received the wrong message as "Image (Error) No data was found in classifier training input." What wrong with it? – zongxu li Jul 24 '20 at 10:11

1 Answers1

0

There is a quotation problem in image collection date filtering:

 // Get Landsat data
 var l8s = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR")
 .filterDate(2019-01-01,2019-12-31)
 .filterBounds(table)
 .select(inBands,outBands)
.filter(ee.Filter.lt("CLOUD_COVER",10))

it must be:

// Get Landsat data
var l8s = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR")
.filterDate('2019-01-01','2019-12-31')
.filterBounds(table)
.select(inBands,outBands)
.filter(ee.Filter.lt("CLOUD_COVER",10))

And in training for classifier section:

// Overlay the points on the imagery to get training.    
var trainings = image.select(bands).sampleRegions({    
collection: l8s, //.filterDate(2019-01-01,2019-12-31),    
properties: [label],   
scale: 30    });

it must be :

// Overlay the points on the imagery to get training. 
var trainings =
image.select(bands).sampleRegions({   
collection: table,   
properties: [label],   
scale: 30 });
Mehmet C
  • 1
  • 1