Files

5.0 KiB

Datenbankabfragen

Diese Notiz beschreibt, wie in diesem Projekt lokale Datenbankabfragen ausgefuehrt werden koennen.

Zugangsdaten

Die Verbindungsdaten liegen in:

  • config/database.php

Dort stehen host, dbname, user, pass und charset.

Empfohlener Weg

Am einfachsten ist eine kurze PHP-Datei oder ein kurzes PHP-Skript, das die vorhandene Projektkonfiguration verwendet.

Beispiel:

<?php
declare(strict_types=1);

$config = require __DIR__ . '/../config/database.php';

$dsn = sprintf(
    'mysql:host=%s;dbname=%s;charset=%s',
    $config['host'],
    $config['dbname'],
    $config['charset'] ?? 'utf8mb4'
);

$pdo = new PDO(
    $dsn,
    $config['user'],
    $config['pass'],
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]
);

$stmt = $pdo->query("SELECT id, mp_number, designation_text FROM minorplanets_mpc WHERE mp_number = 1 LIMIT 1");
$row = $stmt->fetch();

echo json_encode($row, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

Ausfuehrung

Wenn php nicht im Systempfad liegt, kann die lokale php.exe direkt verwendet werden.

Beispiel von diesem Rechner:

C:\laragon\bin\php\php-8.4.5-nts-Win32-vs17-x64\php.exe .codex-temp\check_defaults.php

Praktische Beispielabfragen

Ceres pruefen:

SELECT id, mp_number, designation_text, desig_packed
FROM minorplanets_mpc
WHERE mp_number = 1
LIMIT 1;

Halley pruefen:

SELECT id, designation_and_name, orbit_type
FROM comets_mpc
WHERE designation_and_name LIKE '%Halley%'
ORDER BY designation_and_name ASC, id ASC
LIMIT 10;

Hinweise

  • Temporaere Pruefskripte am besten in .codex-temp/ anlegen und danach wieder loeschen.
  • Fuer Projektcode immer die vorhandene config/database.php verwenden und keine Zugangsdaten hart in Dateien eintragen.
  • Wenn nur geprueft werden soll, reichen SELECT-Abfragen ohne schreibende Operationen.

Raumsondenbahnen

Die Bahndaten fuer Voyager 1, Voyager 2 und New Horizons koennen ueber das Importskript direkt aus der JPL Horizons API in die Tabelle spacecraft_tracks geschrieben werden:

C:\laragon\bin\php\php-8.4.5-nts-Win32-vs17-x64\php.exe scripts\import\import_spacecraft_tracks.php

Die Visualisierung in public/solarsystem.php liest diese Daten direkt aus der Datenbank.

Horizons-Abfragen

Die Quelldaten fuer die Datenbank stammen aus der JPL Horizons API:

  • Basis-URL: https://ssd.jpl.nasa.gov/api/horizons.api
  • Format: format=json
  • Ephemeridentyp: EPHEM_TYPE='VECTORS'
  • Zentrum: CENTER='500@10' fuer sonnenzentrierte Vektoren
  • Referenzsystem: REF_SYSTEM='ICRF'
  • Referenzebene: REF_PLANE='ECLIPTIC'
  • Vektortabelle: VEC_TABLE='2'
  • Korrektur: VEC_CORR='NONE'
  • Einheiten: OUT_UNITS='KM-S'
  • Zeittyp: TIME_TYPE='TDB'
  • CSV-Ausgabe: CSV_FORMAT='YES'

Verwendete Objekt-IDs:

  • Voyager 1 = COMMAND='-31'
  • Voyager 2 = COMMAND='-32'
  • New Horizons = COMMAND='-98'

Abfragestrategie

Das Importskript verwendet fuer jede Mission zwei Bereiche:

  • 1 d Schrittweite, solange die Sonde noch innerhalb der aeusseren Planetenbahnen liegt
  • danach 1 mo Schrittweite fuer den restlichen Langzeitverlauf

Aktuell verwendete Grenzen:

  • Voyager 1: taeglich bis 1989-12-05 14:00:00
  • Voyager 2: taeglich bis 1993-03-20 16:29:00
  • New Horizons: taeglich bis 2017-10-19 19:52:00

Beispiel einer monatlichen Abfrage

Beispiel fuer Voyager 1:

https://ssd.jpl.nasa.gov/api/horizons.api?format=json&COMMAND='-31'&OBJ_DATA='NO'&MAKE_EPHEM='YES'&EPHEM_TYPE='VECTORS'&CENTER='500@10'&REF_SYSTEM='ICRF'&REF_PLANE='ECLIPTIC'&VEC_TABLE='2'&VEC_CORR='NONE'&OUT_UNITS='KM-S'&TIME_TYPE='TDB'&START_TIME='1977-09-05 14:00:00'&STOP_TIME='2046-04-12 00:00:00'&STEP_SIZE='1 mo'&CSV_FORMAT='YES'

Das liefert den Block zwischen $$SOE und $$EOE. Daraus werden pro Zeile diese Werte gelesen:

  • jd_tdb
  • date_tdb
  • x_km, y_km, z_km
  • vx_km_s, vy_km_s, vz_km_s

distance_km und distance_au werden danach lokal berechnet.

Einzelabfrage fuer ein exaktes Datum

Wenn fuer das Ende noch ein exakter einzelner Zeitpunkt benoetigt wird, verwenden wir statt START_TIME / STOP_TIME / STEP_SIZE eine TLIST-Abfrage.

Beispiel:

https://ssd.jpl.nasa.gov/api/horizons.api?format=json&COMMAND='-31'&OBJ_DATA='NO'&MAKE_EPHEM='YES'&EPHEM_TYPE='VECTORS'&CENTER='500@10'&REF_SYSTEM='ICRF'&REF_PLANE='ECLIPTIC'&VEC_TABLE='2'&VEC_CORR='NONE'&OUT_UNITS='KM-S'&TIME_TYPE='TDB'&TLIST='2046-04-12 00:00:00'&CSV_FORMAT='YES'

Praktische Hinweise

  • Die API liefert bei Raumsonden oft erst Daten kurz nach dem Start. Wenn eine Fehlermeldung wie No ephemeris prior to ... kommt, muss die Startzeit entsprechend angepasst werden.
  • Fuer die Darstellung in public/solarsystem.php muessen die Daten in derselben Ebene wie das restliche Sonnensystem liegen. Deshalb verwenden wir hier bewusst REF_PLANE='ECLIPTIC'.
  • Fuer die aktive Anzeige werden keine CSV-Dateien mehr benoetigt. Massgeblich ist die Tabelle spacecraft_tracks.