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.

[Opret gratis konto](https://grundfast.dk/dashboard?mode=register) [Se dokumentationen](https://grundfast.dk/docs/api/orto-tile)

Kaldet

- [GET /v1/orto/tile/:z/:x/:y](https://grundfast.dk/docs/api/orto-tile)

Ortofoto © Klimadatastyrelsen · via Grundfast

Dortheavej 8, 2400 København NV

Luftfoto · Klimadatastyrelsen

svarede efter 1 ms

Luftfoto fra 15 årgange, 2012–2026

Fløjet over netop dette punkt — hver årgang som sine egne kortfliser.

**Ældste årgang**

2012

**Nyeste årgang**

2026

**Opløsning**

10 cm

**Fliser**

256 / 512 px

`GET /v1/orto/daekning?lon=12.526959&lat=55.708216` Prø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.

Eksempler

[Dortheavej 8–12, København NVDortheavej 8, 2400 København NV](https://grundfast.dk/ejendom/6022499/dortheavej-8-2400-koebenhavn-nv)

- LuftfotoKlimadatastyrelsenLuftfoto fra 15 årgange, 2012–2026Fløjet over netop dette punkt — hver årgang som sine egne kortfliser. **Ældste årgang**
 2012 **Nyeste årgang**
 2026 **Opløsning**
 10 cm **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 →](https://grundfast.dk/luftfoto-api?bfe=6022499)
- AdresserDAR7 adresser · Dortheavej 8 m.fl.Alle adgangsadresser på samme BFE
- MatriklenGeodatastyrelsenMatr.nr. 5as · 7.110 m²Utterslev, København
- BygningerBBR9 bygninger · opført 1890–2021Største: kontorejendom fra 1900
- Bygnings­polygonerGeoDanmark13 omrids tegnet3 omrids uden BBR-bygning
- Terræn og højderDHMHøjeste del 17,2 m over terræn · terræn 17,7 m o.h.10 af 13 bygninger målt
- ByggelinjerNaturbeskyttelses­lovenIngen af de 10 linjer gælder
- Lokalplaner og zonerPlandataByzone · Lokalplan 619Provstevejkvarteret · Ramme R24.E.8.4
- JordforureningRegionerne · kommunerneKortlagt V2 — påvist forurening · hele grundenOmrådeklassificeret byjord
- StøjMiljøstyrelsen53–57 dB ved adresserneVejtrafik, Lden · grunden kan et sted ligge højere · kortlægning 2022
- OversvømmelseKystdirektoratet · MiljøstyrelsenHverken stormflod eller lavning på grundenVandløb, grundvand og kloak er ikke med
- Ejendoms­vurderingVurderingsstyrelsen20,2 mio. kr (2020)Heraf grundværdi 19,6 mio. kr
- Kommuner og sogneDAGIKøbenhavn Kommune · Region HovedstadenTagensbo Sogn
- StednavneDanske StednavneBispebjerg · 242 m væk2 stednavne inden for 400 m

Vis alle 14 registre

[GET /v1/demo/property?bfe=6022499](https://grundfast.dk/v1/demo/property?bfe=6022499)1 kald · 14 registre · fra cache på 4 ms · sammensat 13. nov. kl. 21.09 på 1.792 ms

Dortheavej 8: kun det nyeste luftfoto dækker her

Venstre

Højre

GET /v1/demo/orto/daekning?lon=12.526959&lat=55.708216

**Årgange fløjet her**

15 af 15 2012–2026

**Kilde**

Klimadatastyrelsen ortofoto, 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

20122025Ortofoto © 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"
  }
}
```

Vis hele svaret (89 linjer)

Med din egen nøgle: `GET /v1/orto/daekning?lon=&lat=`

[Opret gratis konto](https://grundfast.dk/dashboard?mode=register)

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.js javascript

```
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 server Så 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 fra Kilde, 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ådgivere Historisk arealanvendelse i desk studyet: stod der industri, en tank eller en tankstation på grunden?](https://grundfast.dk/loesninger/miljoe-og-geoteknik)
- [Projektudviklere og arkitekter Luftfoto som baggrund under matrikel og bygninger i skitse- og feasibility-værktøjet.](https://grundfast.dk/loesninger/projektudvikling)
- [Investorer og due diligence Hvad er bygget, og hvornår? Årgangene side om side for hver ejendom i porteføljen.](https://grundfast.dk/loesninger/due-diligence)

Spørgsmål

## Ofte stillede spørgsmål

### Hvordan viser jeg en ejendom gennem tiden?

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.

### Hvad betyder daekker: null?

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.

### Kortet ser blødt ud på en retina-skærm — hvad gør jeg?

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.

### Er luftfotoet målfast — kan det bruges som situationsplan?

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.

### Hvad er forskellen på det keyede og det keyless endpoint?

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.

### Kan en AI-agent eller SDK’et bruge luftfotoet?

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-API Jordstykkets omrids at lægge oven på luftfotoet](https://grundfast.dk/matrikel-api)
- [Bygningspolygoner-API Bygningernes fodaftryk i samme projektion](https://grundfast.dk/bygningspolygoner-api)
- [Historik-API Hvad registrene sagde om ejendommen på en given dato](https://grundfast.dk/historik-api)
- [DHM-API Terræn- og bygningshøjder på samme punkt](https://grundfast.dk/dhm-api)
- [Ortofoto Begrebet forklaret](https://grundfast.dk/begreber/ortofoto)
- [Koordinatsystemer og geometri WGS84, EPSG:25832 og web-mercator](https://grundfast.dk/docs/koordinater)

Begreber og guides

- [EPSG:25832](https://grundfast.dk/begreber/epsg-25832)
- [DHM](https://grundfast.dk/begreber/dhm)

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.

[Opret gratis konto](https://grundfast.dk/dashboard?mode=register) [Se dokumentationen](https://grundfast.dk/docs/api/orto-tile)

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