From c7e7d0438aac5aed931155a3d2ddc176569b454e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Sat, 20 Jun 2026 20:06:33 +0200 Subject: [PATCH] all --- .../export_stars_and_constellations.php | 197 ++++++++++++++++++ todo.md | 17 -- 2 files changed, 197 insertions(+), 17 deletions(-) create mode 100644 scripts/export/export_stars_and_constellations.php diff --git a/scripts/export/export_stars_and_constellations.php b/scripts/export/export_stars_and_constellations.php new file mode 100644 index 0000000..981d598 --- /dev/null +++ b/scripts/export/export_stars_and_constellations.php @@ -0,0 +1,197 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + ]); +} catch (Throwable $e) { + fwrite(STDERR, "Datenbankverbindung fehlgeschlagen: {$e->getMessage()}\n"); + exit(1); +} + +$outputDir = $rootDir . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR . 'data'; +if (!is_dir($outputDir) && !mkdir($outputDir, 0777, true) && !is_dir($outputDir)) { + fwrite(STDERR, "Ausgabeverzeichnis konnte nicht erstellt werden: {$outputDir}\n"); + exit(1); +} + +$starMagnitudeLimit = 6.0; + +$stars = []; +$starStmt = $pdo->query( + "SELECT hip, proper, bayer, bf, con, spect, mag, ci, `ra`, `dec`, rarad, decrad + FROM star_hipparcos + WHERE mag IS NOT NULL + AND mag <= " . $starMagnitudeLimit . " + AND rarad IS NOT NULL + AND decrad IS NOT NULL + ORDER BY mag ASC, hip ASC" +); + +while ($row = $starStmt->fetch()) { + $stars[] = [ + 'hip' => $row['hip'] !== null ? (int) $row['hip'] : null, + 'proper' => trim((string) ($row['proper'] ?? '')), + 'bayer' => trim((string) ($row['bayer'] ?? '')), + 'bf' => trim((string) ($row['bf'] ?? '')), + 'con' => trim((string) ($row['con'] ?? '')), + 'spect' => trim((string) ($row['spect'] ?? '')), + 'ra_hours' => $row['ra'] !== null ? (float) $row['ra'] : null, + 'dec_degrees' => $row['dec'] !== null ? (float) $row['dec'] : null, + 'ra_radians' => (float) $row['rarad'], + 'dec_radians' => (float) $row['decrad'], + 'mag' => (float) $row['mag'], + 'ci' => $row['ci'] !== null ? (float) $row['ci'] : null, + ]; +} + +$constellations = []; +$ensureConstellation = static function (string $id) use (&$constellations): void { + if (!isset($constellations[$id])) { + $constellations[$id] = [ + 'id' => $id, + 'common_name' => [ + 'german' => null, + 'native' => null, + 'byname' => null, + ], + 'label_positions' => [], + 'lines' => [], + ]; + } +}; + +$constellationStmt = $pdo->query("SELECT id FROM constellations ORDER BY id"); +foreach ($constellationStmt as $row) { + $ensureConstellation((string) $row['id']); +} + +$nameStmt = $pdo->query( + "SELECT constellation_id, german_name, native_name, byname + FROM constellation_names + ORDER BY constellation_id" +); +foreach ($nameStmt as $row) { + $id = (string) $row['constellation_id']; + $ensureConstellation($id); + $constellations[$id]['common_name'] = [ + 'german' => $row['german_name'] !== null ? (string) $row['german_name'] : null, + 'native' => $row['native_name'] !== null ? (string) $row['native_name'] : null, + 'byname' => $row['byname'] !== null ? (string) $row['byname'] : null, + ]; +} + +$labelStmt = $pdo->query( + "SELECT constellation_id, position_index, ra_hours, dec_degrees + FROM constellation_label_positions + ORDER BY constellation_id, position_index" +); +foreach ($labelStmt as $row) { + $id = (string) $row['constellation_id']; + $ensureConstellation($id); + $constellations[$id]['label_positions'][] = [ + 'index' => (int) $row['position_index'], + 'ra_hours' => (float) $row['ra_hours'], + 'dec_degrees' => (float) $row['dec_degrees'], + ]; +} + +$lineStmt = $pdo->query( + "SELECT cl.constellation_id, cl.line_index, clp.point_index, clp.hip_number + FROM constellation_lines cl + INNER JOIN constellation_line_points clp ON clp.line_id = cl.id + ORDER BY cl.constellation_id, cl.line_index, clp.point_index" +); +foreach ($lineStmt as $row) { + $id = (string) $row['constellation_id']; + $lineIndex = (int) $row['line_index']; + $ensureConstellation($id); + $constellations[$id]['lines'][$lineIndex] ??= [ + 'index' => $lineIndex, + 'points' => [], + ]; + $constellations[$id]['lines'][$lineIndex]['points'][] = [ + 'index' => (int) $row['point_index'], + 'hip' => (int) $row['hip_number'], + ]; +} + +foreach ($constellations as &$constellation) { + if ($constellation['lines'] !== []) { + ksort($constellation['lines']); + $constellation['lines'] = array_values($constellation['lines']); + } +} +unset($constellation); + +ksort($constellations); + +$generatedAt = gmdate('c'); + +$starsPayload = [ + 'generated_at' => $generatedAt, + 'source' => 'star_hipparcos', + 'magnitude_limit' => $starMagnitudeLimit, + 'count' => count($stars), + 'stars' => $stars, +]; + +$constellationsPayload = [ + 'generated_at' => $generatedAt, + 'sources' => [ + 'constellations', + 'constellation_names', + 'constellation_label_positions', + 'constellation_lines', + 'constellation_line_points', + ], + 'count' => count($constellations), + 'constellations' => array_values($constellations), +]; + +$jsonFlags = JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES; + +$starsPath = $outputDir . DIRECTORY_SEPARATOR . 'stars_mag6.json'; +$constellationsPath = $outputDir . DIRECTORY_SEPARATOR . 'constellations.json'; + +if (file_put_contents($starsPath, json_encode($starsPayload, $jsonFlags) . PHP_EOL) === false) { + fwrite(STDERR, "Konnte {$starsPath} nicht schreiben.\n"); + exit(1); +} + +if (file_put_contents($constellationsPath, json_encode($constellationsPayload, $jsonFlags) . PHP_EOL) === false) { + fwrite(STDERR, "Konnte {$constellationsPath} nicht schreiben.\n"); + exit(1); +} + +fwrite(STDOUT, "Export abgeschlossen.\n"); +fwrite(STDOUT, "Sterne: " . count($stars) . " -> {$starsPath}\n"); +fwrite(STDOUT, "Sternbilder: " . count($constellations) . " -> {$constellationsPath}\n"); diff --git a/todo.md b/todo.md index 4aa0a0e..e804795 100644 --- a/todo.md +++ b/todo.md @@ -1,20 +1,3 @@ -Startseite, DeepSky beobachtungszeit angeben, Astronomische Dämmerung! - -# Monatsvorschau TODO -- Sichtbare ISS-Ueberfluege fuer den Standort ergaenzen -- Hesiodusstrahl als eigenes Mondlichtphaenomen fuer die Monatsvorschau ergaenzen -- Radiant in die Monatsübersicht -- Kometen in die Monatsübersicht -- Kleinplaneten rein (Favoriten!) - -Winkel -Grad, Bogenminute, Bogensekunde, Radiant - -Rektaszension / Deklination -Stunden hh:mm:ss in Grad und zurück, Deklination dd:mm:ss - - - Magnitude / Helligkeit Magnitudendifferenz in Helligkeitsfaktor und zurück