PHP Gezeiten berechnen | Gezeiten PHP Skript | Ebbe und Flut berechnen | Teil 5

Qualitätskontrolle und weitere Verbesserungen

Im fünften und letzten Teil unseres kleinen Tutorials „PHP Gezeiten berechnen“ geht es um den Vergleich der von unserem Ebbe und Flut PHP Script gelieferten Daten mit der Realität.

Dieser fällt zunächst ernüchternd aus:

Ebbe_und_Flut_PHP_Gezeiten_qc1

Problem 1: Unser Skript kann Ebbe und Flut berechnen (Zeitpunkte und Wasserstände). Aber: während zumindest die Zeitpunkte für die Hochwasserevents relativ gut mit der Realität übereinstimmen, trifft unsere Annahme, die Niedrigwasserzeitpunkte würden exakt in der Mitte zwischen zwei Hochwassern liegen offensichtlich nicht zu. Lösung: Statt vom Benutzer lediglich einen Hochwasserevent abzufragen und davon ausgehend künftige Hoch- und Niedrigwasser-Zeiten zu berechnen, fügen wir mit $LW_event_user_timestamp eine weitere Benutzereingabe ein, nämlich ein reales, beobachtetes Niedrigwasser, das uns als Berechnungsgrundlage für künftige Niedrigwasserzeitpunkte dient. Auch hier sollte ein Zeitabstand von 44700 s gelten.

Damit stimmen nun beide Zeitpunkte gut überein:

Ebbe_und_Flut_PHP_Gezeiten_qc2

Problem 2: Unsere zwischen 1.44 und 0.56 schwankende Extremfaktorfunktion fällt im Vergleich zur Realität viel zu schnell ab. Lösung: Das Hochwasser schwankt in Dover zwischen 7.27 m (100%, entspricht 1.44) und 5.54 m (76.2%). Unser Skript geht derzeit jedoch von einer Schwankung zwischen 100% und 56% aus, was zum beobachteten zu schnellen Abfall führt. Verwenden wir für die Schwankungen von Hochwasser und Niedrigwasser nicht unsere Extremfaktorfunktion sondern Funktion Nr. 2 aus Teil 2 sollte dieses Problem behoben sein.

Problem 3: Dem aufmerksamen Beobachter fällt noch eine weitere Ungenauigkeit auf: In der Realität (zumindest an unserem Beispielort Dover) beobachtet man den höchsten Wasserstand (7.27 m) eben nicht wie erwartet bei Voll- oder Neumond sondern erst 2.558 Tage später. Das niedrigste Niedrigwasser fällt jedoch ziemlich exakt mit den Mondextremereignissen zusammen. Lösung: Ich habe für Ebbe und Flut eine „offset“ Variable eingefügt, die dies berücksichtigt.

Schlussendlich sieht unser fertiges PHP Ebbe und Flut Skript also so aus:

//Benutzerangaben z. B. via Formular
$MaxHW=7.27;
$MinHW=5.54;
$MaxLW=1.96;
$MinLW=0.2;
$HW_offset=2.558;
$LW_offset=0;
//$HW_event_user=01.01.2014 10:42
$HW_event_user_timestamp=gmmktime(23,07,00,01,01,14);
//$LW_event_user=02.01.2014 06:31
$LW_event_user_timestamp=gmmktime(06,31,00,01,02,14);
//andere Konstanten
$pi=3.1415927;
$two_pi=2*$pi;
//Aus der Monddatenbank entsprechend des eingegebenen Hochwasserdatums die Periodizität berechnen im Bsp 14.73472 Tage = 1273080 s
$extreme_period_sec=1273080;
$extreme_period_days=$extreme_period_sec/(60*60*24);
//letztes Extremereignis aus der Datenbank auslesen
$last_extreme_event_timestamp=gmmktime(11,14,00,01,01,14);
$delta_seconds=$HW_event_user_timestamp-$last_extreme_event_timestamp;
$delta_days=$delta_seconds/(60*60*24);
$HW_event[]=$HW_event_user_timestamp;
$LW_event[]=$LW_event_user_timestamp;
$HW_delta_days[]=0;
 
$i=0;
//HW_events und Wasserhöhen berechnen
while($i<7)
{
$HW_event[]=$HW_event[$i]+44700;
$HW_delta_days[]=$HW_delta_value=($HW_event[$i]-$last_extreme_event_timestamp-$HW_offset)/(60*60*24);
$HW_value[]=($MaxHW-$MinHW)/2*COS($two_pi/$extreme_period_days*$HW_delta_days[$i])+($MinHW)+($MaxHW-$MinHW)/2;
$i++;
}
 
//LW_events und Wasserhöhen berechnen
$i=0;
while($i<7)
{
$LW_event[]=$LW_event[$i]+44700;
$LW_delta_days[]=$LW_delta_value=($LW_event[$i]-$last_extreme_event_timestamp-$LW_offset)/(60*60*24);
$LW_value[]=($MaxLW-$MinLW)/2*COS($two_pi/$extreme_period_days*$LW_delta_days[$i]+$extreme_period_days)+($MinLW)+($MaxLW-$MinLW)/2;
$i++;
}
 
echo "
<table border='1'>
<tbody>
<tr>
<td>HW</td>
<td>Wasserstand</td>
<td>NW</td>
<td>Wasserstand</td>
</tr>"; $i=0; while($i<7) { echo "
<tr>
<td>".$HW_event_formated = gmdate("d.m.Y H:i",$HW_event[$i])."</td>
<td>".number_format($HW_value[$i], 2)."</td>
<td>".$LW_event_formated = gmdate("d.m.Y H:i",$LW_event[$i])."</td>
<td>".number_format($LW_value[$i], 2)."</td>
</tr>
"; $i++; } echo "</tbody>
</table>";
HW Wasserstand NW Wasserstand
01.01.2014 23:07 7.27 02.01.2014 06:31 0.37
02.01.2014 11:32 7.25 02.01.2014 18:56 0.27
02.01.2014 23:57 7.19 03.01.2014 07:21 0.22
03.01.2014 12:22 7.09 03.01.2014 19:46 0.20
04.01.2014 00:47 6.96 04.01.2014 08:11 0.23
04.01.2014 13:12 6.80 04.01.2014 20:36 0.30
05.01.2014 01:37 6.62 05.01.2014 09:01 0.40

Und liefert mit weniger als 50 Zeilen Code folgende Daten, die im grafischen Vergleich doch relativ gut mit der Realität übereinstimmen:

Ebbe_und_Flut_PHP_Gezeiten_qc3

Das in diesem Tutorial entwickelte Script oder Teile davon können gerne unter Angabe der Quelle verwendet werden. Bitte jedoch immer mit dem Hinweis, dass die berechneten Daten keinesfalls zur Navigation verwendete werden sollten.

Viel Spaß und hoffentlich: Immer eine handbreit Wasser unterm Kiel…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.