Die Gezeiten hängen vom Stand des Mondes und der Sonne ab.
Da Ebbe und Flut darüber hinaus auch von örtlichen/geographischen Gegebenheiten abhängen, ist mein Ansatz wie folgt: Wie bereits beim Mond erhält man recht verlässliche Angaben (die die örtlichen Gegebenheiten bereits berücksichtigen), wenn man seine Berechnungen auf empirisch beobachtete Ereignisse „aufpfropft“. Will heissen: Wenn man aus Gezeitentabellen weiss, dass z.B. am 01. September 2014 an einem bestimmten Ort um 19:43 Hochwasser ist/war, müsste es möglich sein, den Zeitpunkt des nächsten Hochwassers mittels PHP-Skript zu berechnen (Wir basteln also einen PHP Gezeiten Rechner).
Da es gar nicht so trivial ist, den nächsten Vollmond zu berechnen (bzw. da triviale Lösungen dieses Problems eine Ungenauigkeit von mehreren Stunden aufweisen, was bei Gezeitentabellen natürlich inakzeptabel wäre) bin ich froh, die Berechnung der Mondphasen Profis überlassen zu können. Die NASA veröffentlicht dankenswerterweise Mondphasen Daten für das komplette 21. Jahrhundert (wer am verwendeten Algorithmus interessiert ist wird im Buch Astronomical Algorithms auf knapp 60 (!) Seiten fündig). Auch wenn ein Streben nach Autarkie und die Demonstration des technisch Machbaren sicher erstrebenswert wäre. Ein solches PHP Script würde den Rahmen eines „kostenlosen“ Codeschnipsels sprengen (falls es einen Sponsor gibt der an einer Umsetzung Interesse hat freue ich mich über eine eMail ;-))
Wir werden für die Gezeitenberechnung, die auch so noch ausreichend komplex wird, auf die Daten der NASA zurückgreifen. Und zwar auf den Abschnitt für 2014:
Year New Moon First Quarter Full Moon Last Quarter
2014 Jan 1 11:14 Jan 8 03:39 Jan 16 04:52 Jan 24 05:19
Jan 30 21:39 Feb 6 19:22 Feb 14 23:53 Feb 22 17:15
Mar 1 08:00 Mar 8 13:27 Mar 16 17:09 Mar 24 01:46
Mar 30 18:45 Apr 7 08:31 Apr 15 07:42 t Apr 22 07:52
Apr 29 06:14 A May 7 03:15 May 14 19:16 May 21 12:59
May 28 18:40 Jun 5 20:39 Jun 13 04:11 Jun 19 18:39
Jun 27 08:09 Jul 5 11:59 Jul 12 11:25 Jul 19 02:08
Jul 26 22:42 Aug 4 00:50 Aug 10 18:09 Aug 17 12:26
Aug 25 14:13 Sep 2 11:11 Sep 9 01:38 Sep 16 02:05
Sep 24 06:14 Oct 1 19:33 Oct 8 10:51 t Oct 15 19:12
Oct 23 21:57 P Oct 31 02:48 Nov 6 22:23 Nov 14 15:16
Nov 22 12:32 Nov 29 10:06 Dec 6 12:27 Dec 14 12:51
Dec 22 01:36 Dec 28 18:31
Mit Hilfe dieser Tabelle können wir also die Zeitspanne zwischen zwei Vollmonden durch Differenzbildung exakter bestimmen.
Zunächst werden wir diese Zeitangaben in einen UNIX timestamp transformieren und in einer MySQL Datenbank ablegen.
Um Problemen mit Zeitzonen ebenso aus dem Weg zu gehen, wie der Frage ob gerade Sommerzeit oder Winterzeit ist, erfolgen alle Berechnungen in UT (auch GMT). Die Daten in obiger Tabelle beziehen sich ebenfalls auf UT.
Auch PHP weiss um die Zeitzonen Problematik und enthält mit gmmktime() dankenswerterweise eine eigene Funktion um Zeitangaben die in Universal Time gemacht wurden in entsprechende UT-Timestamps umzuwandeln:
echo $timestamp=gmmktime(11, 14, 00, 1, 1, 2014)." "; //Zur Kontrolle, dass kein Fehler passiert ist lassen wir den timestamp wieder "zurückkonvertieren" und Datum/Uhrzeit ausgeben. echo gmdate("d.M.Y - H:i:s", $timestamp);
Dieses Script liefert folgende Ausgabe:
1388574840
01.Jan.2014 – 11:14:00
Die MySQL Datenbank, die unsere Monddaten enthält sieht dann etwa so aus:
-- -- Tabellenstruktur für Tabelle `moondata` -- CREATE TABLE `moondata` ( `ID` tinyint(4) NOT NULL AUTO_INCREMENT, `TYPE` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `TIME` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=51 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=51 ; -- -- Daten für Tabelle `moondata` -- INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (1, 'new', '1389698040'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (2, 'new', '1391117940'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (3, 'new', '1393632000'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (4, 'new', '1396205100'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (5, 'new', '1398752040'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (6, 'new', '1401302400'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (7, 'new', '1403827200'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (8, 'new', '1406414520'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (9, 'new', '1408975980'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (10, 'new', '1411539240'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (11, 'new', '1414101420'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (12, 'new', '1416660720'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (13, 'new', '1419212160'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (14, 'first', '1389152340'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (15, 'first', '1391714520'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (16, 'first', '1394285220'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (17, 'first', '1396859460'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (18, 'first', '1399432500'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (19, 'first', '1402000740'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (20, 'first', '1404561540'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (21, 'first', '1407113400'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (22, 'first', '1409656260'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (23, 'first', '1412191980'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (24, 'first', '1414723680'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (25, 'first', '1417255560'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (26, 'first', '1419791460'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (27, 'full', '1389847920'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (28, 'full', '1392421980'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (29, 'full', '1394989200'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (30, 'full', '1397547720'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (31, 'full', '1400181360'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (32, 'full', '1402632660'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (33, 'full', '1405164300'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (34, 'full', '1407693600'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (35, 'full', '1385775480'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (36, 'full', '1412074260'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (37, 'full', '1415312580'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (38, 'full', '1417868820'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (39, 'last', '1390540740'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (40, 'last', '1393089300'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (41, 'last', '1395625560'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (42, 'last', '1398153120'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (43, 'last', '1400677140'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (44, 'last', '1403203140'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (45, 'last', '1405735200'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (46, 'last', '1408278360'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (47, 'last', '1410833100'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (48, 'last', '1413400920'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (49, 'last', '1415978160'); INSERT INTO `moondata` (`ID`, `TYPE`, `TIME`) VALUES (50, 'last', '1418561460');
Genug für heute, im zweiten Teil folgt die Berechnung der Gezeiten…
Gerade habe ich bei einem Streifzug durchs Netz ein PHP Script entdeckt, dass die Mond-Daten zuverlässig berechnen kann (allerdings kämpfe ich derzeit noch mit den Zeitzonen-Einstellungen): http://www.obsid.org/2008/05/calculate-moon-phase-data-with-php.html