Porta Westfalica Hangflug: Höhenwind-Analyse und Standort-Bewertung
Wie man Hangflug-Bedingungen automatisch bewertet: Windrichtung, Bodenwind vs. Höhenwind, und dynamische Suitability-Ratings
🏔️ Hangflug am Wiehengebirge
Porta Westfalica am Wiehengebirge ist ein beliebter Hangflug-Spot in Nordrhein-Westfalen. Der Kamm verläuft von West nach Ost (W-E), was bedeutet: Wind aus Süd bis Südwest (170°-240°) erzeugt perfekte Hangaufwinde.
Aber: Hangflug ist komplex! Es reicht nicht, nur die Windrichtung zu checken. Auch Windgeschwindigkeit, Böen und vor allem Höhenwind (120m und 180m über Grund) spielen eine kritische Rolle.
Für das EDXE Thermik-X Projekt habe ich einen Algorithmus entwickelt, der diese Bedingungen automatisch bewertet und einen Rating-Text wie "🟢 Ideal" oder "⚪ Zu schwach" ausgibt.
🌬️ Die Kriterien für guten Hangflug
1. Windrichtung: Der Sweet Spot
Die optimale Windrichtung für Porta Westfalica ist 170° - 240° (Süd bis Süd-Südwest):
- 170° (S): Südwind – untere Grenze, noch fliegbar
- 200° (SSW): Perfekt – genau senkrecht zum Kamm
- 240° (WSW): Obere Grenze – noch okay, aber Tendenz zu schwach
Warum? Der Kamm läuft W-E. Wind aus SSW trifft senkrecht auf den Hang und erzeugt maximalen Aufwind.
2. Bodenwind: Mindestens 18 km/h
Der Wind am Boden (wind_speed_10m) muss stark genug sein, um Aufwind am Kamm zu erzeugen:
- < 10 km/h: Zu schwach – kein Hangflug möglich
- 10-18 km/h: Grenzwertig – nur für erfahrene Piloten
- 18-35 km/h: Ideal – stabiler Aufwind
- > 35 km/h: Zu stark – turbulent, gefährlich
3. Höhenwind: Das kritische Limit
Der Höhenwind (120m und 180m über Grund) darf nicht > 70 km/h sein! Warum?
- Starker Höhenwind erzeugt Rotoren (gefährliche Wirbelstürme hinter dem Kamm)
- Strömungsabriss-Gefahr in Bodennähe
- Extrem turbulent – selbst für erfahrene Piloten zu riskant
Wichtig: Höhenwind ist oft stärker als Bodenwind! Daher müssen beide separat geprüft werden.
4. Böen: Nicht zu stark
Böen (wind_gusts_10m_max) sollten moderat bleiben:
- < 50 km/h: Okay – normale Böigkeit
- > 50 km/h: Zu böig – schwierige Bedingungen
⚙️ Der Bewertungs-Algorithmus
So wird die Hangflug-Suitability automatisch bewertet:
function evaluatePortaSoaring(windDir, windSpeed, gustMax, hours, portaData = null) {
// Porta Westfalica Wiehengebirge - Kamm läuft W-E
// RICHTIGER Bereich: 170° - 240° (Süd bis SW/WSW)
// Optimal: ~200° (SSW), mit 18+ km/h am Kamm
// Verwende Porta-Daten falls verfügbar, sonst EDXE-Daten als Fallback
const usingPortaData = portaData != null;
let windSpeedAloft = null;
if (portaData) {
windDir = portaData.windDir;
windSpeed = portaData.windSpeed;
gustMax = portaData.gustMax;
windSpeedAloft = portaData.windSpeedAloft; // Höhenwind (120m/180m max)
}
if (windDir == null || windSpeed == null) {
return {
suitable: false,
rating: 'Keine Daten',
details: 'Windrichtung nicht verfügbar',
icon: '—',
dataSource: usingPortaData
};
}
// Normalisiere Windrichtung auf 0-360
windDir = ((windDir % 360) + 360) % 360;
const windDirText = degToDir(windDir);
// ========================================
// 1. HÖHENWIND-CHECK (HÖCHSTE PRIORITÄT!)
// ========================================
if (windSpeedAloft != null && windSpeedAloft > 70) {
return {
suitable: false,
rating: 'Höhenwind kritisch',
details: `Höhenwind ${Math.round(windSpeedAloft)} km/h in 1.000-1.500m –
deutlich über Limit (70 km/h)! NICHT starten – Rotor, Strömungsabriss,
Böen in Bodennähe!`,
icon: '🔴',
dataSource: usingPortaData,
windDir,
windDirText,
windSpeed
};
}
// ========================================
// 2. BODENWIND ZU SCHWACH
// ========================================
if (windSpeed < 10) {
return {
suitable: false,
rating: 'Zu schwach',
details: `Wind ${windDirText} ${Math.round(windSpeed)} km/h
– zu schwach für Hangflug (min. 10 km/h nötig, optimal 18+ km/h).`,
icon: '⚪',
dataSource: usingPortaData,
windDir,
windDirText,
windSpeed
};
}
// ========================================
// 3. BODENWIND ZU STARK
// ========================================
if (windSpeed > 35) {
return {
suitable: false,
rating: 'Zu stark',
details: `Wind ${windDirText} ${Math.round(windSpeed)} km/h
– zu stark! Ab 35 km/h wird's turbulent und gefährlich.`,
icon: '🔴',
dataSource: usingPortaData,
windDir,
windDirText,
windSpeed
};
}
// ========================================
// 4. BÖEN ZU STARK
// ========================================
if (gustMax != null && gustMax > 50) {
return {
suitable: false,
rating: 'Zu böig',
details: `Wind ${windDirText} ${Math.round(windSpeed)} km/h,
aber Böen bis ${Math.round(gustMax)} km/h – zu böig für sicheren Hangflug.`,
icon: '🟠',
dataSource: usingPortaData,
windDir,
windDirText,
windSpeed
};
}
// ========================================
// 5. WINDRICHTUNG PRÜFEN
// ========================================
// Optimaler Bereich: 170° - 240°
if (windDir >= 170 && windDir <= 240) {
// PERFEKT: Innerhalb des optimalen Bereichs
if (windSpeed >= 18 && windSpeed <= 35) {
return {
suitable: true,
rating: 'Ideal',
details: `Wind aus ${windDirText} ${Math.round(windDir)}° •
${Math.round(windSpeed)} km/h – perfekt für Hangflug!
Optimale Startrichtung, stabiler Aufwind am Kamm.`,
icon: '🟢',
dataSource: usingPortaData,
windDir,
windDirText,
windSpeed
};
} else {
return {
suitable: true,
rating: 'Grenzwertig',
details: `Wind aus ${windDirText} ${Math.round(windDir)}° •
${Math.round(windSpeed)} km/h – Richtung passt,
aber Wind etwas schwach (besser wären 18+ km/h).`,
icon: '🟡',
dataSource: usingPortaData,
windDir,
windDirText,
windSpeed
};
}
}
// ========================================
// 6. WINDRICHTUNG NICHT GEEIGNET
// ========================================
return {
suitable: false,
rating: 'Ungeeignet',
details: `Wind aus ${windDirText} ${Math.round(windDir)}°
– außerhalb des idealen Bereichs (170°-240° = S bis WSW).
Kein Hangaufwind am Kamm.`,
icon: '⚪',
dataSource: usingPortaData,
windDir,
windDirText,
windSpeed
};
}
📊 Höhenwind aus Hourly-Daten berechnen
Open-Meteo bietet keine daily-Variable für Höhenwind. Daher müssen wir das Tages-Maximum selbst aus den hourly-Daten berechnen:
// Porta-Daten nach Tagen gruppieren
const portaDays = {};
if (portaData?.daily?.time && portaData?.hourly?.time) {
const portaHourly = portaData.hourly;
// 1. Höhenwind aus hourly-Daten nach Tagen gruppieren
const portaHourlyByDay = {};
portaHourly.time.forEach((t, i) => {
const dateKey = t.slice(0, 10); // "2025-02-05"
if (!portaHourlyByDay[dateKey]) {
portaHourlyByDay[dateKey] = { wind_120m: [], wind_180m: [] };
}
const hourObj = {...}; // Alle hourly-Felder
const ws120 = pickField(hourObj, 'wind_speed_120m');
const ws180 = pickField(hourObj, 'wind_speed_180m');
if (ws120 != null) portaHourlyByDay[dateKey].wind_120m.push(ws120);
if (ws180 != null) portaHourlyByDay[dateKey].wind_180m.push(ws180);
});
// 2. Daily-Daten verarbeiten und mit Höhenwind kombinieren
portaDaily.time.forEach((t, i) => {
const dateKey = t;
const hourlyData = portaHourlyByDay[dateKey];
let windSpeedAloft = null;
if (hourlyData) {
const max120 = Math.max(...hourlyData.wind_120m);
const max180 = Math.max(...hourlyData.wind_180m);
windSpeedAloft = Math.max(max120, max180); // Maximum aus beiden Höhen
}
portaDays[dateKey] = {
windDir: pickField(dayObj, 'wind_direction_10m_dominant'),
windSpeed: pickField(dayObj, 'wind_speed_10m_max'),
gustMax: pickField(dayObj, 'wind_gusts_10m_max'),
windSpeedAloft: windSpeedAloft // ← Das kritische Limit!
};
});
}
Warum 120m UND 180m? Wir nehmen das Maximum aus beiden Höhen, weil Rotoren und Turbulenzen in verschiedenen Schichten auftreten können.
🎨 Visualisierung: Rating-Levels
Die Bewertung wird mit Icons und Farben dargestellt:
🟢 Ideal
170°-240°, 18-35 km/h, Höhenwind < 70 km/h
🟡 Grenzwertig
Richtung passt, aber Wind 10-18 km/h
🔴 Kritisch
Höhenwind > 70 km/h oder Bodenwind > 35 km/h
⚪ Ungeeignet
Falsche Windrichtung oder zu schwach
🌍 Dual-Location API Requests
Für EDXE Thermik-X laden wir Daten von zwei Standorten:
- EDXE (52.27669, 7.4925): Flugplatz Detmold – für Thermik-Vorhersage
- Porta (52.244, 8.920): Porta Westfalica – für Hangflug-Bewertung
const EDXE_API = `https://api.open-meteo.com/v1/forecast?latitude=52.27669&longitude=7.4925&...`;
const PORTA_API = `https://api.open-meteo.com/v1/forecast?latitude=52.244&longitude=8.920&...`;
// Parallele Requests
const [resEDXE, resPorta] = await Promise.all([
fetch(EDXE_API),
fetch(PORTA_API)
]);
const edxeData = await resEDXE.json();
const portaData = await resPorta.json();
// Für jeden Tag: EDXE-Daten für Thermik, Porta-Daten für Hangflug
sortedDays.forEach((dateKey) => {
const edxeDay = edxeDays[dateKey];
const portaDay = portaDays[dateKey];
const tci = calcTCI(edxeDay.hours); // Thermik-Score
const porta = evaluatePortaSoaring(..., portaDay); // Hangflug-Rating
renderDayCard(edxeDay, tci, porta);
});
Vorteil: Die Daten für Hangflug kommen direkt vom Standort Porta Westfalica, nicht vom 30km entfernten Flugplatz EDXE. Das macht die Vorhersage präziser!
💡 Best Practices für Hangflug-Algorithmen
- Höhenwind ist kritisch: Immer prüfen! Bodenwind allein reicht nicht
- Kamm-Orientierung beachten: Jeder Spot hat andere optimale Windrichtungen
- Lokale Daten verwenden: API-Requests vom tatsächlichen Hangflug-Standort
- Böen nicht vergessen: Selbst bei gutem Durchschnittswind können Böen gefährlich sein
- Konservativ bewerten: Lieber "Grenzwertig" als "Ideal" bei Zweifeln
- Terrain-Effekte einkalkulieren: Rotor-Gefahr hinter dem Kamm!
🎯 Zusammenfassung
Der Porta Westfalica Hangflug-Algorithmus bewertet automatisch:
- ✅ Windrichtung: 170°-240° optimal (Süd bis WSW)
- ✅ Bodenwind: 18-35 km/h ideal
- ✅ Höhenwind: < 70 km/h kritisches Limit
- ✅ Böen: < 50 km/h für sichere Bedingungen
- ✅ Dual-Location: Präzise Daten vom tatsächlichen Spot
Das Ergebnis: Klare Ratings wie "🟢 Ideal" oder "🔴 Höhenwind kritisch" – perfekt für schnelle Entscheidungen vor dem Start!