Beginner/Youth, Intermediate. Arts & Multimedia, Earth Science, Software.
Pair visualizations from NASA's Earth Information Center with sound generated in real time, so Earth science reaches people through hearing as well as sight.
Search and page APIs for thousands of NASA science visualizations, with links to frames, movies and data-driven animations of sea ice, temperature, carbon and more. A rich source of visuals to pair with sound.
Earth.gov hosts the Earth Information Center, which brings together federal Earth science data and stories on climate, water, fire, sea level and more. Use it to pick the themes and visuals a sonification should follow.
Ready-made map tiles for more than 1,000 NASA Earth layers (true color, fires, soil moisture, precipitation, night lights and more) served over WMTS with no login. The fastest way to put NASA Earth imagery on a web map or in a visualization.
Monthly global and regional surface temperature anomalies since 1880, downloadable as small CSV tables. A clean starting series for trend and significance testing.
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.
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`);
}
Global temperature trend per decadePython
import io
import numpy as np
import pandas as pd
import requests
url = "https://data.giss.nasa.gov/gistemp/tabledata_v4/GLB.Ts+dSST.csv"
text = requests.get(url, timeout=60).text
df = pd.read_csv(io.StringIO(text), skiprows=1, na_values="***")
df = df[["Year", "J-D"]].dropna() # annual global anomaly, deg C
# Least-squares trend since 1980
recent = df[df["Year"] >= 1980]
slope, intercept = np.polyfit(recent["Year"], recent["J-D"], 1)
print("years:", len(df), "| latest full year:", int(df["Year"].iloc[-1]))
print(f"trend since 1980: {slope * 10:.3f} C per decade")
# For significance, use scipy.stats.linregress (p-value) or pymannkendall.
Find NASA visualizations by topicPython
import requests
# Find NASA visualizations to pair with sound
r = requests.get("https://svs.gsfc.nasa.gov/api/search/",
params={"search": "sea surface temperature", "limit": 5}, timeout=60)
r.raise_for_status()
data = r.json()
print("matches:", data["count"])
for item in data["results"]:
print(item["id"], item["release_date"][:10], "|", item["title"])
# Full media list for one entry: https://svs.gsfc.nasa.gov/api/<id>
Fetch a GIBS true-color tileJavaScript
// Build a GIBS WMTS tile URL (no key, CORS enabled) for a given day.
// Layer names come from the GIBS capabilities document.
const layer = "MODIS_Terra_CorrectedReflectance_TrueColor";
const date = "2026-10-01";
const [zoom, row, col] = [2, 1, 2];
const url = `https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/${layer}` +
`/default/${date}/250m/${zoom}/${row}/${col}.jpg`;
const res = await fetch(url);
console.log(res.status, res.headers.get("content-type"), url);
// In a map library (Leaflet, OpenLayers) use the same template with
// {z}/{y}/{x}. Fire layers such as VIIRS_SNPP_Thermal_Anomalies_375m_All
// are vector tiles (.mvt, 500m matrix set); check the capabilities XML.
Related 2025 winners
Matched by theme. Study how they scoped the problem.
HerCode Space (Universal Event), Best Use of Storytelling, for "Stellar Stories: Space Weather Through the Eyes of Earthlings"