all
This commit is contained in:
@@ -0,0 +1,197 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
ini_set('memory_limit', '512M');
|
||||||
|
|
||||||
|
$rootDir = dirname(__DIR__, 2);
|
||||||
|
$dbConfigPath = $rootDir . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'database.php';
|
||||||
|
|
||||||
|
if (!is_file($dbConfigPath)) {
|
||||||
|
fwrite(STDERR, "Konfigurationsdatei nicht gefunden: {$dbConfigPath}\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$dbConfig = require $dbConfigPath;
|
||||||
|
|
||||||
|
foreach (['host', 'dbname', 'user', 'pass'] as $requiredKey) {
|
||||||
|
if (!isset($dbConfig[$requiredKey]) || !is_string($dbConfig[$requiredKey]) || $dbConfig[$requiredKey] === '') {
|
||||||
|
fwrite(STDERR, "Fehlende oder ungültige DB-Konfiguration: {$requiredKey}\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$dsn = sprintf(
|
||||||
|
'mysql:host=%s;dbname=%s;charset=%s',
|
||||||
|
$dbConfig['host'],
|
||||||
|
$dbConfig['dbname'],
|
||||||
|
$dbConfig['charset'] ?? 'utf8mb4'
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$pdo = new PDO($dsn, $dbConfig['user'], $dbConfig['pass'], [
|
||||||
|
PDO::ATTR_ERRMODE => 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");
|
||||||
@@ -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
|
Magnitude / Helligkeit
|
||||||
Magnitudendifferenz in Helligkeitsfaktor und zurück
|
Magnitudendifferenz in Helligkeitsfaktor und zurück
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user