Koordinatsystemer og geometri: WGS84 og EPSG:25832
De danske registre fører koordinater i ETRS89 / UTM zone 32N (EPSG:25832); kort og GPS taler WGS84. Grundfast leverer WGS84 i GeoJSON-rækkefølgen [lon, lat] med de oprindelige EPSG:25832-koordinater ved siden af, og input er WGS84, medmindre et endpoint siger andet.
To koordinatsystemer
Et dansk koordinat kan være skrevet på to måder, og forveksler man dem, lander punktet et helt andet sted på kloden:
| WGS84 | ETRS89 / UTM zone 32N | |
|---|---|---|
| EPSG-kode | 4326 | 25832 |
| Enhed | Decimalgrader | Meter |
| Eksempel (Silkeborg) | 9.5329415, 56.157787 | 533102.67, 6223768.95 |
| Hvem bruger det | GPS, web-kort, GeoJSON, de fleste apps | BBR, Matriklen, DAGI, DHM og Miljøportalen |
| Godt til | At vise et punkt på et kort | At regne afstande og arealer i meter |
WGS84 er et geografisk system: længde- og breddegrad på kloden. UTM er en projektion: kloden foldet ud på et fladt net, så en afstand kan regnes med Pythagoras i meter. EPSG:25832 er UTM-zone 32 nord på datummet ETRS89, og de danske registre bruger den for hele landet — også det østligste Sjælland og Bornholm, som geografisk ligger i zone 33 (12°–18° øst). Derfor har et punkt på Bornholm en østkoordinat omkring 890.000 m, langt uden for zonens normale bredde. Det er ikke en fejl.
ETRS89 og WGS84 er ikke helt det samme datum, men til kortvisning og opslag på adresse- og matrikelniveau behandles de som ens. Det gør Grundfast også: reprojiceringen bruger den gængse definition med towgs84=0. Skal noget måles op med centimeternøjagtighed, er det landinspektørens opgave, ikke et API-opslags.
Kend systemet på tallene
Output: WGS84 og EPSG:25832
De danske registre fører koordinater i ETRS89 / UTM zone 32N (EPSG:25832), i meter. Grundfast reprojicerer til WGS84 (EPSG:4326), så geometrien kan bruges direkte i Leaflet, MapLibre og GeoJSON-værktøjer, og beholder de oprindelige koordinater, så du kan regne i meter uden selv at reprojicere.
Længdegrad først
[lon, lat] som i GeoJSON — ikke [lat, lon]. I Danmark er længdegraden 8–15 og breddegraden 54–58, så en ombytning er let at se.| Form | WGS84 | EPSG:25832 |
|---|---|---|
| Punkt (BBR-bygning) | geometri.coordinates: [lon, lat] | geometri.epsg25832: [x, y] |
| Polygon (jordstykke) | coordinates (GeoJSON-ringe) | epsg25832_ring |
| Multipolygon (DAGI-område) | coordinates | epsg25832_rings |
| Adressepunkt | koordinat: { lon, lat } | — |
| Bygningsomrids (GeoDanmark) | buildings[].rings | — |
Adresser har et navngivet objekt (koordinat.lon, koordinat.lat) i stedet for et array. coordinates kan være null, hvis reprojiceringen ikke var mulig; epsg25832 er der altid.
Input: et punkt
Endpoints, der tager et punkt, bruger lon og lat i WGS84-decimalgrader. Et punkt uden for Danmark (længdegrad 7–16, breddegrad 54–58) giver 400.
curl "https://api.grundfast.dk/v1/jord/omraadeklassificering?lon=10.1763672&lat=56.1327761" \
-H "Authorization: Bearer gf_live_..."For at gøre det nemt at flytte fra DAWA accepterer de samme endpoints også x, y og srid. srid=4326 (standard) betyder, at x/y er længde- og breddegrad; srid=25832 betyder UTM-meter, som vi reprojicerer for dig:
curl "https://api.grundfast.dk/v1/dhm/kote?x=533103.83&y=6223775.44&srid=25832" \
-H "Authorization: Bearer gf_live_..."Endpoints der tager lon/lat eller x/y/srid |
|---|
/v1/jordstykker/reverse · /v1/adgangsadresser/reverse |
/v1/dagi/reverse |
/v1/dhm/punkt · /v1/dhm/kote |
/v1/stednavne/punkt |
/v1/jord/omraadeklassificering |
/v1/natur/skovbyggelinje · /v1/natur/byggelinjer |
/v1/plan |
/v1/orto/daekning |
De fleste punktregistre gentager punktet i WGS84 (punkt) og i EPSG:25832 (epsg25832), så du kan se, hvad der faktisk blev slået op.
Regn i meter, vis i grader
En afstand regnet direkte på længde- og breddegrader er forkert, fordi en længdegrad i Danmark kun er godt halvt så lang som en breddegrad. Brug epsg25832-koordinaterne, der følger med i svaret, når du skal regne — så er afstanden mellem to punkter bare Pythagoras i meter — og WGS84-koordinaterne, når du skal tegne.
import { GrundfastClient } from '@grundfast/sdk';
const gf = new GrundfastClient({ apiKey: process.env.GRUNDFAST_API_KEY });
const ejendom = await gf.ejendom(5651067);
// To bygninger på samme ejendom: afstanden i meter, uden at reprojicere selv.
const [a, b] = ejendom.bygninger.flatMap((x) => (x.geometri ? [x.geometri.epsg25832] : []));
if (a && b) {
const meter = Math.hypot(b[0] - a[0], b[1] - a[1]);
console.log(meter.toFixed(1), 'm');
}Har du selv koordinater i det ene system og skal bruge dem i det andet, så send dem til et punkt-endpoint med srid (se ovenfor) — svaret gentager punktet i begge systemer — eller reprojicér lokalt med samme definition, som API’et bruger:
import proj4 from 'proj4';
proj4.defs('EPSG:25832', '+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs');
const [lon, lat] = proj4('EPSG:25832', 'EPSG:4326', [533102.67, 6223768.95]);
const [x, y] = proj4('EPSG:4326', 'EPSG:25832', [9.5329415, 56.157787]);Højder: profiler og terrænnet
/v1/dhm/profiltagerfraogtilsom"lon,lat"i WGS84, fxfra=10.2036,56.1577&til=10.2051,56.1582. Profilen må højst være 2.000 m lang og have 500 punkter./v1/dhm/kote:batchtager en liste af punkter medlonoglati WGS84./v1/dhm/terraentagerbbox=minx,miny,maxx,maxyi EPSG:25832-meter, ikke grader, højst 240 m på hver led. Sender du grader, får du en400, der siger det.
Terrænnettet returneres række for række fra nord mod syd og vest mod øst: værdien på indeks r * kolonner + c ligger i [oprindelse[0] + c * celle_m, oprindelse[1] - r * celle_m]. Alle højder er i meter over DVR90, og en celle uden data er null.
Bygningsomrids og luftfoto
BBR har kun ét punkt pr. bygning. /v1/geodanmark/bygninger/:bfe giver bygningernes rigtige omrids som WGS84-polygoner, koblet til BBR-bygningen med bbr_uuid. GeoDanmark-data er under CC BY 4.0: vis værdien i svarets attribution-felt, hvor du tegner omridsene.
Luftfoto leveres som XYZ-tiles i web-mercator (EPSG:3857) på /v1/orto/tile/:z/:x/:y — samme z/x/y-skema som et almindeligt tile-lag i Leaflet eller MapLibre. Tiles kræver nøglen i headeren, så lad din egen backend hente dem og videregive dem til kortet. aar vælger en årgang, og dpr=2 giver en 512×512-tile til skærme med høj opløsning. Hvilke årgange der dækker et punkt, fortæller /v1/orto/daekning.