CH NEO-ZÜRICH AUSGABE
WETTER · SAURER REGEN 8°C
BLEND DES TAGES · 07/ROGUE
EST. 2027
DIE AEC CYBER MORGENZEITUNG

PAZ Kaffi

DESIGN · ABBRUCH · KOFFEIN · DEPESCHE
AUSGABE 1107 · 7 November 2026
SENDUNG 04:42 MEZ
2'400 BOGEN GEDRUCKT
LESEZEIT · 47 MIN
Adresse eingeben, Schneelast aufs Dach: SIA 261 in Python
Akademie
FRAME · 06:50
07-11-2026

Adresse eingeben, Schneelast aufs Dach: SIA 261 in Python

Ein Python-Skript mit 65 Zeilen wandelt eine Schweizer Adresse über die kostenlose swisstopo-API in Höhenangaben um und wendet die SIA-261-Schneelastformel an.

Die Schneelast auf einem Schweizer Dach ist eine Formel und eine Höhe. Die Formel ist sk = 0,4 · [1 + (h0/350)²] kN/m², nie weniger als 0,9, und die wichtige Stelle ist das Quadrat. Die Höhe addiert keine Schneemenge auf dem Dach. Sie multipliziert sie. Bern liegt auf 543 m und Davos auf 1557 m: 1014 m mehr, sechsfache Last.

Anfang November ist der erste Schnee nicht weit, und in vielen Büros wird die Höhenlage noch von Hand eingegeben. Dieses Tutorial ersetzt diese Eingabe durch ein Python-Skript mit 65 Zeilen aus der Standardbibliothek. Es fragt swisstopo nach Koordinaten und Höhenangaben, wendet die Formel und Dachfaktoren an und überprüft die eigene Arithmetik gegen eine Gerichtsentscheidung, bevor es etwas Vertrauenswürdiges ausgibt.

Die Formel wird hier so zitiert, wie ein öffentliches Organ sie angewendet hat. Das Baurekursgericht des Kantons Zürich arbeitete sie in der Entscheidung BRGE IV Nr. 0169/2013 vom 21. November 2013 für ein Gebäude auf 536 m durch. Das ist ein älterer Fall und betraf SIA 261:2003. Nach dem Baurekursgericht beträgt sk mindestens 0,9 kN/m², „rund 90 kg/m²”, und die Lastaufnahme, qk, ist sk multipliziert mit dem Dachformfaktor μ, dem Windexpositionsfaktor Ce und dem Wärmefaktor Ct. Der Höhenversatz Z und die Gültigkeitsgrenze von 2000 m stammen aus den SIA-261:2014-Zusammenfassungen auf dewiki und im Lastzonen-Tool von Dlubal.

Das Werkzeug: Die GeoAdmin-API von swisstopo, die REST-Schnittstelle hinter dem Bundesgeoportal. Sie ist kostenlos und erfordert keinen Schlüssel. Das Skript nutzt zwei Endpunkte: SearchServer, das Text in LV95-Koordinaten umwandelt, und height, das die Geländehöhe an einem Punkt zurückgibt. Die Mitarbeiter der Eidgenössischen Landestopographie in Wabern halten das Gelände eines ganzen Landes bereit und antworten auf HTTP-Abfragen in Millisekunden. Auf der Baustelle dankt ihnen niemand, weil es einfach funktioniert.

Einrichtung: Python 3.10 oder neuer, nichts zu installieren. Geben Sie auf Windows PowerShell curl.exe statt curl ein.

python --version            # getestet mit 3.10.11
mkdir snow
cd snow
# Beweis, dass der Höhen-Endpunkt antwortet (LV95-Punkt nahe Bern)
curl "https://api3.geo.admin.ch/rest/services/height?easting=2600000&northing=1200000&sr=2056"
# erwartet ungefähr: {"height":"555.5"}
# speichern Sie das folgende Programm als snow_load.py, dann:
python snow_load.py

Erste Schritte:

  1. Führen Sie die curl-Zeile aus. Die Dokumentation von swisstopo zum Thema „Get Point Height” zeigt 553,6 für diesen Punkt; unser Live-Aufruf am 3. November 2026 gab 555,5 zurück. Das Höhenmodell wird aktualisiert, daher ist ein Meter oder zwei Abweichung normal.
  2. Speichern Sie das Programm als snow_load.py und führen Sie es aus. Wenn die erste Zeile nicht 1,338 und 1,07 anzeigt, stoppen Sie und finden Sie heraus, warum.
  3. Ersetzen Sie die Beispieladressen in SITES durch die Strassenaddresse Ihrer Parzelle.
  4. Stellen Sie Z auf den Wert ein, den Sie aus SIA 261 Annex D ablesen. Z = 0 ist ein Platzhalter, keine Antwort.

