Spring til indhold

Register #12 — live

Byggelinje-API — § 15–19 og § 3 på ét koordinat

Strand, sø, å, fortidsminde, kirke, skov, diger og § 3-natur — ti linjer på ét opslag, med fortegnet afstand til kanten, så et tegneværktøj kan sige “flyt bygningen otte meter” i stedet for kun “nej”. Svaret er linjerne og deres attributter — aldrig en dom over et projekt.

GET /v1/natur/byggelinjer

Hvad byggelinje-API’et giver dig

Ti linjer, ét kald, én enhed

Strandbeskyttelse og klitfredning (§ 15), sø og å (§ 16), skov (§ 17), fortidsminde (§ 18), kirke (§ 19), § 3-natur og § 3-vandløb, samt beskyttede sten- og jorddiger. Et tegneværktøj, der slår op hver gang brugeren trækker i bygningen, skal ikke lave seks rundture for ét spørgsmål.

Afstanden til kanten, med fortegn

afstand_m er meter til nærmeste kant — NEGATIV inde, POSITIV ude. “−4,2” læses som “flyt bygningen 4,2 m, så er du ude”, og “+11,8” som “du har 11,8 m luft”. Det er forskellen på et ja/nej og noget, en husejer kan handle på.

Tre kilder, samlet uden at du mærker det

Strandbeskyttelseslinjen er ikke et Miljøportal-tema — den er tinglyst PÅ MATRIKLEN af Geodatastyrelsen med én flade pr. jordstykke, og fortidsmindelinjerne kommer fra Slots- og Kulturstyrelsen. Tre værter, tre formater, ét svar.

Et nej er målt — også når én kilde er nede

Svigter en enkelt kilde, får netop den linje status "utilgaengelig" og inden_for null, mens de øvrige ni svarer normalt. Et inden_for: false kommer aldrig af en fejl — læs status før inden_for, så kan et nedbrud ikke læses som “byg du bare”.

Slå et koordinat op

Endpointet er GET /v1/natur/byggelinjer?lon=&lat= med en gf_live_-nøgle — samme auth og metering som de øvrige registre, og ét kald koster én enhed. Slå op på den nye bygnings eget punkt, ikke på ejendommens: linjerne er polygoner og kan skære tværs gennem en grund. Har du kun en adresse, slår du den op i DAR først:

terminalbash
curl -H "Authorization: Bearer gf_live_…" \
  "https://api.grundfast.dk/v1/natur/byggelinjer?lon=15.1450245&lat=55.1385081"

Afstanden, ikke kun ja/nej

Inden for en skovbyggelinje er man inden for, og så er der ikke mere at sige. Men for strand-, sø- og fortidsmindelinjen er hvor tæt er jeg på kanten et rigtigt spørgsmål: husejeren kan flytte bygningen otte meter og være ude. Derfor bærer hvert svar afstand_m — meter til nærmeste kant af den nærmeste linje, der gælder, med fortegn: negativ inde, positiv ude. En størrelse alene ville tvinge kalderen til at udlede siden af en anden boolean, og den slags to-felts-slutning bliver skrevet forkert ned én gang og bliver ved med at være forkert.

Tallet er regnet i EPSG:25832, hvor en koordinatenhed ér en meter, og afrundet til 0,1 m — registrene er digitaliserede kortlinjer, ikke opmålte skel, så en centimeter i svaret ville foregive en præcision, data ikke har. Er der intet inden for soegeradius_m (500 m som standard), er feltet null frem for et gæt. Og afstanden er en bekvemmelighed, ikke svaret: inden_for er det autoritative bud på hvilken side du er på, og fejler afstandsopslaget, svarer linjen stadig.

Ti registre, tre værter — og én fælde, der går igen

Seks af linjerne ligger på Danmarks Miljøportals åbne DAI-GeoServer. Fortidsmindebeskyttelseslinjerne gør ikke — de kommer fra Slots- og Kulturstyrelsens Fund og Fortidsminder. Og strandbeskyttelse og klitfredning er slet ikke miljødata: de er tinglyst på matriklen af Geodatastyrelsen, én temaflade pr. jordstykke, og hentes fra Datafordeleren — samme service, som vores matrikelregister allerede læser jordstykker fra.

Fælden fra skovbyggelinjerne går igen under et andet navn. På sø- og åbeskyttelseslinjerne står linjens egen tilstand i Kategori_kode og registreringens i Statuskode: 50 sø- og 95 åpolygoner er ophævede linjer, hvis registrering stadig står som “Gældende / Vedtaget”. Læser man kun status, melder man byggeforbud, hvor der ikke er noget. Vi læser linjen, og de ophævede følger med i ophaevede som dokumentation — en ophævet linje og ingen linje ser ens ud i en boolean og er meget forskellige ved kommunens skrivebord.

