GribStream

Demo zur Start- und Landebahn-Performance

Dieses Dashboard ist eine kuratierte orientierende Demo für Pistenbetrieb. Es kombiniert kurzfristige HRRR- und RAP-Vorhersagen mit einem kleinen Pistenkatalog und Referenzprofilen für Flugzeuge, um Gegenwind- und Seitenwindkomponenten, Druckhöhe und Dichtehöhe sowie eine grobe Pistenmarge über die Zeit zu schätzen.

Die Seite löst Pistengeometrie und Flugzeugkoeffizienten aus leichten Metadaten-Endpoints auf und sendet dann einen normalen GribStream /api/v2/[dataset]/timeseries Request mit Vorhersagevariablen plus verketteten berechneten Expressions. Dadurch ist die luftfahrtspezifische Logik transparent und aus der öffentlichen API reproduzierbar, statt hinter einem benutzerdefinierten serverseitigen Endpoint versteckt zu sein.

Was die Bedienelemente tun

Wie die Panels gelesen werden

Die Formeln sind absichtlich einfach und konservativ: Sie nutzen Wettervorhersagen, flugzeugspezifische Referenzwerte und generische Abschläge oder Zuschläge für Dichtehöhe, Rückenwind, Gegenwind, Gewicht und Pistenzustand. Das ist nützlich für Demos, Planungsgespräche und Kundenpräsentationen.

Repräsentative GribStream-Anfrage

Das Beispiel unten nutzt dasselbe Anfrageformat wie das Dashboard für KASE RWY 15 mit einem Cessna 172S-Referenzprofil. Platzhöhe, Pistenrichtung, Pistenlänge und Flugzeugkoeffizienten kommen aus Metadaten-Endpoints, während Wettervariablen und abgeleitete Performance-Felder in einem normalen API-Aufruf berechnet werden.

curl -X POST 'https://gribstream.com/api/v2/hrrr/timeseries' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer [API_TOKEN]' \
  -d '{
    "fromTime": "2026-04-11T17:42:52Z",
    "untilTime": "2026-04-12T12:42:52Z",
    "minLeadTime": "0h",
    "maxLeadTime": "36h",
    "coordinates": [
      { "lat": 39.2232, "lon": -106.8688, "name": "KASE RWY 15" }
    ],
    "variables": [
      { "name": "TMP", "level": "2 m above ground", "alias": "temp_k" },
      { "name": "DPT", "level": "2 m above ground", "alias": "dew_k" },
      { "name": "PRES", "level": "surface", "alias": "pres_pa" },
      { "name": "GUST", "level": "surface", "alias": "gust_ms" },
      { "name": "UGRD", "level": "10 m above ground", "alias": "u_ms" },
      { "name": "VGRD", "level": "10 m above ground", "alias": "v_ms" }
    ],
    "expressions": [
      { "expression": "temp_k - 273.15", "alias": "temp_c" },
      { "expression": "dew_k - 273.15", "alias": "dew_c" },
      { "expression": "pres_pa / 3386.389", "alias": "station_inhg" },
      { "expression": "station_inhg / func.Pow(1 - (7820 * 0.3048) / 44330.0, 5.255)", "alias": "altimeter_inhg" },
      { "expression": "func.Hypot(u_ms, v_ms) * 1.94384", "alias": "wind_kt" },
      { "expression": "gust_ms * 1.94384", "alias": "gust_kt" },
      { "expression": "(int(270 - func.Atan2(v_ms, u_ms) * 180 / 3.14159) + 360) % 360", "alias": "wind_dir_deg" },
      { "expression": "(wind_dir_deg - 150) * 3.14159 / 180", "alias": "angle_rad" },
      { "expression": "wind_kt * func.Cos(angle_rad)", "alias": "headwind_kt" },
      { "expression": "func.Max(headwind_kt, 0.0)", "alias": "headwind_pos_kt" },
      { "expression": "func.Max(-headwind_kt, 0.0)", "alias": "tailwind_kt" },
      { "expression": "func.Abs(wind_kt * func.Sin(angle_rad))", "alias": "crosswind_kt" },
      { "expression": "func.Abs(gust_kt * func.Sin(angle_rad))", "alias": "gust_crosswind_kt" },
      { "expression": "7820 + (29.92 - altimeter_inhg) * 1000", "alias": "pressure_alt_ft" },
      { "expression": "15 - 1.98 * pressure_alt_ft / 1000", "alias": "isa_temp_c" },
      { "expression": "pressure_alt_ft + 120 * (temp_c - isa_temp_c)", "alias": "density_alt_ft" },
      { "expression": "9.600", "alias": "crosswind_baseline_kt" },
      { "expression": "1630 * func.Pow(90 / 100.0, 1.7) * (1 + func.Max(density_alt_ft, 0.0) / 1000.0 * 0.140) * 1.0 * (1 + tailwind_kt * 0.040) / func.Max(0.75, 1 + headwind_pos_kt * 0.012)", "alias": "takeoff_req_ft" },
      { "expression": "1335 * func.Pow(90 / 100.0, 1.45) * (1 + func.Max(density_alt_ft, 0.0) / 1000.0 * 0.050) * 1.0 * (1 + tailwind_kt * 0.030) / func.Max(0.80, 1 + headwind_pos_kt * 0.010)", "alias": "landing_req_ft" },
      { "expression": "8006", "alias": "runway_length_ft" },
      { "expression": "runway_length_ft - takeoff_req_ft", "alias": "takeoff_margin_ft" },
      { "expression": "runway_length_ft - landing_req_ft", "alias": "landing_margin_ft" },
      { "expression": "func.Min(takeoff_margin_ft, landing_margin_ft)", "alias": "min_margin_ft" }
    ]
  }'

Warum die Mathematik vertretbar ist

Hintergrund und Referenzen: GribStream expressions · FAA Pilot's Handbook of Aeronautical Knowledge · FAA Airplane Flying Handbook · Pressure altitude · Density altitude.

Nicht für operative Nutzung. Diese Seite ersetzt weder Flughandbuch, Airport Data Package, Company SOPs noch Einsatzplanungs- oder Pilot-Performance-Berechnungen. Nutzen Sie sie als visuelle Erklärung dafür, was GribStream antreiben kann, nicht als go / no-go-Entscheidungsgrundlage.