GribStream

Demo di prestazioni su pista aeroportuale

Questa dashboard è una demo indicativa curata per operazioni di pista. Combina previsioni a breve termine HRRR e RAP con un piccolo catalogo di piste e profili aeromobile di riferimento per stimare componenti di vento frontale e vento al traverso, pressure altitude (altitudine di pressione) e density altitude (altitudine di densità) e un margine pista approssimato nel tempo.

La pagina risolve geometria della pista e coefficienti aeromobile da endpoint dedicati ai metadati, poi esegue una normale richiesta GribStream /api/v2/[dataset]/timeseries con variabili di previsione ed espressioni calcolate (expressions) in sequenza. Questo rende la logica specifica per l'aviazione trasparente e riproducibile dall'API pubblica, senza nasconderla in un endpoint dedicato lato server.

Cosa fanno i controlli

Come leggere i pannelli

Le formule sono volutamente semplici e conservative: usano meteo previsto, valori di riferimento specifici dell'aeromobile e penalità o crediti generici per density altitude, vento in coda, vento frontale, peso e condizione della pista. È utile per demo, conversazioni di pianificazione e presentazioni a clienti.

Richiesta GribStream rappresentativa

L'esempio sotto usa lo stesso stile di richiesta della dashboard per KASE RWY 15 con un profilo di riferimento Cessna 172S. Elevazione del campo, orientamento pista, lunghezza pista e coefficienti aeromobile arrivano dagli endpoint dedicati ai metadati, mentre le variabili meteo e i campi derivati sulle prestazioni vengono calcolati in un'unica chiamata API standard.

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" }
    ]
  }'

Perché il calcolo è difendibile

Contesto e riferimenti: espressioni GribStream · FAA Pilot's Handbook of Aeronautical Knowledge · FAA Airplane Flying Handbook · Pressure altitude · Density altitude.

Non usare per operazioni reali. Questa pagina non sostituisce il manuale di volo dell'aeromobile, i dati ufficiali dell'aeroporto, le SOP aziendali né i calcoli di pianificazione operativa o di prestazioni del pilota. Usala come spiegazione visiva di ciò che GribStream può alimentare, non come autorità per decisioni go / no-go.