Skip to main content
skill CX Codex

google-earth-engine — Claude Code skill: satellite data workflows

This skill guides Google Earth Engine workflows for satellite imagery, from filtering collections to computing zonal statistics and exporting results.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add muend/geoai-skills --skill google-earth-engine -a claude-code
Open on GitHub

What google-earth-engine does

The skill explains Earth Engine’s server-side model: images and collections describe computations, and results are produced when requested or exported. It covers composites, time series, zonal statistics, image classification, and choosing between GEE and local processing.

Examples include cloud masking for Sentinel-2, reducers with an explicit scale, image and table exports, and batch handling for long jobs. Avoid calling .getInfo() for each item in a loop; the skill identifies this as a common performance problem. For scientific methods, it points to remote-sensing-analysis or change-detection. Its platform guidance considers archive size, interactive limits, and the cost of reproducing server-side results.

What it helps with

  • build a cloud-masked Sentinel-2 composite
  • calculate NDVI statistics for polygons
  • create a time series from satellite imagery
  • choose between Earth Engine and local processing
  • export a large raster through batch tasks

Example prompts for the agent

  • Build a cloud-free Sentinel-2 composite for this area and date range.
  • Calculate mean NDVI for each polygon with an explicit resolution.
  • Compare Earth Engine with local processing for this image archive.

How to install google-earth-engine

1Skills CLI (Vercel)

npx skills add muend/geoai-skills --skill google-earth-engine -a claude-code

2Manually: put the files in place

~/.claude/skills/google-earth-engine/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/google-earth-engine/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about google-earth-engine

How do I install google-earth-engine in Claude Code?

Run npx skills add muend/geoai-skills --skill google-earth-engine -a claude-code. The skill file will be at ~/.claude/skills/google-earth-engine/SKILL.md.

What does google-earth-engine do?

It guides agents through Google Earth Engine workflows for satellite collections, composites, statistics, time series, classification, and exports.

Why does the skill set scale explicitly?

Some operations can use the map zoom level as their resolution, which may produce overly coarse statistics. The skill recommends setting the data’s native resolution or stating an intentional coarser scale.

Source text

SKILL.md · MIT
---
name: google-earth-engine
description: >-
  Invoke when Earth Engine, GEE, ee., or geemap is named; when work needs its
  server-side catalog; or when choosing Earth Engine versus local xarray or
  desktop processing for a large area or long archive. Covers image
  collections, masking, compositing, reducers, zonal statistics, time series,
  classification, quota-aware batching, and exports. This is an execution
  platform skill; combine it with remote-sensing-analysis or change-detection
  when those skills own the scientific method.
license: MIT
metadata:
  author: Muhammed Enes Duran
---

# Google Earth Engine

Purpose: use GEE's server-side model correctly. The recurring failure
modes are **client/server confusion** (calling `.getInfo()` in loops,
Python `if` on server objects), **unbounded computation** (timeouts from
unscaled reductions), and **silent default scales** (statistics computed
at the wrong resolution).

## Should this run here at all? — Earth Engine versus local

Answer this before writing any `ee.` code. The decision turns on six things, and
you cannot make it without them, so establish them first — asking alongside a
provisional recommendation, never instead of one:

1. **Archive extent and duration** — area, and how many years at what revisit.
   This is what makes server-side worth its constraints; a single scene does not.
2. **Algorithm expressibility** — can the work be written as masks, reducers and
   band math? Anything needing arbitrary per-pixel iteration, a custom solver, or
   a Python library GEE does not host belongs local.
3. **Data locality and sensitivity** — restricted or offline data cannot be
   uploaded, and that ends the discussion regardless of scale.
