Files
skyview.astronomiemuseum.de/docs/README_DATENBANKABFRAGEN.md
T

162 lines
5.0 KiB
Markdown

# 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
<?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:
```powershell
C:\laragon\bin\php\php-8.4.5-nts-Win32-vs17-x64\php.exe .codex-temp\check_defaults.php
```
## Praktische Beispielabfragen
`Ceres` pruefen:
```sql
SELECT id, mp_number, designation_text, desig_packed
FROM minorplanets_mpc
WHERE mp_number = 1
LIMIT 1;
```
`Halley` pruefen:
```sql
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:
```powershell
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`:
```text
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:
```text
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`.