PHP Gezeiten berechnen | Ebbe und Flut | Teil 1

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…

Ein Gedanke zu „PHP Gezeiten berechnen | Ebbe und Flut | Teil 1

Schreibe einen Kommentar

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