I want to extract Landsat time series for multiple locations. I refer to the code in this [tutorial][1].The time I choose is from 2019-01-01 to 2019-12-30. The resulting time series should be multi-column,but I only got two columns of NDVI data,What's wrong? the result like this:[![enter image description here][2]][2] [This is the code][3] ``` var points = table.map(function(feature) { return ee.Feature(feature.geometry(), {'id': feature.id()}) }) // Cloud masking *** from Example:"Landsat8 TOA Reflectance QA Band" var maskL8 = function(image) { var qa = image.select('BQA'); /// Check that the cloud bit is off. // See https://www.usgs.gov/land-resources/nli/landsat/landsat-collection-1-level-1-quality-assessment-band var mask = qa.bitwiseAnd(1 << 4).eq(0); return image.updateMask(mask); } // Adding a NDVI band function addNDVI(image) { var ndvi = image.normalizedDifference(['B5', 'B4']).rename('ndvi') return image.addBands([ndvi]) } var startDate = '2019-01-01' var endDate = '2019-12-31' var collection = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA') // ee.ImageCollection('LANDSAT/LC08/C01/T1_SR') .filterDate(startDate, endDate) // .map(maskL8sr) .map(maskL8) .map(addNDVI) .filter(ee.Filter.bounds(points)) // // Show the farm locations in green Map.addLayer(points, {color: 'green'}, 'Farm Locations') // handling masked pixels var triplets = collection.map(function(image) { return image.select('ndvi').reduceRegions({ collection: points, reducer: ee.Reducer.first().setOutputs(['ndvi']), scale: 10, })// reduceRegion doesn't return any output if the image doesn't intersect // with the point or if the image is masked out due to cloud // If there was no ndvi value found, we set the ndvi to a NoData value -9999 .map(function(feature) { var ndvi = ee.List([feature.get('ndvi'), null]) .reduce(ee.Reducer.firstNonNull()) return feature.set({'ndvi': ndvi, 'imageID': image.id()}) }) }).flatten(); // Granules overlap var format = function(table, rowId, colId) { var rows = table.distinct(rowId); var joined = ee.Join.saveAll('matches').apply({ primary: rows, secondary: table, condition: ee.Filter.equals({ leftField: rowId, rightField: rowId }) }); return joined.map(function(row) { var values = ee.List(row.get('matches')) .map(function(feature) { feature = ee.Feature(feature); return [feature.get(colId), feature.get('ndvi')]; }); return row.select([rowId]).set(ee.Dictionary(values.flatten())); }); }; var sentinelResults = format(triplets, 'id', 'imageID'); // There are multiple image granules for the same date processed from the same orbit // Granules overlap with each other and since they are processed independently // the pixel values can differ slightly. So the same pixel can have different NDVI // values for the same date from overlapping granules. // So to simplify the output, we can merge observations for each day // And take the max ndvi value from overlapping observations var merge = function(table, rowId) { return table.map(function(feature) { var id = feature.get(rowId) var allKeys = feature.toDictionary().keys().remove(rowId) var substrKeys = ee.List(allKeys.map(function(val) { return ee.String(val).slice(0,8)} )) var uniqueKeys = substrKeys.distinct() var pairs = uniqueKeys.map(function(key) { var matches = feature.toDictionary().select(allKeys.filter(ee.Filter.stringContains('item', key))).values() var val = matches.reduce(ee.Reducer.max()) return [key, val] }) return feature.select([rowId]).set(ee.Dictionary(pairs.flatten())) }) } var sentinelMerged = merge(sentinelResults, 'id'); Export.table.toDrive({ collection: sentinelMerged, description: 'landsat_Multiple_Locations_NDVI_time_series', folder: 'earthengine', fileNamePrefix: 'landsat_ndvi_time_series_multiple', fileFormat: 'CSV' }) ``` Please give me some advice. [1]: https://spatialthoughts.com/2020/04/13/extracting-time-series-ee/#respond [2]: https://i.sstatic.net/cdZiG.png [3]: https://code.earthengine.google.com/b411447fec1ad4a91f57195fe13f1289?noload=1