Intermediate, Advanced. Arts & Multimedia, Earth Science, Software.
Build a decision-support tool that combines NASA Earth observations with local soil, crop and farmer priorities to help choose crop rotations that protect soil and conserve water.
Point and regional time series of temperature, precipitation, solar radiation, humidity and wind from satellite and model data, returned as JSON or CSV with no key. Ideal for a farm decision tool or a quick climate trend for any location.
Daily global surface soil moisture at 9 km from the SMAP radiometer, available since 2015. Useful for judging field water stress and comparing seasons.
CMR short name SPL3SMP_E, concept ID C2938664763-NSIDC_CPRD, GIBS layer SMAP_L3_Passive_Enhanced_Day_Soil_Moisture
Landsat surface reflectance resampled to match Sentinel-2 on a common 30 m grid, so fields can be tracked every few days. The Sentinel-2 half is HLSS30; both come as Cloud Optimized GeoTIFFs.
CMR short name HLSL30, concept ID C2021957657-LPCLOUD, GIBS layer HLS_L30_Nadir_BRDF_Adjusted_Reflectance
Daily global precipitation at about 10 km merged from the GPM satellite constellation and gauges, back to 2000. The Final run lags real time by a few months.
CMR short name GPM_3IMERGDF, concept ID C2723754864-GES_DISC
Starter code
List daily SMAP soil moisture filesPython
import earthaccess
# Daily 9 km SMAP soil moisture over Iowa farmland
results = earthaccess.search_data(
short_name="SPL3SMP_E",
bounding_box=(-96.6, 40.4, -90.1, 43.5),
temporal=("2026-06-01", "2026-06-30"),
count=5,
)
print(len(results), "daily files")
for g in results:
print(g["umm"]["GranuleUR"])
# earthaccess.login() # needed to download the HDF5 files
# earthaccess.download(results, "./smap")
Find low-cloud HLS scenes over a farmPython
import earthaccess
# 30 m HLS Landsat scenes over a single farm area, low cloud only
results = earthaccess.search_data(
short_name="HLSL30",
bounding_box=(-93.7, 41.9, -93.5, 42.1), # near Ames, Iowa
temporal=("2026-05-01", "2026-09-30"),
cloud_cover=(0, 20),
count=5,
)
print(len(results), "scenes")
for g in results:
print(g["umm"]["GranuleUR"])
# Each scene has one Cloud Optimized GeoTIFF per band.
# earthaccess.login()
# earthaccess.download(results[:1], "./hls")
Season rainfall for one farmPython
import requests
# Daily temperature, rain and sunlight for one farm, no key needed
params = {
"parameters": "T2M,PRECTOTCORR,ALLSKY_SFC_SW_DWN",
"community": "AG",
"latitude": 42.03, "longitude": -93.63,
"start": "20250501", "end": "20250930",
"format": "JSON",
}
r = requests.get("https://power.larc.nasa.gov/api/temporal/daily/point",
params=params, timeout=120)
r.raise_for_status()
data = r.json()["properties"]["parameter"]
rain = data["PRECTOTCORR"]
print("days:", len(rain))
print("season rainfall (mm):", round(sum(v for v in rain.values() if v >= 0), 1))
Daily temperature in the browserJavaScript
// Runs in the browser or Node 18+ (POWER sends CORS headers)
const params = new URLSearchParams({
parameters: "T2M,PRECTOTCORR",
community: "AG",
latitude: "42.03",
longitude: "-93.63",
start: "20250701",
end: "20250707",
format: "JSON",
});
const res = await fetch(`https://power.larc.nasa.gov/api/temporal/daily/point?${params}`);
const json = await res.json();
const temps = json.properties.parameter.T2M;
for (const [day, t] of Object.entries(temps)) {
console.log(day, `${t} C`);
}
Try a live search
Ask NASA's Common Metadata Repository for the five newest files in SMAP Enhanced L3 Radiometer Global Daily 9 km Soil Moisture (SPL3SMP_E) V006. This runs in your browser and needs no login.
Related 2025 winners
Matched by theme. Study how they scoped the problem.
Zumorroda-X (Egypt), Art & Technology, for "NASA Farm Navigators"