To detaljer mere fra samme lag: Kategori_kode 0 hedder “Ikke udfyldt” — linjens egen tilstand er blank, så svaret bliver et ja med usikker: true. Og kode 4 er slet ikke en linje: det er selve søen, der kaster linjen, gemt i samme tabel som linjerne, og den tæller hverken som gældende eller ophævet.

Status & datakontrakt

LiveRegister #12 — ti linjer over tre kilder, ét kald, én afregnet enhed.
# Live nu — Register #12 (Bearer gf_live_…):
GET /v1/natur/byggelinjer?lon=15.1450245&lat=55.1385081200  { punkt: { lon: 15.1450245, lat: 55.1385081 },
         epsg25832: [891471.9, 6127457.46],
         soegeradius_m: 500,
         antal_i_kraft: 2,
         utilgaengelige: [],          # tom = alle ti linjer blev faktisk besvaret
         linjer: {
           strandbeskyttelse: { navn: "Strandbeskyttelseslinje",
                                hjemmel: "naturbeskyttelsesloven § 15",
                                status: "ok",
                                inden_for: true,      # MÅLT — aldrig et nedbrud
                                usikker: false,
                                afstand_m: -1.5,      # 1,5 m INDE → flyt 1,5 m og du er ude
                                antal: 1, geometri: "flade" },
           fortidsminde:      { inden_for: true,  afstand_m: -22.9,
                                traef: { anlaegstype: "Rundhøj", datering: "Stenalder",
                                         fredningsstatus: "A",
                                         dokument_url: "http://www.kulturarv.dk/…" } },
           kirke:             { inden_for: false, afstand_m: 190.8 },   # 190,8 m UDE
           dige:              { inden_for: false, afstand_m: 484.3,
                                geometri: "linje" },  # diger er linjer, ikke zoner
           natur3:            { inden_for: false, afstand_m: 22.7 },
           klitfredning:      { inden_for: false, afstand_m: null },    # intet inden for 500 m
           soe:, aa:, skov:, vandloeb3:} }

# Sø-linjen er OPHÆVET her — men registreringen står stadig som "Gældende / Vedtaget":
GET /v1/natur/byggelinjer?lon=9.2212583&lat=55.3608007200  { linjer: { soe: { inden_for: false,      # linjen gælder ikke — det er Kategori_kode
                          ophaevede: [ { kategori: { kode: 3,
                                           navn: "Beskyttelseslinje ophævet - statslig afgørelse" },
                                         status:   { kode: 3, navn: "Gældende / Vedtaget" } } ] } } }

# Linjen står, men ingen VEDTAGET registrering bag den:200  { linjer: { soe: { inden_for: true, usikker: true,} } }
       # usikker kvalificerer altid et JA — aldrig et nej.

# Én kilde svigter — de øvrige ni svarer stadig:200  { linjer: { soe: { status: "utilgaengelig", inden_for: null, afstand_m: null } },
         utilgaengelige: ["soe"] }
       # ALDRIG inden_for: false på en linje vi ikke kunne læse.

# Demo-datakontrakten virker uden nøgle:
GET /v1/demo/byggelinjer
GET/v1/natur/byggelinjer?lon=&lat=
live

Alle ti byggelinjer og § 3-registre ved et WGS84-koordinat, med fortegnet afstand til kanten. Kræver gf_-nøgle; DAWA-stilen x/y/srid virker også.

GET/v1/demo/byggelinjer
live

Datakontrakten uden nøgle — et rigtigt opslag fra Bornholm, 1,5 m inde i strandbeskyttelseslinjen og 23 m inde i en fortidsmindelinje.

Hvad registret ikke er

Det er ikke en dom over dit projekt, og det er med vilje. Paragrafferne ligner ikke hinanden: § 16 stk. 2 og § 18 stk. 2 har hver deres undtagelseslister, og de ligner ikke § 17 stk. 2’s. Strandbeskyttelsen administreres af Kystdirektoratet og ikke af kommunen. Og § 3-beskyttelsen er deklaratorisk: et areal kan være beskyttet uden at stå i registret, og et registreret areal kan vise sig ikke at være beskyttet, fordi beskyttelsen følger naturen på stedet frem for kortet. Derfor bærer svaret hverken kraever_dispensation eller forbudt. Vi kender geometrien; I kender projektet.

Registret svarer heller ikke på fredninger, lokalplaner, kystnærhedszonen eller kirkeomgivelsesfredninger, og jordforurening er sit eget register. § 17 i dybden — ophævede polygoner, forslag, konflikt — ligger fortsat på sit eget endpoint; skov-nøglen her besvares af nøjagtig samme opslag, så de to kan ikke være uenige.

