Spring til indhold

Grundfast
Luftfoto · Klimadatastyrelsens ortofoto

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.

Ortofoto © Klimadatastyrelsen · via Grundfast

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.

Eksempler
  • Fliser
    256 / 512 px
    curl "https://api.grundfast.dk/v1/orto/daekning?lon=12.526959&lat=55.708216" \
      -H "Authorization: Bearer $GRUNDFAST_API_KEY"

    Mere om Luftfoto →

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

20122025
Ortofoto © Klimadatastyrelsen · via Grundfast
Træk i skillelinjen. Begge billeder er de samme tolv tile-adresser — /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=YYYY

Et å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=2

Samme 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

svar hentet 24. september 2026
{
  "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=

Opret gratis konto

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' }],
  },
});
leaflet.jsjavascript
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

Luftfoto-endpoints og parametre
Endpoint / parameterSvarBetydning
GET /v1/orto/tile/:z/:x/:yimage/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=21 | 2Samme 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årstalEn 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=JSONHvilke å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/aargangeJSONDen 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øgleTile, 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?

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å

Begreber og guides

Luftfoto-API

Luftfotoet i dit eget kort — med historikken

Opret en gratis konto, lav en API-nøgle, og læg tilene i MapLibre eller Leaflet. Samme nøgle giver matrikel, bygninger, terræn og resten af ejendommen.

Gratis op til 5.000 kald/md · intet kreditkort · data fra Klimadatastyrelsen/Datafordeler, CC BY 4.0