# Swisstopo-Geodaten & SIA-Flächenstandards im Browser-BIM > Stand: 2026-06-29 · Recherche für das Standalone-Browser-BIM (React + TS + Three.js), > Port von **DOSSIER** (Rhino-Plugin). Ziel: (A) Schweizer Geodaten (Höhenmodell, > Orthofoto, 3D-Gebäude, Parzellen) direkt im Browser laden, (B) Standort-Kontext > (Gelände + Parzelle + Nachbargebäude) für ein Projekt importieren, (C) SIA-416- > Flächen/Volumen + Raumschemata berechnen wie in DOSSIER. > > Bezug zur ROADMAP: Swisstopo/Terrain/OSM = **Phase 4** (Kontext/Daten); SIA-416- > Räume + Bilanz-CSV = **Phase 2**. Beide sind dort bereits als ⭐-Features gelistet. **Alle in diesem Dokument genannten geo.admin.ch-Endpunkte wurden am 2026-06-29 live gegen die echte API getestet** (curl + CORS-Header-Check). Wo „verifiziert" steht, liegt eine echte Antwort vor. --- ## Teil A — Swisstopo-APIs & Dienste aus dem Browser ### A.0 Das Wichtigste vorweg: CORS & Lizenz Zwei Fragen entscheiden, ob ein Dienst *ohne Backend-Proxy* aus einer reinen Browser-App nutzbar ist: CORS und Lizenz. Beide sind hier günstig. **CORS (live verifiziert):** Alle relevanten Hosts senden `access-control-allow-origin: *`: | Host | Dienst | CORS | Range-Requests | |---|---|---|---| | `api3.geo.admin.ch` | REST (height, profile, identify, find, search) | ✅ `*` | — | | `data.geo.admin.ch` | STAC-API + Daten-Assets (COG-GeoTIFF, XYZ.zip) | ✅ `*` | ✅ `206 Partial Content`, `accept-ranges`/`content-range` vorhanden | | `wmts.geo.admin.ch` | WMTS-Kacheln | ✅ `*` | — | | `3d.geo.admin.ch` | 3D-Tiles (`tileset.json` + glTF) | ✅ `*` | — | → **Konsequenz:** Höhenabfrage, Geocoding, Parzellen-Identify, Karten-/Orthofoto- Kacheln, **COG-GeoTIFF-Höhenmodell per Range-Request** und 3D-Tiles sind **direkt aus dem Browser ohne eigenen Proxy** abrufbar. Das ist ein großer Vorteil gegenüber vielen anderen nationalen Geodiensten. **Lizenz:** swisstopo/geo.admin.ch ist **Open Government Data**: „The acquisition and use of data or services is free of charge, subject to the provisions on fair use." Kommerzielle Nutzung ist erlaubt, Einbindung in (auch kommerzielle) Web-Apps explizit gedeckt. Pflicht-Attribution: **`© swisstopo`** (bzw. „© Data: swisstopo"). „Fair use" = z.B. Web-App mit Ø 20'000 Nutzern/Tag ok; aggressives Bot-Scraping vermeiden. Haftung ausgeschlossen, ~98% Verfügbarkeit. [Terms of use FSDI](https://www.geo.admin.ch/en/general-terms-of-use-fsdi) > ⚠️ **Korrektur zu DOSSIER & zur Doku:** Die offizielle REST-Doku notiert beim > *Height*-Service „This service is not freely accessible (fee required)". Das ist > **in der Praxis falsch / veraltet**: Der Endpunkt antwortet anonym, ohne Key, mit > `200` und CORS `*` (verifiziert, siehe A.1). DOSSIERs Aussage „alle APIs offen, ohne > Auth, ohne Key" deckt sich mit der gemessenen Realität. Wir verlassen uns aber nicht > blind darauf, sondern behandeln 402/429 defensiv (Retry/Backoff, Cache). ### A.1 Höhenabfrage — Height-Service (Einzelpunkt) Punkt-Höhe (DTM) aus swissALTI3D/DTM. **Verifiziert:** ``` GET https://api3.geo.admin.ch/rest/services/height?easting=2600000&northing=1200000&sr=2056 → {"height":"555.5"} ``` Parameter: - `easting`, `northing` — LV95 (`sr=2056`) oder LV03 (`sr=21781`). **Pflicht.** - `sr` — `2056` (LV95) angeben, sonst Default `21781`. - `elevation_model` — `DTM2` (= swissALTI3D, 2 m), `DTM25` (Default), `COMB`. (Im Tal lieferten DTM2/DTM25/COMB denselben Wert; im Steilgelände kann DTM2 genauer sein.) - `callback` — JSONP (brauchen wir wegen CORS nicht). Nutzung im Tool: **Projekt-Nullpunkt-Z** bzw. „Gebäude auf Gelände setzen" — eine einzelne Höhe an der Projekt-Koordinate. Antwortzeit ~50–150 ms. Quelle: [GeoAdmin REST – Height](https://geoadmin.readthedocs.io/en/latest/services/sdiservices.html) ### A.2 Höhenprofil — Profile-Service (Schnittlinie) Höhen entlang einer Polylinie — ideal für **Geländeschnitt** unter einem Gebäude-Schnitt. **Verifiziert** (echte Werte zurück): ``` GET https://api3.geo.admin.ch/rest/services/profile.json ?geom={"type":"LineString","coordinates":[[2600000,1200000],[2600200,1200000]]} &sr=2056&nb_points=3 → [{"alts":{"COMB":555.5,"DTM2":555.5,"DTM25":555.5},"dist":0,"easting":2600000,"northing":1200000}, {"alts":{...},"dist":100,...}, {"dist":200,...}] ``` Parameter: `geom` (GeoJSON-LineString, max 6'000 Punkte), `sr`, `nb_points` (Anzahl Stützpunkte, Default 200), `elevation_models`, `offset` (Glättung). Auch als `profile.csv`. → Für 2D-Geländeschnitte **ohne** Mesh-Download. Quelle: [GeoAdmin REST – Profile](https://geoadmin.readthedocs.io/en/latest/services/sdiservices.html) ### A.3 swissALTI3D — Höhenmodell als COG-GeoTIFF (Mesh-Quelle) ⭐ Das ist der **Schlüssel für das Gelände-Mesh im Browser**. swissALTI3D ist das präzise DTM der Schweiz (ohne Vegetation/Bebauung), Auflösung 0.5 m / 2 m, alle 6 Jahre aktualisiert ([swissALTI3D](https://www.swisstopo.admin.ch/en/height-model-swissalti3d)). Bezug über die **STAC-API** (verifiziert — Tile `swissalti3d_2019_2599-1198`): ``` GET https://data.geo.admin.ch/api/stac/v1/collections/ch.swisstopo.swissalti3d/items ?bbox=&limit=... ``` Jedes 1×1-km-Tile liefert pro Auflösung **zwei** Asset-Typen: | Asset | Typ | Browser-tauglich? | |---|---|---| | `..._0.5_2056_5728.tif` / `..._2_2056_5728.tif` | **Cloud-Optimized GeoTIFF**, **EPSG:2056** | ✅ **direkt** via `geotiff.js` + Range | | `..._0.5_2056_5728.xyz.zip` / `..._2_..._xyz.zip` | ASCII-XYZ (E N Z) in ZIP | ✅ via `fflate` entpacken (so macht es DOSSIER) | **Verifiziert:** `data.geo.admin.ch` liefert auf das `.tif` ein `206 Partial Content` mit `content-range` bei `Range:`-Header und CORS `*`. Das bedeutet: **`geotiff.js` liest nur den benötigten Ausschnitt eines COG per HTTP-Range, ohne das ganze File zu laden** — perfekt für eine Browser-App. Bbox in WGS84 für STAC, Tile-Daten dann in LV95-Metern (kein Reprojizieren der Z-Werte nötig). Quelle: [STAC tech docs](https://docs.geo.admin.ch/) · COG-Tile live geprüft. ### A.4 SWISSIMAGE / Karten — WMTS-Kacheln Orthofoto (10 cm) und Landeskarten als Kacheln. RESTful-URL-Template: ``` https://wmts.geo.admin.ch/1.0.0//default/