Kom i gang med byggelinjerne

Opret en gratis nøgle i dashboardet og send dit første koordinat — eller kald /v1/demo/byggelinjer med det samme og se datakontrakten uden nøgle.

Se også

Ofte stillede spørgsmål

Hvilke linjer svarer API’et på?

Ti: strandbeskyttelseslinjen og klitfredningslinjen (naturbeskyttelseslovens § 15), søbeskyttelseslinjen og åbeskyttelseslinjen (§ 16), skovbyggelinjen (§ 17), fortidsmindebeskyttelseslinjen (§ 18), kirkebyggelinjen (§ 19), § 3-beskyttet naturtype (eng, hede, mose, overdrev, strandeng, sø) og § 3-beskyttet vandløb, samt beskyttede sten- og jorddiger efter museumslovens § 29 a. Alle ti nøgler er ALTID med i svaret, også når linjen ikke rammer punktet — så en manglende nøgle aldrig kan læses som et nej.

Hvorfor ét endpoint i stedet for ét pr. linje?

Fordi spørgsmålet aldrig er “ligger jeg i en skovbyggelinje”, men “er der overhovedet noget, der stopper mig her”. Et tegneværktøj slår op på den nye bygnings eget punkt hver gang brugeren trækker i den; seks endpoints ville være seks rundture og seks afregnede kald for én bevægelse. Her er det ét kald og ÉN enhed. Vi fanner selv ud parallelt til de ti registre på de tre værter; et helt koldt opslag måler 0,6–1,1 sekund, og svaret caches derefter et døgn pr. koordinat.

Hvad betyder afstand_m, og hvornår er den null?

Det er meter til nærmeste kant af den nærmeste linje, der GÆLDER, med fortegn: negativ når du er inde, positiv når du er ude, afrundet til 0,1 m. −4,2 betyder “flyt bygningen 4,2 m, så er du ude”; +11,8 betyder “du har 11,8 m luft”. Den er null, når der ikke er noget inden for søgeradius (soegeradius_m, som standard 500 m), og når geometrien ikke kunne læses. Feltet er en bekvemmelighed, ikke svaret: inden_for er det autoritative bud på hvilken side af linjen du er på, og afstanden fortæller kun hvor langt. Skovbyggelinjen har bevidst ingen afstand — dens polygoner er to størrelsesordener større end de øvrige (én af dem måler 542 kB), så at hente geometrien for at pynte på en boolean ville dominere hele opslaget.

Hvorfor er strandbeskyttelseslinjen den vigtigste?

Fordi den er den eneste, hvor forbuddet er ABSOLUT, og hvor det er Kystdirektoratet — ikke kommunen — der administrerer det. Der findes ingen § 17 stk. 2-agtig liste over garager under 50 m², der bare er undtaget. En carport inden for strandbeskyttelseslinjen kræver dispensation fra Kystdirektoratet, og de gives sjældent. Danmark er et kystland, så det er også den linje, hvor “vi sagde ingenting” koster mest. Den er derfor den første nøgle i svaret.

Kan inden_for: false komme af en upstream-fejl?

Nej. Et false er det svar, nogen bruger til at konkludere, at netop den regel ikke rammer dem, så det må kun komme af et opslag der lykkedes. Kan en kilde ikke nås, svarer den med noget, der ikke er en feature collection, er laget tomt, eller er svaret afkortet uden at nogen af de hentede features gælder — så får netop DEN linje status "utilgaengelig" og inden_for null. Nøglen står også i utilgaengelige. Typen er boolean | null netop for at tvinge kalderen til at tage stilling: en almindelig boolean ville lade “vi ved det ikke” glide igennem som “nej”.

Hvorfor fejler hele kaldet ikke, når én kilde er nede?

Fordi ni besvarede linjer er værd at vise. De ti registre ligger på tre forskellige værter og går ikke ned sammen; hvis ét nedbrud kunne blanke hele panelet, ville bundtningen have gjort svaret skrøbeligere end seks separate kald. Derfor er en fejl indkapslet i den linje, den hører til. Det er også grunden til, at endpointet ikke har en 502: den eneste fejlkode er 503, når registret slet ikke er konfigureret. Til gengæld caches et delvist svar ikke — én kildes fem minutters vrøvl skal ikke hænge i et døgn.

Ligger de alle sammen i Danmarks Arealinformation?