Der Code erklärt: Jede Zeile ist ein Netzwerkaufruf, eine Formel oder eine Ausgabeanweisung.

# snow_load.py - charakteristische Schneelast für eine Schweizer Adresse, von Text zu kN/m²
# Nur Standardbibliothek. Geländehöhe: swisstopo GeoAdmin API (kostenlos, kein Schlüssel). Formel: SIA 261.
import json, re, urllib.parse, urllib.request

API = "https://api3.geo.admin.ch/rest/services"

def get(path, **params):
    url = f"{API}/{path}?{urllib.parse.urlencode(params)}"
    with urllib.request.urlopen(url, timeout=20) as r:
        return json.load(r)

def locate(text, origins="address"):
    """Nach einer Adresse (oder einer Gemeinde mit origins='gg25') suchen.
    HINWEIS: In der Antwort ist y die OSTUNG und x die NORDING (LV95)."""
    hit = get("ech/SearchServer", searchText=text, type="locations", origins=origins,
              sr=2056, limit=1)["results"][0]["attrs"]
    return hit["y"], hit["x"], re.sub("<[^>]+>", "", hit["label"])

def height(e, n):
    return float(get("height", easting=round(e, 1), northing=round(n, 1), sr=2056)["height"])

def sk(h, z=0):
    """SIA 261: sk = 0.4 [1 + (h0/350)^2] kN/m², mindestens 0,9; h0 = h + Z (Z aus der Karte Annex D)."""
    h0 = h + z
    return max(0.9, 0.4 * (1 + (h0 / 350) ** 2)), h0

def roof(skv, mu=0.8, ce=1.0, ct=1.0):
    """qk auf Plan = mu (Dachform) * Ce (Windexposition) * Ct (Wärmefaktor) * sk."""
    return mu * ce * ct * skv

def tonnes(q, area=120):                # ein 10 x 12 m Dach, kN -> t
    return q * area / 9.81

# Selbstprüfung: Zürich Baurekursgericht, 21. Nov. 2013, Gebäude auf 536 m, ca. 14° geneigtes Dach
s, _ = sk(536)
print(f"Selbstprüfung 536 m: sk {s:.3f} kN/m² (Entscheidung: 1,338), qk {roof(s):.2f} (Entscheidung: 1,07)")

SITES = ["Marktplatz 9 4051 Basel", "Bundesplatz 3 3011 Bern", "Bahnhofplatz 1 7000 Chur",
         "Gotthardstrasse 1 6490 Andermatt", "Promenade 67 7270 Davos", "Via Maistra 12 7500 St. Moritz"]
