google-earth-engine
Skill39 starsChanged 4 months agoMITView on GitHub
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.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- Muhammad-Tariq/webgis-claude-skillstheir own version, first seen Oct 15, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- Muhammad-Tariq/webgis-claude-skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository17 other files it gives its agents.
- arcgis-pro-automationSkill
- cartography-geovizSkill
- change-detectionSkill
- geoai-orchestratorSkill
- geo-data-engineeringSkill
- geo-deep-learningSkill
- geostatistics-interpolationSkill
- mcda-suitability-analysisSkill
- ml-experiment-standardsSkill
- movement-trajectorySkill
- network-accessibility-analysisSkill
- point-cloud-lidarSkill
- postgis-spatial-sqlSkill
- remote-sensing-analysisSkill
- spatial-statisticsSkill
- swe-devops-standardsSkill
- terrain-hydrologySkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 59
Never use Python if/for on server values — use ee.Algorithms.If sparingly, prefer .map() + filters.
- Distinctive: line 195
Decision rules: use Earth Engine for planetary archives and scalable aggregation, local tools for sensitive or offline data, and batch …
- Distinctive: line 197
Failure modes: stop for client-side loops, implicit scale, masked-pixel bias, quota-driven silent degradation, expired assets, or unbounded …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
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:
- 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.
- 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.
- Data locality and sensitivity — restricted or offline data cannot be uploaded, and that ends the discussion regardless of scale.
- Interactive limits versus batch — see Quotas and etiquette.
Anything beyond a ~5 minute interactive request has to be designed as a batch
export from the start, not retrofitted when
getInfotimes out. - Export volume — what actually comes back: a few reduced statistics, or full-resolution per-pixel stacks you will store and reprocess locally.
- 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. 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/foron server values — useee.Algorithms.Ifsparingly, 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)
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
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"
)scaledefaults 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=Truesilently degrades scale to fit limits — avoid in analysis; prefertileScale+ 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.sequenceof dates (monthly/seasonal medians), then reduce — don't export daily stacks you'll aggregate anyway. - For per-pixel trends:
ee.Reducer.sensSlope()(robust) orlinearFit; harmonic regression (.addBandsof 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/toCloudStoragewith explicitregion,scale,crs,maxPixels; usecrsTransformwhen pixel alignment with an existing raster matters.- Export > ~10⁸ pixels: shard by tiles or use
toAssetintermediate. - Hand off to the local Python stack (rasterio/xarray) via COG exports, or
xeefor xarray-native access; visualize interactively withgeemap.
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_HARMONIZEDand 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 anycrsTransform. - 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
- Probe:
composite.select("B4").projection().nominalScale().getInfo()and band names — confirms scale/CRS assumptions before reductions. - Visual check in geemap at 2 zoom levels vs a basemap.
- Cross-check one zonal statistic against a local computation on an exported clip (catches scale/masking discrepancies).
- Report: collection IDs, date ranges, mask method + threshold, scale, reducer types.
Pitfalls checklist
.getInfo()inside a loop (move logic server-side).- Missing
scalein reduceRegion(s) → zoom-dependent statistics. - Landsat C2 used without scale factors → reflectance > 1.
bestEffort=Truehiding 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 at execution time for catalog, API, quota, and policy changes.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