Nej, og det er værd at vide. Seks af dem gør — sø, å, kirke, diger, § 3-natur og § 3-vandløb ligger på Danmarks Miljøportals åbne DAI-GeoServer. Fortidsmindebeskyttelseslinjerne kommer fra Slots- og Kulturstyrelsens Fund og Fortidsminder. Og strandbeskyttelse og klitfredning er slet ikke miljødata: de er tinglyst PÅ MATRIKLEN af Geodatastyrelsen, én temaflade pr. jordstykke, og hentes fra Datafordeleren — samme service som vores matrikelregister allerede læser jordstykker fra. Tre værter, to dataformater (GeoJSON og GML), ét svar.

Går fælden fra skovbyggelinjerne igen her?

Ja — under et andet navn, og det er den ene ting, der er værd at vide om sø- og åbeskyttelseslinjerne. Ligesom dai:skovbyggelinjer holder Skovs_kode og Statuskode adskilt, holder dai:soe_bes_linjer linjens egen tilstand i Kategori_kode og registreringens i Statuskode. 50 sø- og 95 åpolygoner er ophævede linjer, hvis registrering stadig står som “Gældende / Vedtaget”. Læser man kun status, melder man byggeforbud, hvor der ikke er noget. Vi læser linjen, og de ophævede følger med i ophaevede som dokumentation. To detaljer mere fra samme lag: Kategori_kode 0 hedder “Ikke udfyldt” og giver et ja med usikker: true, og Kategori_kode 4 er slet ikke en linje — det er selve søen, der KASTER linjen, gemt i samme tabel, og den tæller hverken som gældende eller ophævet.

Hvad betyder geometri: "linje" på diger og § 3-vandløb?

At registret gemmer selve det beskyttede objekt som en streg, ikke en zone omkring det. Der er ingen polygon at ligge inde i: et dige er beskyttet i sig selv, og man må ikke ændre det. For de to registre betyder inden_for derfor, at punktet ligger PÅ objektet inden for 2 meter — og det er afstand_m, der er det brugbare felt. Et bygningshjørne ligger stort set aldrig oven på et dige, men “der ligger et beskyttet dige 3,4 m herfra” er præcis det, man skal vide, inden man graver.

Hvorfor svarer API’et ikke, om jeg må bygge?

Fordi det ikke kan afgøres fra et koordinat, og fordi de her paragraffer ikke ligner hinanden. § 16 stk. 2 og § 18 stk. 2 har hver deres undtagelseslister, og de ligner ikke § 17 stk. 2’s. § 3-beskyttelsen er oven i købet DEKLARATORISK: et areal kan være beskyttet uden at stå i registret, og et registreret areal kan vise sig ikke at være beskyttet, fordi beskyttelsen følger naturen på stedet frem for kortet. Og strandbeskyttelsen administreres af en helt anden myndighed end resten. Hvilken regel der rammer et KONKRET projekt afhænger af projekttype, kvadratmeter, zone og hvad der allerede ligger — oplysninger, kun den, der kalder, sidder med. Derfor bærer svaret hverken kraever_dispensation eller forbudt: vi rapporterer linjen, I lægger undtagelsestesten oveni. Et felt, der lød som en dom, ville blive læst som en dom.

Hvad koster et opslag, og hvilke koordinater skal jeg sende?

Send lon/lat i WGS84 (lon ~7–16, lat ~54–58); DAWA-stilen x/y med srid=4326 eller 25832 virker også. Mangler en parameter, eller ligger punktet uden for Danmark, svarer endpointet 400. Opslaget koster ÉN enhed på den fælles prismodel (Free / Starter / Pro / Scale) — samme nøgle og metering som BBR, Matriklen og DAR, og ingen tillæg for at det rører ti registre.

Er Grundfast officielt / tilknyttet myndighederne?

Nej. Grundfast er et uafhængigt compatibility-lag. Linjerne vedligeholdes af kommunerne i Danmarks Miljøportals DAI, af Slots- og Kulturstyrelsen (fortidsminder og diger) og af Geodatastyrelsen (strandbeskyttelse og klitfredning); vi krediterer kilderne og udstiller dem i en ryddet, versioneret form med cache og SLA oven på. Svaret er vejledende — kommunen, Kystdirektoratet og Miljøstyrelsen afgør den konkrete sag.

Byggelinjer i hele landet

Ti registre, ét koordinat — og hvor mange meter der er til kanten

Strandbeskyttelse og klitfredning fra Matriklen, fortidsmindelinjer fra Fund og Fortidsminder, og sø, å, kirke, diger og § 3-natur fra Danmarks Arealinformation. Ét kald, fortegnet afstand til nærmeste kant, og et nej der aldrig kommer af en upstream-fejl.

Tegnet af vores egne data — grænser: DAGI · adresser: DAR · matrikler: Matriklen (åbne data).