Z = 0          # BEISPIEL: Lesen Sie Ihr Z (-200/0/+200/+400/+500 m) aus SIA 261 Annex D
print(f"
{'Adresse':<32}{'E':>9}{'N':>9}{'h m':>7}{'sk':>7}{'qk':>7}  t auf 10x12 m")
for text in SITES:
    e, n, label = locate(text)
    s, h0 = sk(height(e, n), Z)
    note = "  h0 > 2000 m: Formel nicht gültig" if h0 > 2000 else ""
    print(f"{label[:31]:<32}{e:9.0f}{n:9.0f}{h0:7.0f}{s:7.2f}{roof(s):7.2f}{tonnes(roof(s)):9.1f}{note}")

print("
Wie 1 kN/m² sk aussieht (Dichten wie in der Entscheidung 2013 / SLF):")
for kind, rho in (("Neuschnee", 100), ("Schneedecke", 200), ("Nassschnee", 400)):
    print(f"  {kind:<13}{rho:>4} kg/m³ -> {1000 / 9.81 / rho * 100:5.0f} cm")

print("
Was Z in Davos bewirkt (gleiche Adresse, Annex-D-Wert ist IHR Wert zum Lesen):")
e, n, _ = locate("Promenade 67 7270 Davos")
h = height(e, n)
for z in (-200, 0, 200):
    s, h0 = sk(h, z)
    print(f"  Z {z:+4d} m -> h0 {h0:5.0f} m, sk {s:5.2f}, qk {roof(s):5.2f} kN/m²")

# Ortsprüfung: Geben Sie nur den Ortsnamen ein und Sie erhalten den Gemeindepunkt, nicht Ihre Parzelle.
for town, addr in (("Chur", "Bahnhofplatz 1 7000 Chur"), ("Andermatt", "Gotthardstrasse 1 6490 Andermatt")):
    (e1, n1, l1), (e2, n2, _) = locate(town, origins="gg25"), locate(addr)
    h1, h2 = height(e1, n1), height(e2, n2)
    q1, q2 = roof(sk(h1)[0]), roof(sk(h2)[0])
    print(f"Ortsprüfung '{town}': Gemeindepunkt {h1:.0f} m -> qk {q1:.2f}; Adresse {h2:.0f} m"
          f" -> qk {q2:.2f} kN/m² ({tonnes(q1) - tonnes(q2):+.0f} t auf 10x12 m)")

Zeilen 1–10 — eine Tür zur API: get() ist die einzige Funktion, die das Netzwerk berührt. urlencode macht Parameter URL-sicher, einschliesslich Umlaute; das 20-Sekunden-Timeout lässt eine tote Verbindung fehlschlagen, statt zu hängen; json.load wandelt die Klartext-Antwort in Python-Dictionaries um. Wenn sich die Service-Adresse jemals ändert, ändern Sie eine Zeile.

Zeilen 12–20 — der Austausch: Nach der Suchdokumentation von swisstopo ist in SearchServer-Antworten x die Nording und y die Ostung; ihr „Wabern”-Beispiel gibt x 197515,6 und y 601112,8 zurück. Deshalb gibt locate() zuerst hit["y"] zurück. Das ist der Anfängerfehler des Stücks: Tauschen Sie sie aus und Sie fragen nach der Höhe eines anderen Ortes. Das Erkennungszeichen: LV95-Ostungen beginnen mit einer 2, Nordungen mit einer 1. Der reguläre Ausdruck (ein Textmuster) entfernt HTML-Tags aus dem Label, das das Skript statt Ihrer Abfrage ausgibt, weil „4051 Basel” als Postleitzahl-Alias „4001 Basel” zurückkommt.

Zeilen 22–36 — die Formel und ihre Überprüfung: sk() addiert Z zur Geländehöhe, um h0 zu erhalten, und max(0.9, …) wählt die grössere Zahl, erzwingt das Minimum. roof() verwendet μ = 0,8, Ce = 1 und Ct = 1, die Werte, die die Entscheidung 2013 für sein geneigtes Dach von etwa 14° verwendete, nicht Werte für Ihr Dach. tonnes() konvertiert zu Tonnen auf einem 10 × 12 m Dach. Dann berechnet das Skript den Fall des Gerichts neu: Selbstprüfung 536 m: sk 1,338 kN/m² (Entscheidung: 1,338), qk 1,07 (Entscheidung: 1,07). Ein Test ist nur Code, der die Antwort im Voraus kennt.

Zeilen 38–47 — sechs Adressen, in Tonnen: Der Live-Lauf vom 3. November 2026 ergab qk auf dem Dach von 0,72 kN/m² in Basel (253 m), 1,09 in Bern (543 m), 1,21 in Chur (585 m), 5,66 in Andermatt (1430 m), 6,65 in Davos (1557 m) und 9,08 in St. Moritz (1832 m). Prüfen Sie Bern von Hand: (543/350)² = 2,407, also 0,4 × 3,407 = 1,36, und × 0,8 = 1,09. Basels rohe Formel ergibt 0,61, also setzt das Minimum an. Der gleiche Grundriss trägt 8,8 t in Basel und 111,1 t in St. Moritz. Die Zeilen 49–51 machen ein kN/m² physisch. Jan Eitel berichtet für SRF Meteo und zitiert dabei den SLF, dass Neuschnee bis zu etwa 100 kg/m³ wiegt und Nassschnee über 400. Ein kN/m² ist daher etwa 102 cm Neuschnee, 51 cm Schneedecke oder 25 cm Nassschnee.

Zeilen 53–58 — Z gehört Ihnen: unter der gleichen Davos-Adresse ergibt Z = −200 m qk 5,13 kN/m², Z = 0 ergibt 6,65 und Z = +200 m ergibt 8,39. Das sind 3,26 kN/m² aus einer Kartenablesung, daher weigert sich das Skript, Z zu raten.

Zeilen 60–66 — Adresse suchen, nie die Stadt: origins="gg25" fragt nach dem Gemeinde-Referenzpunkt. Bei „Chur” liegt dieser bei 1459 m gegen 585 m am Bahnhofplatz: qk 5,88 statt 1,21, oder +57 t. Bei „Andermatt” sind es 1983 m gegen 1430 m: 10,59 gegen 5,66, oder +60 t. Genau auf zwei Dezimalstellen, um einen Berg falsch. Zeile 46 markiert h0 über 2000 m, weil nach dewiki die Formel nur bis zu dieser Höhe gültig ist; höhere Standorte benötigen einen Schneebericht.

Das Skript ist schnell, weil es eng ist: Geländehöhe an einem Punkt, eine Formel, keine Abdriften, Täler oder Brüstungen. Diese Enge ist das Risiko: Eine schnelle falsche Höhe ist gefährlicher als eine langsame richtige. Behandeln Sie es als eine Vor-Design-Prüfung; der Ingenieur entwickelt das Dach. Es läuft unverändert im Rhino 8 ScriptEditor, und der nächste natürliche Schritt ist die Fütterung mit dem Parzellen-Zentroid Ihres Grasshopper-Standortmodells.

←HEUTE: swisstopo beantwortet eine Geländehöhen-Abfrage für jeden Schweizer Punkt in einem kostenlosen HTTP-Aufruf.
→3012: Die Höhenlage der Parzelle und ihre Last-Logik reisen als lesbarer Text mit dem Projekt, lange nachdem die Software, die ihn zeichnete, weg ist.
Drehpunkt: Offene öffentliche Daten plus ein Skript, das Sie Zeile für Zeile lesen können, schlagen eine Zahl, der Sie vertrauen müssen.

Aus dem späten 2070er Jahren ist das Muster klar: Die Berechnungen, die überdauerten, waren Klartext gegen offene öffentliche Daten, immer noch lesbar von einem 25-Jährigen Jahrzehnte später. Das ist diese Art von Datei.

Atelier: Ein kleines Atelier in Graubünden oder dem Berner Oberland trifft auf Schneelast beim ersten Vor-Ort-Termin, normalerweise als Zahl, an die sich jemand erinnert. Jetzt kommt die Höhe aus dem Bundesmodell und die Arithmetik ist für das ganze Team sichtbar, einschliesslich des Ingenieurs, der unterschreibt. Montagszug: Legen Sie snow_load.py in den Projektvorlage-Ordner und fügen Sie eine Checklisten-Zeile hinzu: „Parzellnadresse ausgeführt, Z aus Annex D gelesen, Ausdruck an den Ingenieur übergeben”.

Hack: Beweisen Sie sich das Quadrat selbst, bevor Sie der Tabelle vertrauen. Fügen Sie diese drei Zeilen unten ein und vorhersagen Sie zuerst: Eine Verdoppelung von 500 m auf 1000 m sollte sk ungefähr verdreifachen, und eine erneute Verdoppelung auf 2000 m es fast vervierfachen. Erwarten Sie 1,22, 3,67 und 13,46 kN/m².

for h in (500, 1000, 2000):
    s, _ = sk(h)
    print(h, "m ->", round(s, 2), "kN/m²")

Wenn Ihre Zahlen stimmen, haben Sie die Formel gelesen, nicht nur kopiert.

Wollen Sie das Ergebnis direkt in Archicad-Eigenschaften geschrieben? Das ist das Fundament des Selbstlernkurses der PAZ Academy Von Dokumentationslücken zu smarter Automatisierung mit Python & Archicad, der von null Python startet.

Weiterlernen:

Speichern Sie die Datei, wechseln Sie die Adresse der Parzelle auf Ihrem Schreibtisch aus und führen Sie sie aus, bevor der erste Schnee die Messung für Sie durchführt.

GEMELDET AUS
MIT-UNTERZEICHNER
PAZ Academy
VERTRAUEN
HIGH
NACHDRUCKE
© PAZ - PARAMETRIC ACADEMY ZURICH · ALLE RECHTE VORBEHALTEN

PAZ Kaffi · interdisziplinäre Redaktionsarbeit, geleitet von der PAZ Academy

⚑ FEHLER MELDEN · KORREKTUR EINSENDEN
◂ ZURÜCK ZUR TITELSEITE · PAZ KAFFI

© 2026 PAZ Academy.