I am calculating the area of an ice cover by summing the number of pixels having a value above a certain threshold then multiplying by the pixel area. This is done for a collection of images over a number of years.

The resolution of the MODIS dataset I'm using is 500 m. When I use the function ee.Reducer.sum() I set the scale to this value. When my area is calculated however, the pixel size appears to be 463.3 m with areas reflecting this pixel size (0.216 km2 instead of 0.25 km2).

I am not a remote sensing or GIS scientist by trade and am struggling to understand the relationship between projection (when a pixel is inspected it shows, SR-ORG:6974) and scale. This MODIS data set uses a sinusoidal projection which I understand to be area-preserving. That being said when I look at pixels nearer to the equator, they also appear to have a size of 463.3.

My bottomline is that I need to present the most accurate measure of area and make sure I have not caused an error.

Are the areas I've calculated using this approach correct or should they be based on a 500 m pixel?

My code is quite long and may confuse the main question, but I've included the main parts below to show my general method. It's not run-able but I can provide the rest if need be.

//Create a number of masks and other functions to clean up images and highlight ice, there is no //use of scale up to this point

var maskedModis_ice_AllQAcloud= sample

//Function to create threshold and multiply by pixel area to determine ice area

var icethreshold= 3000;
var icefunction = function(image){
  var icejunk= image.select(['Ice_index']);
  var wateretc= icejunk.lt(icethreshold);
  var solidice = icejunk.gte(icethreshold);
  //image = image.updateMask(solidice);
  var area2= ee.Image.pixelArea();
  var iceArea1 = solidice.multiply(area2).rename('iceArea1');
  var iceArea= iceArea1.divide(1000*1000).rename('iceArea');
  return image.addBands(iceArea);

//highlight only pixels marked as ice through thresholding and combine with all filtering steps

var filteredAlliceQAcloud=maskedModis_ice_AllQAcloud.map(icefunction);
print (filteredAlliceQAcloud);

//Apply to specific regions and plot

var chart = ui.Chart.image.series(filteredAlliceQAcloud.select('iceArea'), regions, ee.Reducer.sum(),500)
      //title: 'Beisfjord',
      hAxis: {title: 'Date'},
      vAxis: {title: 'Ice Area, QA and cloud filtered (m^2)'},
      fontSize: 20,
      legend: {position: 'right'}

1 Answer 1


I have not checked your outputs, but your data are likely correct because of how the MODIS data are delivered.

MODIS data is produced in a geographic coordinate system (GCS), not a projected coordinate system. This means that the underlying data are referenced to a spheroid, not a plane or flat sheet. Instead of measuring distance in meters GCS measure in angle. Because the shape of the Earth/spheroid is not perfectly spherical, the distance of a given angle in meters changes. The 500m pixel quoted is the 'typical' or average value of a pixel within the spheroid.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.