Satelliet voor en na: zie hoe je stad of polder veranderde
Kies een plek en twee jaren, en krijg twee wolkenvrije satellietbeelden naast elkaar met een schuif, plus een berekening van hoeveel water land werd.
geef_project("satelliet-voor-en-na")geef_bron("landsat")geef_bron("copernicus-sentinel2")geef_bron("nasa-gibs")
Ik heb het project, de geteste aanroepen en de valkuilen. Ik bouw een tool met Landsat, Copernicus Sentinel-2 en NASA GIBS en Worldview. Zo kan het eruitzien:
Dit bouw je zelf. Kopieer de prompt naar Claude, ChatGPT of Cursor, met de MCP-server aan, of volg de stappen hieronder.
Dit is een mockup, geen werkende versie, met de echte Landsat-beelden van 16 juli 2006 en 7 april 2025 (opgehaald op 17 oktober 2026, 23:33, via Planetary Computer) en de cijfers uit onze proefdraai van 16 en 17 oktober 2026. De MCP-server zet je aan met het adres op Voor AI.
Voor wie
Journalisten die een verhaal over nieuwbouw, natuur of havens willen laten zien, docenten aardrijkskunde, gemeenten en iedereen die wil zien hoe zijn woonplaats veranderde.
Wat je krijgt
Een pagina waar je een vak op de kaart trekt en twee jaren kiest. De app zoekt per jaar de helderste opname, toont beide beelden met een schuif en berekent het aandeel water. In de proefdraai op 16 en 17 oktober 2026 voor de Maasvlakte (vak 3,95 tot 4,10 graden oost, 51,92 tot 52,00 noord, ongeveer 92 km²): de USGS-catalogus had 2.383 Landsat-opnamen van dit vak sinds 1984, waarvan 292 met minder dan 10% wolken. De helderste opnamen: Landsat 5 op 16 juli 2006 en Landsat 9 op 7 april 2025. Volgens het waterbit in de kwaliteitsband was 68,7% van het vak water in 2006 en 53,9% in 2025: ongeveer 13 km² meer land, de aanleg van Maasvlakte 2. Daarnaast twee kant-en-klare beelden van NASA GIBS zonder account: een Landsat-jaarmozaïek uit de jaren 80 (datum 1985-12-01, nog zonder de westelijke havens) en Sentinel-2 op 30 meter van 12 mei 2025 (HLS_S30). De helderste Sentinel-2-opname in de Copernicus-catalogus van april en mei 2025 was die van 12 mei (0,007% wolken), maar de banden downloaden vraagt een account.
Landsat-opnamen van Amsterdam per satelliet: het meest Landsat 5 (2.047 opnamen), dan Landsat 8 en Landsat 7
Landsat-opnamen van Amsterdam per satelliet, oktober 2026, in opnamen. Totaal: 4.640; de grootste 8 van 8 categorieën staan in de grafiek. Landsat 5 is 44% van het totaal.
Zo zou je kunnen starten6 stappen
- 1
Tel wat er is: Landsat-aggregatie bij USGS
De STAC-server van USGS kent de aggregatie-extensie: in één aanroep het aantal opnamen per satelliet, en met query (eo:cloud_cover kleiner dan 10) ook het aantal heldere. Zo zie je voor je zoekt of een vak genoeg beelden heeft. Level-2 (landsat-c2l2-sr, gecorrigeerd voor de atmosfeer) begint in 1982; Landsat 1 tot en met 3 staan alleen in Level-1. Het vak in bbox is lengte,breedte (west, zuid, oost, noord).
https://landsatlook.usgs.gov/stac-server/aggregate?collections=landsat-c2l2-sr&bbox=3.95,51.92,4.10,52.00&aggregations=total_count,platform_frequency
{"aggregations":[{"name":"total_count","data_type":"integer","value":2383}, {"name":"platform_frequency","data_type":"frequency_distribution","overflow":0,"buckets":[ {"key":"LANDSAT_5","data_type":"string","frequency":919},{"key":"LANDSAT_7","data_type":"string","frequency":675}, {"key":"LANDSAT_8","data_type":"string","frequency":574},{"key":"LANDSAT_9","data_type":"string","frequency":207}, {"key":"LANDSAT_4","data_type":"string","frequency":8}]}], …} - 2
Zoek per jaar de helderste opname
Zoek met datetime (één seizoen), query op eo:cloud_cover en sortby=properties.eo:cloud_cover (met 'properties.' ervoor, anders HTTP 400). Laat met fields de bestanden en links weg (-assets,-links,-geometry), dat scheelt ruim 20 kB per opname. Sla Landsat 7 na mei 2003 over (strepen, ongeveer 22% van het beeld mist) en kies Tier 1 (T1) boven Tier 2 (T2). Let op: eo:cloud_cover geldt voor de hele scène van 185 km, niet voor jouw vak.
https://landsatlook.usgs.gov/stac-server/search?collections=landsat-c2l2-sr&bbox=3.95,51.92,4.10,52.00&datetime=2006-04-01T00:00:00Z/2006-09-30T23:59:59Z&query={"eo:cloud_cover":{"lt":10}}&sortby=properties.eo:cloud_cover&limit=5&fields=id,properties.datetime,properties.eo:cloud_cover,properties.platform,-assets,-links,-geometry,-bbox
{"type":"FeatureCollection","numberMatched":7,"numberReturned":5,"features":[ {"stac_version":"1.0.0","id":"LE07_L2SP_199024_20060910_20200914_02_T1_SR","collection":"landsat-c2l2-sr","type":"Feature", "properties":{"datetime":"2006-09-10T10:29:36.146817Z","eo:cloud_cover":0,"platform":"LANDSAT_7"}}, {…,"id":"LE07_L2SP_198024_20060717_20200914_02_T1_SR", … "platform":"LANDSAT_7"}}, {…,"id":"LT05_L2SP_198024_20060911_20200831_02_T2_SR", … "eo:cloud_cover":0,"platform":"LANDSAT_5"}}, {…,"id":"LT05_L2SP_199024_20060716_20200831_02_T1_SR","properties":{"datetime":"2006-07-16T10:33:06.013038Z","eo:cloud_cover":0,"platform":"LANDSAT_5"}}, …], …} - 3
Meet water en land via Planetary Computer
Bij USGS stuurt elke download (ook een miniatuur) je naar het inlogscherm. Microsoft Planetary Computer heeft dezelfde Collection 2 Level-2 zonder account, met een rekendienst erbij. Het id is korter: haal de verwerkingsdatum en _SR weg (LT05_L2SP_199024_20060716_20200831_02_T1_SR wordt LT05_L2SP_199024_20060716_02_T1). POST het vak als GeoJSON naar /item/statistics met assets=qa_pixel en categorical=true: je krijgt per QA-waarde het aantal pixels. Bit 7 (128) betekent water, bit 3 (8) wolk. Zonder max_size gaf een vergelijkbare vraag bij ESA WorldCover een HTTP 502.
curl -X POST "https://planetarycomputer.microsoft.com/api/data/v1/item/statistics?collection=landsat-c2-l2&item=LC09_L2SP_199024_20250407_02_T1&assets=qa_pixel&categorical=true&max_size=1024" \ -H 'Content-Type: application/json' -d '{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[3.95,51.92],[4.10,51.92],[4.10,52.00],[3.95,52.00],[3.95,51.92]]]}}'{"type":"Feature","geometry":{…},"properties":{"statistics":{"qa_pixel_b1":{"min":21762.0,"max":30048.0, … "count":93632.0, … "unique":12.0, "histogram":[[1689.0,33798.0,1041.0,49472.0,479.0,930.0,1257.0,893.0,3954.0,73.0,36.0,10.0], [21762.0,21824.0,21890.0,21952.0,22018.0,22080.0,22280.0,23826.0,23888.0,24082.0,24144.0,30048.0]], "valid_percent":100.0,"masked_pixels":0.0,"valid_pixels":93632.0, …}}}} - 4
Maak de twee beelden
Dezelfde dienst knipt een beeld uit: /item/bbox/<west,zuid,oost,noord>/800x600.png met assets red, green en blue en de color_formula die Planetary Computer zelf voor Landsat gebruikt (gamma RGB 2.7, saturation 1.5, sigmoidal RGB 15 0.55). Zonder die formule zijn de ruwe waarden te donker. Elke uitsnede was ongeveer 1,3 seconde en 210 tot 240 kB.
https://planetarycomputer.microsoft.com/api/data/v1/item/bbox/3.95,51.92,4.10,52.00/800x600.png?collection=landsat-c2-l2&item=LT05_L2SP_199024_20060716_02_T1&assets=red&assets=green&assets=blue&color_formula=gamma RGB 2.7, saturation 1.5, sigmoidal RGB 15 0.55&nodata=0
HTTP 200, Content-Type image/png, 237930 bytes (1,28 s) (de Maasvlakte in juli 2006: de oude Maasvlakte met de containerterminals, ten westen ervan nog open zee)
- 5
Sentinel-2: zoeken mag, downloaden vraagt een account
De Copernicus Data Space heeft een STAC-API zonder robots.txt. Zoek met POST en een CQL2-JSON-filter op eo:cloud_cover. De banden staan op S3 (s3://eodata/…) en de download-API geeft zonder token HTTP 401; de miniatuur (thumbnail) is wel open, maar dat is de hele tegel van 110 km in 9 kB. Voor echte Sentinel-2-pixels maak je een gratis account aan, of je gebruikt Planetary Computer (collectie sentinel-2-l2a) of de HLS-laag van NASA GIBS (stap 6).
curl -X POST "https://stac.dataspace.copernicus.eu/v1/search" \ -H 'Content-Type: application/json' -d '{"collections":["sentinel-2-l2a"],"bbox":[3.95,51.92,4.10,52.00],"datetime":"2025-04-01T00:00:00Z/2025-05-31T23:59:59Z","filter-lang":"cql2-json","filter":{"op":"<","args":[{"property":"eo:cloud_cover"},5]},"sortby":[{"field":"properties.eo:cloud_cover","direction":"asc"}],"limit":5,"fields":{"include":["id","properties.datetime","properties.eo:cloud_cover"],"exclude":["assets","links","geometry","bbox"]}}'{"type":"FeatureCollection","links":[{"rel":"next", … "token":"next:sentinel-2-l2a:S2A_MSIL2A_20250519T105711_N0511_R094_T31UET_20250519T150605"}}, …], "features":[ {"id":"S2B_MSIL2A_20250512T105619_N0511_R094_T31UET_20250512T133423","properties":{"eo:cloud_cover":0.006779,"datetime":"2025-05-12T10:56:19.024Z"}}, {"id":"S2B_MSIL2A_20250412T105619_N0511_R094_T31UET_20250412T132010","properties":{"eo:cloud_cover":0.012418,"datetime":"2025-04-12T10:56:19.024Z"}}, {"id":"S2C_MSIL2A_20250427T105641_N0511_R094_T31UET_20250427T163412","properties":{"eo:cloud_cover":0.026506,"datetime":"2025-04-27T10:56:41.025Z"}}, …]} - 6
Kant-en-klare beelden van NASA GIBS, ook uit de jaren 80
GIBS is een open WMS zonder sleutel. Voor voor-en-na zijn twee lagen handig: HLS_S30_Nadir_BRDF_Adjusted_Reflectance (Sentinel-2 omgerekend naar 30 meter, per dag sinds november 2015, tot 11 oktober 2026) en Landsat_WELD_CorrectedReflectance_TrueColor_Global_Annual (jaarmozaïeken, alleen met de datums 1983-12-01 tot 1985-12-01, 1988-12-01 tot 1990-12-01 en 1998-12-01 tot 2000-12-01). Welke datums een laag heeft, staat in GetCapabilities (2,6 MB) onder Dimension. In WMS 1.3.0 met EPSG:4326 is BBOX breedte,lengte. Een datum zonder opname geeft een zwart beeld en HTTP 200, geen fout (WELD op 1995-12-01: een zwarte JPEG van 3 kB). Controleer de bestandsgrootte en kijk ook zelf naar wolken.
https://gibs.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&LAYERS=Landsat_WELD_CorrectedReflectance_TrueColor_Global_Annual&CRS=EPSG:4326&BBOX=51.92,3.95,52.00,4.10&WIDTH=800&HEIGHT=600&FORMAT=image/jpeg&TIME=1985-12-01
HTTP 200, Content-Type image/jpeg, 53300 bytes (de oude Maasvlakte, grotendeels nog kaal zand; Maasvlakte 2 bestaat nog niet)
Hoe de bronnen samenkomen
- LandsatCopernicus Sentinel-2via
coördinaten (bbox) en datumLandsat gaat terug tot 1982 (Level-2) op 30 meter, Sentinel-2 begint in 2015 op 10 meter. Gebruik Landsat voor het 'voor' en Sentinel-2 voor een scherp 'na', en zeg dat de pixelgrootte verschilt.
- LandsatNASA GIBS en Worldviewvia
coördinaten en datum (GIBS-tijd TIME=JJJJ-MM-DD)GIBS levert kant-en-klare plaatjes uit Landsat (WELD) en uit Landsat en Sentinel-2 samen (HLS). Handig om snel te kijken of een datum helder was voordat je echte pixels ophaalt.
Laat AI het bouwen
Plak deze prompt in Claude, ChatGPT, Cursor of Lovable. Hij noemt de echte endpoints, de koppelsleutels en de valkuilen, zodat de assistent meteen werkende code schrijft. Controleer de uitkomst altijd met de bron zelf.
Bouw een web-app (Next.js met een kleine server-route, of Python met Flask) waarin ik op een kaart een vak teken en twee jaren kies. De app laat twee wolkenvrije satellietbeelden naast elkaar zien met een schuif, en berekent hoeveel procent van het vak water was in elk jaar.
Data, alle zonder sleutel:
1. Zoeken (USGS Landsat STAC): https://landsatlook.usgs.gov/stac-server/search?collections=landsat-c2l2-sr&bbox=<w,z,o,n>&datetime=<jaar>-04-01T00:00:00Z/<jaar>-09-30T23:59:59Z&query={"eo:cloud_cover":{"lt":10}}&sortby=properties.eo:cloud_cover&fields=id,properties.datetime,properties.eo:cloud_cover,properties.platform,-assets,-links,-geometry
Tellen: https://landsatlook.usgs.gov/stac-server/aggregate?collections=landsat-c2l2-sr&bbox=<w,z,o,n>&aggregations=total_count,platform_frequency
2. Beeld en meting (Microsoft Planetary Computer, data-API):
- Uitsnede: https://planetarycomputer.microsoft.com/api/data/v1/item/bbox/<w,z,o,n>/800x600.png?collection=landsat-c2-l2&item=<id>&assets=red&assets=green&assets=blue&color_formula=gamma RGB 2.7, saturation 1.5, sigmoidal RGB 15 0.55&nodata=0
- Statistiek: POST https://planetarycomputer.microsoft.com/api/data/v1/item/statistics?collection=landsat-c2-l2&item=<id>&assets=qa_pixel&categorical=true&max_size=1024 met het vak als GeoJSON-Feature in de body.
3. Sentinel-2 zoeken (Copernicus): POST https://stac.dataspace.copernicus.eu/v1/search met collections ["sentinel-2-l2a"], bbox, datetime en een CQL2-JSON-filter op eo:cloud_cover.
4. Kant-en-klare beelden (NASA GIBS WMS): https://gibs.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi?SERVICE=WMS&REQUEST=GetMap&VERSION=1.3.0&LAYERS=HLS_S30_Nadir_BRDF_Adjusted_Reflectance&CRS=EPSG:4326&BBOX=<z,w,n,o>&WIDTH=800&HEIGHT=600&FORMAT=image/jpeg&TIME=2025-05-12
Wat je moet weten:
- sortby moet properties.eo:cloud_cover of -properties.datetime zijn; zonder 'properties.' komt er een HTTP 400. fields houdt assets en links tenzij je -assets,-links meegeeft.
- eo:cloud_cover geldt voor de hele scène (185 km), niet voor het vak: tel ook de wolkpixels in het vak (QA-bit 3) en kies anders een andere opname.
- Sla Landsat 7 na 31 mei 2003 over (strepen) en kies Tier 1 (_T1_ in het id).
- USGS-id naar Planetary Computer-id: verwerkingsdatum en _SR eraf. LT05_L2SP_199024_20060716_20200831_02_T1_SR wordt LT05_L2SP_199024_20060716_02_T1.
- QA_PIXEL is een bitmasker: waarde & 128 = water, & 8 = wolk, & 16 = wolkschaduw. Water in procenten = pixels met bit 7 / alle pixels. Het aantal pixels verschilt per opname (andere baan): reken in procenten van het vak.
- Downloads bij USGS vragen een login; Copernicus-banden staan op S3 en de download-API geeft 401 zonder token. Planetary Computer en GIBS werken zonder account. Planetary Computer liep op 15 oktober 2026 ongeveer een week achter op USGS.
- Volgorde van coördinaten: STAC en Planetary Computer lengte,breedte; WMS 1.3.0 met EPSG:4326 breedte,lengte.
- Kies voor beide jaren hetzelfde seizoen als het kan: eb en vloed, natte zandvlakten en bladeren aan de bomen veranderen de meting.
- Bronvermelding: 'Landsat-beelden: USGS/NASA Landsat Program', Copernicus Sentinel-2 (bewerkt), NASA GIBS. Stuur een eigen User-Agent mee.
Uitkomst: kaart met teken-gereedschap, twee jaarkeuzes, een vergelijkschuif met beide beelden en hun datum en satelliet, en eronder 'Water: 68,7% (2006) en 53,9% (2025), ongeveer 13 km² meer land', met de kanttekening dat het waterbit een schatting is.
Probeer het zelf
De kern van het project in een klein script. Nodig: Python 3.10+ en requests. Getest op 2026-10-17; hieronder de echte uitvoer van die proefdraai.
# Satelliet voor en na: hoeveel land kwam er bij op de Maasvlakte tussen 2006 en 2025?
# Bronnen: Landsat (USGS STAC + Microsoft Planetary Computer), Copernicus Sentinel-2 (STAC), NASA GIBS (WMS). Geen sleutel.
import json, requests
UA = {"User-Agent": "mijn-project/1.0 (+jij@voorbeeld.nl)"}
VAK = [3.95, 51.92, 4.10, 52.00] # lengte/breedte: west, zuid, oost, noord (Maasvlakte)
USGS = "https://landsatlook.usgs.gov/stac-server"
PC = "https://planetarycomputer.microsoft.com/api"
WOLK = json.dumps({"eo:cloud_cover": {"lt": 10}})
# 1. Hoeveel Landsat-opnamen zijn er van dit vak, en hoeveel bijna wolkenvrij? Eén aanroep met de aggregatie-extensie.
agg = requests.get(f"{USGS}/aggregate", headers=UA, timeout=60, params={
"collections": "landsat-c2l2-sr", "bbox": ",".join(map(str, VAK)), "aggregations": "total_count,platform_frequency"}).json()
helder = requests.get(f"{USGS}/aggregate", headers=UA, timeout=60, params={
"collections": "landsat-c2l2-sr", "bbox": ",".join(map(str, VAK)), "query": WOLK, "aggregations": "total_count"}).json()
totaal = agg["aggregations"][0]["value"]
per = {b["key"]: b["frequency"] for b in agg["aggregations"][1]["buckets"]}
print(f"Landsat Level-2 boven het vak: {totaal} opnamen, {helder['aggregations'][0]['value']} met minder dan 10% wolken")
print(" per satelliet:", ", ".join(f"{k} {v}" for k, v in sorted(per.items())))
# 2. De helderste opname uit het voorjaar en de zomer van elk jaar. Landsat 7 heeft sinds 2003 strepen: sla die over,
# net als Tier 2 (T2, minder nauwkeurig gelegd).
def beste(jaar):
r = requests.get(f"{USGS}/search", headers=UA, timeout=60, params={
"collections": "landsat-c2l2-sr", "bbox": ",".join(map(str, VAK)), "query": WOLK, "limit": 20,
"datetime": f"{jaar}-04-01T00:00:00Z/{jaar}-09-30T23:59:59Z", "sortby": "properties.eo:cloud_cover",
"fields": "id,properties.datetime,properties.eo:cloud_cover,properties.platform,-assets,-links,-geometry"}).json()
return next(f for f in r["features"] if f["properties"]["platform"] != "LANDSAT_7" and "_T1_" in f["id"])
# 3. Planetary Computer: zelfde opname, maar zonder account. Tel per pixel het waterbit (bit 7) van de QA_PIXEL-band.
def water(usgs_id):
d = usgs_id.split("_") # LT05_L2SP_199024_20060716_20200831_02_T1_SR
pc_id = "_".join(d[:4] + d[5:7]) # -> LT05_L2SP_199024_20060716_02_T1
vlak = {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[
[VAK[0], VAK[1]], [VAK[2], VAK[1]], [VAK[2], VAK[3]], [VAK[0], VAK[3]], [VAK[0], VAK[1]]]]}}
st = requests.post(f"{PC}/data/v1/item/statistics", headers=UA, json=vlak, timeout=120, params={
"collection": "landsat-c2-l2", "item": pc_id, "assets": "qa_pixel", "categorical": "true", "max_size": 1024}).json()
aantallen, waarden = next(iter(st["properties"]["statistics"].values()))["histogram"]
nat = sum(n for n, v in zip(aantallen, waarden) if int(v) & 128)
beeld = requests.get(f"{PC}/data/v1/item/bbox/{','.join(map(str, VAK))}/800x600.png", headers=UA, timeout=120, params={
"collection": "landsat-c2-l2", "item": pc_id, "assets": ["red", "green", "blue"], "nodata": 0,
"color_formula": "gamma RGB 2.7, saturation 1.5, sigmoidal RGB 15 0.55"})
open(f"{pc_id}.png", "wb").write(beeld.content)
return pc_id, nat / sum(aantallen), len(beeld.content)
# Oppervlak van het vak in km2 (bij benadering, op 52 graden noorderbreedte).
km2 = (VAK[2] - VAK[0]) * 111.32 * 0.6157 * (VAK[3] - VAK[1]) * 111.32
uitkomst = {}
for jaar in (2006, 2025):
f = beste(jaar)
pc_id, aandeel, grootte = water(f["id"])
uitkomst[jaar] = aandeel
print(f"\n{jaar}: {f['properties']['platform']} {f['properties']['datetime'][:10]}, wolken (hele scène) {f['properties']['eo:cloud_cover']}%")
print(f" {pc_id}: water {aandeel:.1%} van het vak; beeld opgeslagen ({grootte // 1000} kB)")
print(f"\nVak {km2:.0f} km2: water {uitkomst[2006]:.1%} -> {uitkomst[2025]:.1%}, "
f"dus ongeveer {(uitkomst[2006] - uitkomst[2025]) * km2:.0f} km2 meer land")
# 4. Sentinel-2 (Copernicus): zoeken mag zonder account, de banden downloaden niet (401 zonder token).
s2 = requests.post("https://stac.dataspace.copernicus.eu/v1/search", headers=UA, timeout=60, json={
"collections": ["sentinel-2-l2a"], "bbox": VAK, "datetime": "2025-04-01T00:00:00Z/2025-05-31T23:59:59Z", "limit": 3,
"filter-lang": "cql2-json", "filter": {"op": "<", "args": [{"property": "eo:cloud_cover"}, 5]},
"sortby": [{"field": "properties.eo:cloud_cover", "direction": "asc"}]}).json()
s = s2["features"][0]
print(f"\nSentinel-2 helderst in april-mei 2025: {s['id'][:24]} … wolken {s['properties']['eo:cloud_cover']:.3f}%")
print(f" banden: {s['assets']['B04_10m']['href'][:40]}… (S3, account nodig)")
# 5. NASA GIBS: kant-en-klare beelden, open WMS. HLS_S30 = Sentinel-2 op 30 m; Landsat WELD = jaarmozaïek uit de jaren 80.
for laag, datum in [("Landsat_WELD_CorrectedReflectance_TrueColor_Global_Annual", "1985-12-01"),
("HLS_S30_Nadir_BRDF_Adjusted_Reflectance", s["properties"]["datetime"][:10])]:
r = requests.get("https://gibs.earthdata.nasa.gov/wms/epsg4326/best/wms.cgi", headers=UA, timeout=120, params={
"SERVICE": "WMS", "REQUEST": "GetMap", "VERSION": "1.3.0", "LAYERS": laag, "CRS": "EPSG:4326",
"BBOX": f"{VAK[1]},{VAK[0]},{VAK[3]},{VAK[2]}", "WIDTH": 800, "HEIGHT": 600, "FORMAT": "image/jpeg", "TIME": datum})
open(f"gibs_{laag[:10]}_{datum}.jpg", "wb").write(r.content)
print(f"GIBS {laag} {datum}: {r.status_code} {r.headers['Content-Type']} {len(r.content) // 1000} kB")
Landsat Level-2 boven het vak: 2383 opnamen, 292 met minder dan 10% wolken per satelliet: LANDSAT_4 8, LANDSAT_5 919, LANDSAT_7 675, LANDSAT_8 574, LANDSAT_9 207 2006: LANDSAT_5 2006-07-16, wolken (hele scène) 0% LT05_L2SP_199024_20060716_02_T1: water 68.7% van het vak; beeld opgeslagen (237 kB) 2025: LANDSAT_9 2025-04-07, wolken (hele scène) 0.23% LC09_L2SP_199024_20250407_02_T1: water 53.9% van het vak; beeld opgeslagen (211 kB) Vak 92 km2: water 68.7% -> 53.9%, dus ongeveer 13 km2 meer land Sentinel-2 helderst in april-mei 2025: S2B_MSIL2A_20250512T1056 … wolken 0.007% banden: s3://eodata/Sentinel-2/MSI/L2A/2025/05/1… (S3, account nodig) GIBS Landsat_WELD_CorrectedReflectance_TrueColor_Global_Annual 1985-12-01: 200 image/jpeg 53 kB GIBS HLS_S30_Nadir_BRDF_Adjusted_Reflectance 2025-05-12: 200 image/jpeg 72 kB
Waar het misgaat
- Wolken worden per scène geteld, niet per vak. Een scène van 185 km met 0% wolken is in jouw vak helder, maar een scène met 8% kan precies boven jouw polder bewolkt zijn. Tel daarom ook de wolkpixels (QA-bit 3) in je eigen vak. In de 2025-opname waren 1.257 van de 93.632 pixels in het vak als wolk gemarkeerd.
- Downloaden is bij elke bron anders geregeld: USGS stuurt elke download naar een inlogscherm, Copernicus geeft HTTP 401 zonder token (alleen een miniatuur van 9 kB is open), Planetary Computer en GIBS werken zonder account. Bouw je app op die laatste twee als je geen accounts wilt beheren.
- De ids verschillen tussen USGS en Planetary Computer (verwerkingsdatum en _SR vallen weg). Wie de USGS-id rechtstreeks aan Planetary Computer geeft, krijgt HTTP 404 ('No item … found in landsat-c2-l2 collection').
- Het waterbit is een schatting. Natte zandvlakten, schaduw en eb en vloed veranderen de uitkomst, en de twee opnamen komen uit een ander seizoen (juli 2006 en april 2025). Presenteer '13 km² meer land' als orde van grootte, niet als het officiële oppervlak van Maasvlakte 2.
- Coördinaten draaien om tussen diensten: STAC en Planetary Computer lengte,breedte (3.95,51.92,…), GIBS-WMS 1.3.0 met EPSG:4326 breedte,lengte (51.92,3.95,…). GIBS geeft bij een datum zonder opname gewoon een zwart plaatje terug met HTTP 200.
- Landsat 7 heeft sinds 31 mei 2003 strepen zonder data (ongeveer 22% van het beeld). De helderste opnamen van 2006 waren allebei Landsat 7; het script slaat ze over en neemt Landsat 5.
Verder bouwen
- Maak een tijdreeks in plaats van twee beelden: neem per jaar de helderste zomeropname sinds 1985 en teken het aandeel water of groen (NDVI uit red en nir08) als lijn. Zo zie je in welk jaar de Maasvlakte 2 uit zee kwam.
- Knip het vak uit op een gemeentegrens van PDOK (wijken en buurten) in plaats van een rechthoek, en meet hoeveel een gemeente versteende sinds 1985.
- Gebruik voor het 'na'-beeld echte Sentinel-2-pixels op 10 meter via Planetary Computer (collectie sentinel-2-l2a) of met een gratis Copernicus-account, en zet de scherpte naast die van Landsat.
- Maak een gif of video van alle heldere opnamen (292 voor de Maasvlakte) met de datum erin gebrand.
Meer met deze data
Landsat-opnamen van Amsterdam: 138 opnamen in 2025, 30% minder dan in 1985
Landsat-opnamen van Amsterdam, 1985 – 2025, in opnamen. Het hoogste punt was 1985 (196).
Nederland op een bijna wolkenloze 12 april 2025, gezien door de VIIRS-camera van NASA
Ware kleuren uit de kaartdienst GIBS van NASA, laag VIIRS_SNPP_CorrectedReflectance_TrueColor. Je ziet de Waddeneilanden, het IJsselmeer en de Flevopolders, de Zeeuwse delta en de lichte vlekken van de steden. De rechte naad rechts is de rand tussen twee overvluchten. Eén pixel is hier honderden meters: genoeg voor het land, te grof voor je straat.
De bronnen3

Landsat
De Amerikaanse Landsat-satellieten fotograferen de aarde al sinds 1972. Daarmee is het de langste reeks satellietbeelden die er is: boven Amsterdam alleen al 6.754 opnamen, de oudste van 5 september 1972. Detail: 30 meter per pixel, in de eerste jaren 60 meter.

Copernicus Sentinel-2Uitgewerkt
De Sentinel-2-satellieten fotograferen heel Nederland om de paar dagen, in dertien kleurbanden. Detailniveau: 10 meter per pixel.

NASA GIBS en WorldviewUitgewerkt
Meer dan duizend kaartlagen van NASA-satellieten, kant-en-klaar als afbeelding: van het dagelijkse ware-kleurenbeeld tot nachtlicht, branden en sneeuw.
Meer om te bouwen
Aardbevingentracker: elke beving op de kaart, met gemeente en woningenKaart
Buurtmonitor veiligheid: overlast en misdrijven per buurtDashboard
Dashboard asielopvang: landelijk en per gemeenteDashboard
Klimaatrisico-check voor een adresTool
Natuur in je buurt: welke soorten zijn er gezien en hoe groen is het?App
Natuurbrandkaart: risico van vandaag, hittepunten en verbrande natuurKaart