4. **Interactive limits versus batch** — see [Quotas and etiquette](#quotas-and-etiquette).
   Anything beyond a ~5 minute interactive request has to be designed as a batch
   export from the start, not retrofitted when `getInfo` times out.
5. **Export volume** — what actually comes back: a few reduced statistics, or
   full-resolution per-pixel stacks you will store and reprocess locally.
6. **Reproducibility cost** — the real price of moving server-side. The catalog
   version can shift under you and the computation leaves no local trace, so
   choosing GEE obliges you to ship the [provenance record](#provenance-record).
   State this cost when you recommend GEE; a recommendation that omits it is
   incomplete.

Recommend Earth Engine only when 1 and 2 favour it and 3 permits it. When the
answer is genuinely balanced, say so and name the deciding question rather than
defaulting to the platform this skill is about. `xee` and STAC + `stackstac` /
`odc-stac` are the middle paths worth naming: catalog access with local compute.

## Mental model — everything is deferred

`ee.Image`, `ee.ImageCollection`, `ee.FeatureCollection` are **server-side
descriptions**, not data. Nothing computes until an output is requested
(`getInfo`, export, map tile). Consequences:

- Never use Python `if`/`for` on server values — use `ee.Algorithms.If`
  sparingly, prefer `.map()` + filters. A Python loop that calls
  `.getInfo()` per element is the #1 GEE performance bug.
- `.getInfo()` blocks and transfers; use it for tiny scalars only.
  Anything sized → **Export** (to Drive/GCS/Asset).
- Debug with `.aggregate_array()`, `.first()`, `.limit(3)` probes — not by
  printing whole collections.

## Canonical pipeline (Sentinel-2 cloud-free composite)

```python
import ee
ee.Initialize(project="my-project")

aoi = ee.Geometry.Rectangle([27.0, 38.3, 27.4, 38.6])

def mask_s2(img):
    # Cloud Score+ is the current best practice (threshold ~0.5-0.65)
    cs = img.linkCollection(csplus, ["cs_cdf"]).select("cs_cdf")
    return img.updateMask(cs.gte(0.6))

csplus = ee.ImageCollection("GOOGLE/CLOUD_SCORE_PLUS/V1/S2_HARMONIZED")
s2 = (ee.ImageCollection("COPERNICUS/S2_SR_HARMONIZED")
      .filterBounds(aoi)
      .filterDate("2025-05-01", "2025-09-30")
      .map(mask_s2))
composite = s2.median().clip(aoi)
ndvi = composite.normalizedDifference(["B8", "B4"]).rename("ndvi")
```

Collection choices: `S2_SR_HARMONIZED` (post-2022 offset harmonized),
`LANDSAT/LC08/C02/T1_L2` + friends (apply scale factors: optical
`*0.0000275 - 0.2`), `MODIS/061/...` for daily/coarse, ERA5-Land for
climate. Record collection IDs + date filters in the deliverable.

## Reducers and zonal statistics — scale is not optional

```python
stats = ndvi.reduceRegions(
    collection=districts,
    reducer=ee.Reducer.mean().combine(ee.Reducer.stdDev(), sharedInputs=True),
    scale=10,                    # ALWAYS explicit — native resolution
    tileScale=4,                 # raise when "computation timed out"
)
```

- `scale` defaults to the map zoom level in some paths — silently coarse
  statistics. Always set it to the data's native resolution (or state the
  deliberate coarsening).
- `bestEffort=True` silently degrades scale to fit limits — avoid in
  analysis; prefer `tileScale` + exports.
- Large reductions → `Export.table.toDrive`, not `.getInfo()`.
- Weighted vs unweighted reducers differ at polygon edges
  (`.unweighted()` for counts of whole pixels); state which you used.

## Time series

- Build per-period composites with a mapped function over
  `ee.List.sequence` of dates (monthly/seasonal medians), then reduce —
  don't export daily stacks you'll aggregate anyway.
- For per-pixel trends: `ee.Reducer.sensSlope()` (robust) or
  `linearFit`; harmonic regression (`.addBands` of sin/cos terms) for
  phenology. Mask by count of valid observations — trends from 4 pixels
  of 200 possible are noise; report the count band.
- For break detection at archive scale (LandTrendr/CCDC available in GEE),
  method selection follows `change-detection`.

## Classification in GEE

`ee.Classifier.smileRandomForest` covers most cases. Training samples via
`image.sampleRegions`; split train/test **spatially** (add a grid-cell
attribute and filter — random `randomColumn` splits leak; see
`ml-experiment-standards` → `references/spatial-cv-protocol.md`). Report
per-class accuracy from `errorMatrix`; area estimates from a classified
map still need design-based adjustment (`change-detection` / Olofsson).

## Exports and hand-off

- `Export.image.toDrive/toCloudStorage` with explicit `region`, `scale`,
  `crs`, `maxPixels`; use `crsTransform` when pixel alignment with an
  existing raster matters.
- Export > ~10⁸ pixels: shard by tiles or use `toAsset` intermediate.
- Hand off to the local Python stack (rasterio/xarray) via COG exports, or
  `xee` for xarray-native access; visualize interactively with `geemap`.

## Quotas and etiquette

Batch tasks queue (check task status; don't fire hundreds blindly).
Interactive requests time out at ~5 min — long jobs go to batch export.
Cache intermediate products as assets when a pipeline reuses them.

## Provenance record

Server-side computation is invisible after the fact: the catalog moves under
you, a reducer default changes the number, and nothing in the exported file
says which archive produced it. Every Earth Engine deliverable ships with a
provenance record, emitted as a sidecar JSON next to the export — not left
in the notebook:

- **Catalog asset IDs with their version suffix** (`COPERNICUS/S2_SR_HARMONIZED`
  and the specific collection version), plus the date range and filters applied.
- **Mask method and thresholds** — cloud probability source, threshold value,
  and any morphological buffer.
- **Reducers and their arguments**, including `tileScale`, `bestEffort`, and
  any `crsTransform`.
- **Export parameters**: `region`, `scale`, `crs`, `maxPixels`, and the task ID.
- **Run date and the `ee.__version__` / API client version**, because
  server-side defaults change without notice.

Recommending Earth Engine over a local workflow is incomplete without this:
the reproducibility cost is the main thing the user trades away by moving
server-side, so state how it is recovered.

## Verification protocol

1. Probe: `composite.select("B4").projection().nominalScale().getInfo()`
   and band names — confirms scale/CRS assumptions before reductions.
2. Visual check in geemap at 2 zoom levels vs a basemap.
3. Cross-check one zonal statistic against a local computation on an
   exported clip (catches scale/masking discrepancies).
4. Report: collection IDs, date ranges, mask method + threshold, scale,
   reducer types.

## Pitfalls checklist

- `.getInfo()` inside a loop (move logic server-side).
- Missing `scale` in reduceRegion(s) → zoom-dependent statistics.
- Landsat C2 used without scale factors → reflectance > 1.
- `bestEffort=True` hiding resolution degradation.
- Median composite including cloudy pixels (mask BEFORE reduce).
- Python conditionals on server-side objects (always false-y).
- Trend maps without valid-observation-count masking.

## Execution contract

- **Workflow:** define collection and period; build a server-side mask and transform pipeline; test on a small region; compute; verify scale and projection; export reproducibly.
- **Decision rules:** use Earth Engine for planetary archives and scalable aggregation, local tools for sensitive or offline data, and batch exports for work beyond interactive limits.
- **Verification protocol:** probe bands, projection, scale, masks, and observation counts; inspect spatial samples; cross-check one exported statistic locally; record collection versions and parameters.
- **Failure modes:** stop for client-side loops, implicit scale, masked-pixel bias, quota-driven silent degradation, expired assets, or unbounded region operations.
- **Deliverables:** runnable script, collection and date manifest, mask and reducer parameters, task/export settings, verification evidence, and exported asset inventory.
- **Source freshness:** consult [the authoritative source registry](references/authoritative-sources.md) at execution time for catalog, API, quota, and policy changes.

© Muhammed Enes Duran · MIT · muend/geoai-skills

Similar skills

All skills for Data and databases →

From the same set18

network-accessibility-analysis Replaces straight-line buffers with true network travel costs across walking, transit, and driving modes. Builds isochrones and origin-destination matrices. CX Codex +1 ★ 35repo stars movement-trajectory This skill guides GPS/GNSS track cleaning, stop and trip detection, road matching, and flow aggregation. Use it when you need to turn timestamped locations into movement analysis. CX Codex +1 ★ 35repo stars ml-experiment-standards Makes the agent audit leakage, pick splits and justify metrics before a model gets trained. Useful when a result has to replicate, not just look good. CX Codex +1 ★ 35repo stars mcda-suitability-analysis Guides spatial multi-criteria suitability analysis, AHP factor weighting, and model sensitivity testing across GIS rasters. CX Codex +1 ★ 35repo stars geostatistics-interpolation A skill that turns sparse point measurements into a continuous surface and ships an uncertainty map alongside it. Handy when values between stations, wells or soundings have to be estimated. CX Codex +1 ★ 35repo stars geoai-orchestrator Routes complex multi-stage geospatial workflows across dedicated specialist skills while enforcing strict coordinate reference system and geometry rules. CX Codex +1 ★ 35repo stars geo-deep-learning Guides neural methods for geospatial imagery, from choosing a model to checking mapped predictions. Useful for segmentation, object detection, and spatial validation. CX Codex +1 ★ 35repo stars geo-data-engineering Keeps an agent on track when spatial data has to be fetched, cleaned or pushed through a pipeline that has to run again next month. CX Codex +1 ★ 35repo stars

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor