Luftfoto-API — ortofoto i dit eget kort, år for år
Klimadatastyrelsens luftfoto som standard kort-tiles, du lægger direkte i MapLibre, Leaflet eller OpenLayers — med årgangene tilbage til 2012, så du kan se, hvad der stod på en grund, før der blev bygget.
Dortheavej 8, 2400 København NV
Luftfoto · Klimadatastyrelsen
Slår årgangene op …
- Fliser
- 256 / 512 px
GET /v1/orto/daekning?lon=12.526959&lat=55.708216Prøv en anden adresseÉn ejendom, live
Hvordan så grunden ud før?
Træk i skillelinjen og sammenlign to årgange luftfoto under den samme ejendom.
Søg i alle 2,7 mio. danske adresser — gratis, uden konto.
- Fliser
- 256 / 512 px
curl "https:// api.grundfast.dk/ v1/ orto/ daekning? lon=12.526959& lat=55.708216" \ -H "Authorization: Bearer $GRUNDFAST_API_KEY"
Dortheavej 8: slår årgangene op …
Henter dækningen …
GET /v1/demo/orto/daekning?lon=12.526959&lat=55.708216
- Årgange fløjet her
- …
- Kilde
- Klimadatastyrelsenortofoto, forår
Begge billeder er de samme kortfliser med hvert sit ?aar=, så de ligger pixel for pixel oven på hinanden — og matriklen og bygningerne fra registrene ligger oven på begge. Danmark fotograferes regionalt på skift, så de fleste steder har kun nogle af årene; et år, der ikke er fløjet her, tilbydes ikke.
Et område i forandring
Nordhavn, 2012 mod i dag
Samme greb over en hel bydel, der er bygget op af havnen: begge billeder er de samme kortfliser med hvert sit årstal.
Nordhavn, København
55.7085 N · 12.5985 Ø · 14 af 14 årgange fløjet her
/v1/orto/tile/17/…?aar=2012 og ?aar=2025 — så de ligger pixel for pixel oven på hinanden.Hvad du får
Et luftfoto, der opfører sig som et kortlag
Standard XYZ-tiles
/{z}/{x}/{y}Web-mercator (EPSG:3857) i 256×256 JPEG — ingen WMS og ingen reprojektion i klienten. Tilene lægger sig oven på dine matrikel- og bygningslag.
Årgange, der er ærlige
?aar=YYYYEt år, der ikke er fløjet over et tile, svarer 404 med en forklaring — aldrig et andet års foto under et gammelt årstal.
Hvilke år dækker netop her
/orto/daekningÉt kald svarer på, hvilke årgange der faktisk er fløjet over punktet, så en årstalsvælger kun viser år, der har et billede.
Skarpt på retina, ét kald
?dpr=2Samme tile-adresse i 512×512. Samme jord, samme afregning — kun billedet er større.
Prøv det
Spørg, hvilke årgange der dækker et punkt
Dækningsopslaget uden nøgle for punktet i Nordhavn ovenfor — det samme svar, der fylder årstalsvælgerne.
GET/v1/demo/orto/daekning?lon=12.5985&lat=55.7085
Nordhavn · 14 af 14 årgange fløjet
{ "punkt": { "lon": 12.5985, "lat": 55.7085 }, "tile": { "z": 15, "x": 17530, "y": 10251 }, "antal": 14, "antal_daekkede": 14, "aargange": [ { "aar": 2025, "oploesning_cm": 10, "daekker": true }, { "aar": 2024, "oploesning_cm": 10, "daekker": true }, { "aar": 2023, "oploesning_cm": 10, "daekker": true }, { "aar": 2022, "oploesning_cm": 10, "daekker": true }, { "aar": 2021, "oploesning_cm": 10, "daekker": true }, { "aar": 2020, "oploesning_cm": 10, "daekker": true }, { "aar": 2019, "oploesning_cm": 10, "daekker": true }, { "aar": 2018, "oploesning_cm": 10, "daekker": true }, { "aar": 2017, "oploesning_cm": 10, "daekker": true }, { "aar": 2016, "oploesning_cm": 12.5, "daekker": true }, { "aar": 2015, "oploesning_cm": 12.5, "daekker": true }, { "aar": 2014, "oploesning_cm": 10, "daekker": true }, { "aar": 2013, "oploesning_cm": 10, "daekker": true }, { "aar": 2012, "oploesning_cm": 10, "daekker": true } ], "meta": { "kilde": "Dataforsyningen ortofoto via Grundfast", "grundfast_version": "0.1.0" } }
Med din egen nøgle: GET /v1/orto/daekning?lon=&lat=
Kald det
Læg luftfotoet i dit kort
Peg kortet på /v1/orto/tile/{z}/{x}/{y} gennem en lille proxy på din egen server, så gf_live_-nøglen aldrig når browseren.
// MapLibre GL: luftfotoet som rasterlag. import maplibregl from 'maplibre-gl'; // Din egen server videresender til api.grundfast.dk med // Authorization: Bearer gf_live_… — nøglen hører ikke hjemme i browseren. const retina = window.devicePixelRatio > 1 ? '?dpr=2' : ''; const map = new maplibregl.Map({ container: 'kort', center: [12.5985, 55.7085], zoom: 17, style: { version: 8, sources: { luftfoto: { type: 'raster', tiles: [`https://din-server.dk/orto/{z}/{x}/{y}${retina}`], tileSize: 256, // XYZ-gitteret; 512-billedet tegnes skarpt heri maxzoom: 21, attribution: '© Klimadatastyrelsen · via Grundfast', }, }, layers: [{ id: 'luftfoto', type: 'raster', source: 'luftfoto' }], }, });
import L from 'leaflet'; const map = L.map('kort').setView([55.7085, 12.5985], 17); const retina = window.devicePixelRatio > 1 ? '?dpr=2' : ''; // Peg på din egen proxy — den sætter Authorization: Bearer gf_live_… L.tileLayer(`https://din-server.dk/orto/{z}/{x}/{y}${retina}`, { tileSize: 256, maxZoom: 21, attribution: '© Klimadatastyrelsen · via Grundfast', }).addTo(map);
Reference
Endpoints og parametre
| Endpoint / parameter | Svar | Betydning |
|---|---|---|
| GET /v1/orto/tile/:z/:x/:y | image/jpeg | Ét web-mercator XYZ-tile (EPSG:3857), 256×256. Ét tile = ét afregnet kald; public Cache-Control, så pan og zoom serveres fra browser og edge. |
| ?dpr=2 | 1 | 2 | Samme tile-adresse og samme jord i 512×512 — skarpt på retina for ét kald. Alt andet end 1 og 2 er en 400. |
| ?aar=YYYY | årstal | En tidligere årgang. Er året ikke fløjet over netop det tile, svarer endpointet 404 med en forklaring — aldrig dette års foto under et gammelt årstal. |
| GET /v1/orto/daekning?lon=&lat= | JSON | Hvilke årgange der faktisk dækker punktet: daekker true/false pr. år, null når det ikke kunne afgøres. Ét kald, cachet pr. z15-tile (~1,2 km). |
| GET /v1/orto/aargange | JSON | Den nationale liste over udgivne årgange med lag og opløsning — hvad tjenesten har, ikke hvad der dækker et bestemt sted. |
| GET /v1/demo/orto/* | uden nøgle | Tile, daekning og aargange uden nøgle, IP-begrænset — til en offentlig kortvisning på dit eget site. |
En tile-proxy på din egen serverSå nøglen bliver på serveren, og 404 for et ikke-fløjet år når kortet uændret
// En tile-proxy på din egen server (Bun / Node 18+). Nøglen bliver her. Bun.serve({ async fetch(req) { const url = new URL(req.url); const m = url.pathname.match(/^\/orto\/(\d+)\/(\d+)\/(\d+)$/); if (!m) return new Response('Not found', { status: 404 }); const upstream = `https://api.grundfast.dk/v1/orto/tile/${m[1]}/${m[2]}/${m[3]}${url.search}`; const res = await fetch(upstream, { headers: { Authorization: `Bearer ${process.env.GRUNDFAST_API_KEY}` }, }); // Videregiv status (404 = året er ikke fløjet her), billedtype og cache-politik. const headers = new Headers(); for (const h of ['content-type', 'cache-control']) { const v = res.headers.get(h); if (v) headers.set(h, v); } return new Response(res.body, { status: res.status, headers }); }, });
Hvor billederne kommer fraKilde, flyvning og hvad der sker uden for dækning
Tilene hentes fra Klimadatastyrelsens ortofoto på Dataforsyningen (CC BY 4.0) i web-mercator og skæres i XYZ-tiles; den aktuelle mosaik er forårsflyvningen, løvfri, så tage og fodaftryk står skarpt. Et tile helt uden for Danmark kommer tilbage som et blankt billede (200) for den aktuelle mosaik, mens en ældre årgang, der ikke dækker tilet, svarer 404. Kolde tiles hentes fra upstream og caches derefter i Redis og via Cache-Control: public, så et kortudsnit koster få kald. Kreditér © Klimadatastyrelsen på kortet.
Hvem bruger det
Hvad stod der på grunden, før der blev bygget?
- Miljø- og geoteknikrådgivereHistorisk arealanvendelse i desk studyet: stod der industri, en tank eller en tankstation på grunden?
- Projektudviklere og arkitekterLuftfoto som baggrund under matrikel og bygninger i skitse- og feasibility-værktøjet.
- Investorer og due diligenceHvad er bygget, og hvornår? Årgangene side om side for hver ejendom i porteføljen.
Spørgsmål
Ofte stillede spørgsmål
Sæt ?aar=YYYY på tile-endpointet. Den nationale serie går fra 2012 til 2025, men Danmark flyves i en regional rotation, så ikke alle år dækker alle steder. Spørg derfor først GET /v1/orto/daekning?lon=&lat= og tilbyd kun de år, hvor daekker er true. Et år, der ikke dækker et tile, svarer 404 med en forklaring i stedet for at falde tilbage på et andet års foto.
At opslaget ikke nåede at afgøre det — fx fordi upstream ikke svarede. true og false er begge målinger; null er ingen af delene. Vis aldrig null som “ikke fløjet her”: i en gennem-tiden-visning læses et manglende foto som en manglende bygning.
Tilføj ?dpr=2. Så renderes samme tile-adresse i 512×512 i stedet for 256×256 og dækker nøjagtig samme jord, så tilene lander samme sted. Det er ét kald og én afregnet enhed — at zoome ét niveau ind for samme skarphed koster fire. Behold tileSize 256 i MapLibre og Leaflet; det større billede tegnes blot skarpere.
Nej. Et ortofoto er en orienteringsbaggrund, ikke målfast, og kommunen accepterer det ikke som situationsplan. Læg matrikel- og bygningsomridset ovenpå og markér kortet som vejledende; til en ansøgning bruges tegningen fra de officielle matrikel- og bygningsdata.
GET /v1/orto/tile/:z/:x/:y kræver en gf_live_-nøgle og måles pr. tile — til din egen produktion. /v1/demo/orto/* er uden nøgle og begrænset pr. IP, tænkt til en offentlig kortvisning; det er den, Grundfasts egne ejendomssider bruger. Begge leverer samme luftfoto.
De to JSON-endpoints, ja: gf.ortoAargange() og gf.ortoDaekning(lon, lat) i SDK’et, og MCP-værktøjet orto_luftfoto_aargange, så en agent kan spørge “hvilke luftfoto-årgange findes der over den her ejendom”. Selve tilene er JPEG og hentes over HTTP.
Se også
- Matrikel-APIJordstykkets omrids at lægge oven på luftfotoet
- Bygningspolygoner-APIBygningernes fodaftryk i samme projektion
- Historik-APIHvad registrene sagde om ejendommen på en given dato
- DHM-APITerræn- og bygningshøjder på samme punkt
- OrtofotoBegrebet forklaret
- Koordinatsystemer og geometriWGS84, EPSG:25832 og web-mercator
Begreber og guides
Luftfoto-API
Luftfotoet i dit eget kort — med historikken
Gratis op til 5.000 kald/md · intet kreditkort · data fra Klimadatastyrelsen/Datafordeler, CC BY 4.0