Scale determines the size of pixels used in computations and exports. If you do not specify it explicitly, Earth Engine will choose a scale based on context—often the current map zoom level—leading to inconsistent and unreproducible results. Understanding scale is fundamental to working effectively with remote sensing data.
Learning objectives
- Define and distinguish the four types of resolution: spatial, spectral, temporal, and radiometric.
- Understand how Earth Engine handles scale using image pyramids.
- Find a dataset's native resolution using
nominalScale(). - Set scale explicitly in reducers and exports to ensure reproducibility.
- Troubleshoot "too many pixels" errors with informed scale choices.
- Properly combine datasets with different resolutions using resampling.
Why it matters
Scale controls accuracy, processing time, and cost. A missing scale parameter can change your statistics when you zoom the map or cause tasks to fail entirely. Explicitly controlling scale makes your analysis reproducible and scientifically sound, whereas leaving it implicit introduces unintended variability that undermines your results.
As the Earth Engine documentation states: "To get consistent results, always specify a scale."
The four types of resolution
Resolution defines the level of detail your sensor can capture. Remote sensing scientists recognize four distinct types of resolution, each describing a different dimension of data quality:
📚 Academic Note: These four resolutions are standard in remote sensing literature. See NASA Earthdata's Remote Sensing guide for an authoritative reference.
1. Spatial Resolution
Spatial resolution refers to the size of each pixel on the ground, also called the ground sampling distance. A 30-meter resolution means each pixel represents a 30 × 30 meter area on Earth's surface.
- High spatial resolution (1–10 m): Planet, Sentinel-2 (some bands), commercial satellites. Best for urban mapping, infrastructure, and fine-scale analysis.
- Medium spatial resolution (10–100 m): Landsat (30 m), Sentinel-2. Workhorse for regional studies, land cover classification.
- Coarse spatial resolution (100–1000+ m): MODIS (250–1000 m), GOES. Best for global monitoring, climate studies, daily observations.
Key insight: Smaller pixels (finer resolution) capture more detail but dramatically increase data volume. A large pixel might mix different land cover types into a single averaged value—a phenomenon called the mixed pixel problem.
2. Temporal Resolution
Temporal resolution is the revisit period—how frequently a satellite captures imagery of the same location.
- High temporal resolution (daily or sub-daily): Planet, geostationary satellites (GOES captures every 5–15 minutes!). Essential for monitoring rapid changes like floods, fires, or weather.
- Medium temporal resolution (5–16 days): Sentinel-2 (~5 days), Landsat (~16 days). Good balance for agriculture, phenology, change detection.
- Low temporal resolution (monthly or less): Some specialized missions. Useful when change is slow.
Trade-off: Higher temporal resolution often means coarser spatial resolution. Geostationary satellites offer near-continuous observation but at kilometer-scale pixels.
3. Spectral Resolution
Spectral resolution describes the number and width of wavelength bands the sensor records. It determines what materials and conditions you can distinguish.
- Panchromatic (1 broad band): High spatial detail but no color distinction.
- Multispectral (4–12 bands): Landsat (11 bands), Sentinel-2 (13 bands). Enables vegetation indices, water detection, basic material identification.
- Hyperspectral (100–400+ narrow bands): AVIRIS, PRISMA, EnMAP. Can identify specific minerals, vegetation species, water quality parameters.
Why it matters: More spectral bands let you distinguish materials that look identical in RGB. For example, NIR bands reveal vegetation health invisible to the human eye; SWIR bands detect moisture content and mineral composition.
4. Radiometric Resolution
Radiometric resolution is the sensor's ability to distinguish subtle differences in energy levels—determined by the bit depth of the recorded values.
- 8-bit (256 levels): 0–255. Older sensors, consumer cameras. Limited dynamic range.
- 12-bit (4,096 levels): Landsat 8, Sentinel-2. Much better discrimination of subtle brightness variations.
- 16-bit (65,536 levels): Some scientific instruments. Excellent for detecting small changes.
Practical impact: Higher radiometric resolution captures subtle reflectance differences—essential for detecting small changes in water quality, vegetation stress, or distinguishing shadows from dark objects.
Key terms summary
- Spatial Resolution
- Pixel size on the ground (e.g., 30 meters)
- Temporal Resolution
- Satellite revisit frequency (e.g., 16 days)
- Spectral Resolution
- Number and width of wavelength bands (e.g., 11 bands)
- Radiometric Resolution
- Bit depth / intensity levels (e.g., 12-bit = 4096 levels)
🔬 Interactive Resolution Explorer
Use this tool to visualize how each type of resolution affects your analysis. Click the tabs below to explore.
Spatial Resolution: How big is a pixel?
This visualization shows a fixed 1.5 km × 1.5 km area on the ground. Watch how the number of pixels changes as resolution gets finer:
📊 Computation Impact
Total pixels to process:
⚠️ Halving pixel size quadruples the number of pixels. Going from 30m → 10m increases pixels by 9×, not 3×!
Temporal Resolution: How often does the satellite return?
See how many images you'd collect over a single month (30 days):
6 images captured in 30 days
Sentinel-2's 5-day revisit balances data volume with frequent monitoring—great for agriculture and change detection.
Spectral & Radiometric Resolution
📷 Standard Camera (RGB)
Spectral: 3 broad bands
Radiometric: 8-bit (256 levels)
Values: 0 → 255
🛰️ Landsat 8 (Multispectral)
Spectral: 11 narrow bands
Radiometric: 12-bit (4,096 levels)
Values: 0 → 4,095 (16× more sensitive!)
Why does this matter in Earth Engine? You can check a dataset's spectral
resolution with image.bandNames() to see available bands. More bands enable
more spectral indices and material discrimination.
How Earth Engine handles scale: Image pyramids
Understanding why scale matters requires knowing how Earth Engine stores and processes data internally. This is key to avoiding unexpected results.
Image pyramids explained
Earth Engine stores every image as a multi-resolution pyramid. At the base is the full-resolution (native) data. Above it are progressively coarser aggregated versions—each level has pixels that represent averages or samples of the level below.
┌───────────────────┐ ← Level 3: Very coarse (e.g., 240m)
│ 1 pixel │ Aggregated from Level 2
└───────────────────┘
↑
┌───┬───┬───┬───┐ ← Level 2: Coarse (e.g., 120m)
│ │ │ │ │ Each pixel = 4 from Level 1
└───┴───┴───┴───┘
↑
┌─┬─┬─┬─┬─┬─┬─┬─┐ ← Level 1: Medium (e.g., 60m)
│ │ │ │ │ │ │ │ │ Each pixel = 4 from Level 0
└─┴─┴─┴─┴─┴─┴─┴─┘
↑
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ ← Level 0: Native resolution (e.g., 30m)
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘ Original sensor data
What happens when you request data?
When you run a computation or export, Earth Engine uses the scale parameter to decide
which pyramid level to pull data from:
- Request at native scale (30m for Landsat): You get actual sensor pixels from Level 0.
- Request at coarser scale (100m): Earth Engine pulls from a higher pyramid level with pre-aggregated pixels—faster, but values differ from native.
- Request at finer scale (10m on 30m data): Earth Engine upsamples the native data using interpolation—no new detail is created, just smoothed pixels.
⚠️ Critical: If you don't specify a scale, Earth Engine guesses one—often based on your current map zoom level in the Code Editor. This means the same code can produce different results depending on how zoomed in you are!
Why the same location can have different values
Because each pyramid level represents aggregated data, the pixel value at a location can differ
depending on which level is queried. For example, if you run reduceRegion at 10m, 30m,
and 100m for the same point:
- At 10m: Interpolated/upsampled from the 30m native data
- At 30m: Actual native sensor value
- At 100m: Aggregated value (average of multiple native pixels)
All three may return different numbers for the same geographic location. This is expected behavior—not a bug—but it's why you must be intentional about scale.
Always set scale explicitly
According to the Earth Engine Developer Guide: "In general, it is best to always specify scale, crs, and crsTransform when performing reductions or exports."
In reducers
// Good: scale explicitly set to match Landsat native resolution
var stats = image.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: roi,
scale: 30, // Always specify!
maxPixels: 1e9 // Optional: raise limit for large regions
});
print('Mean reflectance:', stats);
In exports
// Good: export at explicit scale and projection
Export.image.toDrive({
image: image,
description: 'my_export',
region: roi,
scale: 30, // Controls output resolution
crs: 'EPSG:32610', // Optional: specify coordinate system
maxPixels: 1e13 // Raise for large exports
});
Pro tips
- Match native resolution when possible—this uses actual sensor data without aggregation or interpolation.
- Coarsen for large regions: If processing a country at 10m is too slow, use 30m or 100m. A 3× increase in scale reduces pixels by 9×.
- Check native scale programmatically: Use
image.projection().nominalScale()to verify true resolution. - For multi-band images: Bands may have different resolutions (e.g.,
Sentinel-2's 10m/20m/60m bands). Select a specific band to check its scale:
image.select('B4').projection().nominalScale().
Try it: Inspect native scale
// Landsat 8 Surface Reflectance
var l8 = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_044034_20210623');
print('Landsat 8 projection:', l8.projection());
print('Landsat 8 native scale (m):', l8.projection().nominalScale());
// Sentinel-2
var s2 = ee.Image('COPERNICUS/S2_SR_HARMONIZED/20230601T184921_20230601T185933_T10SEG');
print('Sentinel-2 B4 (Red) scale:', s2.select('B4').projection().nominalScale());
print('Sentinel-2 B5 (Red Edge) scale:', s2.select('B5').projection().nominalScale());
// MODIS
var modis = ee.Image('MODIS/061/MOD09GA/2023_06_01');
print('MODIS sur_refl_b01 scale:', modis.select('sur_refl_b01').projection().nominalScale());
// Count spectral bands
print('Landsat 8 band count:', l8.bandNames().length());
print('Sentinel-2 band count:', s2.bandNames().length());
What to notice: Landsat returns ~30m, Sentinel-2 bands vary (10m, 20m, 60m depending on band), MODIS returns 500m or 1000m. Sentinel-2 has 13 bands vs. Landsat's 11—higher spectral resolution!
Handling "too many pixels" errors
Earth Engine limits computations to prevent runaway processing. The default limit for
reduceRegion is about 10 million pixels. For context:
- A 1° × 1° area (~12,000 km²) at 30m = ~13 million pixels → exceeds default!
- Same area at 100m = ~1.2 million pixels → easily within limits
- Same area at 500m = ~48,000 pixels → very fast
// Strategy: Coarsen scale first, then optionally raise limits
var stats = image.reduceRegion({
reducer: ee.Reducer.mean(),
geometry: largeArea,
scale: 100, // ← First line of defense: coarser scale
maxPixels: 1e9, // ← Second: raise the limit if needed
bestEffort: true // ← Last resort: auto-coarsen if still too many
});
Understanding maxPixels and bestEffort
maxPixels: Sets the maximum number of pixels Earth Engine will process. Default is ~10⁸. Raising it allows larger computations but takes more time/resources.bestEffort: true: If the computation would exceedmaxPixels, Earth Engine automatically coarsens the resolution until it fits. Warning: This changes your actual analysis scale silently! You may get 200m results when you asked for 30m. Use with caution.
Recommendation: Prefer explicitly choosing a coarser scale over relying on
bestEffort. That way you control exactly what resolution you're analyzing.
Mixing datasets with different resolutions
Real projects often combine data from multiple sensors—Landsat with Sentinel, optical with elevation, etc. These datasets have different native resolutions and projections. Here's how to handle them properly.
The problem
When you combine images with different resolutions (e.g., Sentinel-2 at 10m + Landsat at 30m), Earth Engine must resample one to match the other. By default, it uses nearest-neighbor resampling, which can produce blocky artifacts.
Resampling methods
- Nearest neighbor (default): Takes value from closest pixel. Fast, preserves exact values. Best for categorical data (land cover classes).
- Bilinear: Averages 4 nearest pixels. Smoother result. Best for continuous data (reflectance, temperature, elevation).
- Bicubic: Averages 16 nearest pixels. Smoothest but slowest. Good for elevation data.
// Example: Resampling a DEM to match Landsat before combining
var dem = ee.Image('USGS/SRTMGL1_003'); // 30m but different projection
var landsat = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_044034_20210623');
// Resample DEM using bilinear for smooth elevation
var demResampled = dem
.resample('bilinear')
.reproject({
crs: landsat.projection(),
scale: 30
});
// Now safe to combine
var combined = landsat.addBands(demResampled.rename('elevation'));
⚠️ Caution with reproject(): Explicit reprojection forces immediate
computation and can be slow for large areas. When possible, let Earth Engine handle reprojection
implicitly by specifying scale and crs in your final reduction or
export.
Choosing an analysis scale when mixing
When combining Sentinel-2 (10m) with Landsat (30m):
- Analyze at 30m: Sentinel-2 gets downsampled (averaged). You lose some detail but both datasets contribute equally weighted information.
- Analyze at 10m: Landsat gets upsampled (interpolated). The 10m pixels from Landsat are just smoothed versions of 30m data—no new detail is created.
Rule of thumb: Use the coarsest native resolution of your inputs as your analysis scale, unless you have a specific reason to need finer resolution from one source.
Common mistakes
- Letting zoom level dictate scale: Results change when you pan/zoom the map.
Always set
scaleexplicitly. - Expecting new detail from upsampling: Requesting 10m scale on 30m data just interpolates—it cannot reveal features smaller than 30m.
- Ignoring projection differences: Mixing datasets without considering
projections can cause misalignment. Use
resample()and explicitcrs. - Using nearest neighbor on continuous data: This creates blocky artifacts. Use
resample('bilinear')for reflectance, temperature, or elevation. - Trusting
bestEffortblindly: It silently changes your analysis resolution. Know what scale you're actually getting.
📋 Case study: Forest cover calculation gone wrong
Scenario: A student tried to calculate forest cover percentage for Brazil using Sentinel-2 at 10m resolution. The computation timed out after 2 hours.
Analysis: Brazil is ~8.5 million km². At 10m resolution, that's approximately 85 trillion pixels—far beyond any reasonable limit!
Solution: The student changed to 100m resolution (still plenty of detail for
national-scale analysis). Pixel count dropped to ~850 billion—still large but manageable with
maxPixels: 1e12 and tiled exports.
Trade-off: At 100m, small forest patches under ~1 hectare might be missed, but for a national forest inventory, this is acceptable. The analysis completed in 15 minutes.
Lesson: Match your scale to your analysis goal. Continental analyses don't need meter-level detail!
Quick self-check
- Name the four types of resolution in remote sensing and give a one-sentence definition of each.
- What does
image.projection().nominalScale()return? - Why might the same
reduceRegiongive different results at different zoom levels if you don't setscale? - True or False: Using a 5m scale on 30m Landsat imagery will reveal finer details not visible at
30m.
Reveal answer
False. Upsampling cannot add information that wasn't captured by the sensor. You'll just get interpolated (smoothed) values.
- When combining Sentinel-2 (10m) with MODIS (500m), what analysis scale would you recommend and why?
- What's the difference between spectral and radiometric resolution?
Reveal answer
Spectral: Number and width of wavelength bands (e.g., 11 bands). Radiometric: Bit depth / intensity levels (e.g., 12-bit = 4096 levels). Spectral = "which colors," Radiometric = "how precisely."
Next steps
- Experiment with scale: Run the same reducer at 10m, 30m, 100m, and 500m. Compare runtime and results.
- Compare resampling methods: Visualize DEM data resampled with nearest, bilinear, and bicubic. Note the differences.
- Explore band resolutions: Use
nominalScale()on each band of a Sentinel-2 image. Which bands are 10m? 20m? 60m? - Practice exports: Export a classified image with explicit
scaleandcrsfor reproducible results.
📚 Further reading
- Google Earth Engine Guide: Scale — Official documentation on how Earth Engine handles scale
- Google Earth Engine Guide: Resampling and Reducing Resolution — How to control interpolation
- NASA Earthdata: Remote Sensing Basics — Authoritative introduction to the four resolutions
- Pan Geography: Types of Resolution — Clear explanations with examples