Raumfhrzeuge in das sonnensystem
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
ini_set('display_errors', '1');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$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,
|
||||
]
|
||||
);
|
||||
|
||||
$pdo->exec("
|
||||
CREATE TABLE IF NOT EXISTS `spacecraft_tracks` (
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`mission_key` varchar(64) NOT NULL,
|
||||
`mission_name` varchar(128) NOT NULL,
|
||||
`date_tdb` datetime NOT NULL,
|
||||
`jd_tdb` decimal(16,9) NOT NULL,
|
||||
`x_km` double NOT NULL,
|
||||
`y_km` double NOT NULL,
|
||||
`z_km` double NOT NULL,
|
||||
`vx_km_s` double NOT NULL,
|
||||
`vy_km_s` double NOT NULL,
|
||||
`vz_km_s` double NOT NULL,
|
||||
`distance_km` double NOT NULL,
|
||||
`distance_au` double NOT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
|
||||
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uq_spacecraft_tracks_mission_date` (`mission_key`,`date_tdb`),
|
||||
KEY `idx_spacecraft_tracks_mission_key` (`mission_key`),
|
||||
KEY `idx_spacecraft_tracks_date_tdb` (`date_tdb`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Sonnenzentrierte Horizons-Vektoren fuer Raumsonden'
|
||||
");
|
||||
|
||||
$missions = [
|
||||
[
|
||||
'key' => 'voyager1',
|
||||
'name' => 'Voyager 1',
|
||||
'csv' => __DIR__ . '/../../docs/voyager1_horizons_1977_2046_monthly_sun_centered.csv',
|
||||
],
|
||||
[
|
||||
'key' => 'voyager2',
|
||||
'name' => 'Voyager 2',
|
||||
'csv' => __DIR__ . '/../../docs/voyager2_horizons_1977_2046_monthly_sun_centered.csv',
|
||||
],
|
||||
[
|
||||
'key' => 'new_horizons',
|
||||
'name' => 'New Horizons',
|
||||
'csv' => __DIR__ . '/../../docs/new_horizons_2006_2046_monthly_sun_centered.csv',
|
||||
],
|
||||
];
|
||||
|
||||
$insertStatement = $pdo->prepare("
|
||||
INSERT INTO `spacecraft_tracks` (
|
||||
`mission_key`,
|
||||
`mission_name`,
|
||||
`date_tdb`,
|
||||
`jd_tdb`,
|
||||
`x_km`,
|
||||
`y_km`,
|
||||
`z_km`,
|
||||
`vx_km_s`,
|
||||
`vy_km_s`,
|
||||
`vz_km_s`,
|
||||
`distance_km`,
|
||||
`distance_au`
|
||||
) VALUES (
|
||||
:mission_key,
|
||||
:mission_name,
|
||||
:date_tdb,
|
||||
:jd_tdb,
|
||||
:x_km,
|
||||
:y_km,
|
||||
:z_km,
|
||||
:vx_km_s,
|
||||
:vy_km_s,
|
||||
:vz_km_s,
|
||||
:distance_km,
|
||||
:distance_au
|
||||
)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`mission_name` = VALUES(`mission_name`),
|
||||
`jd_tdb` = VALUES(`jd_tdb`),
|
||||
`x_km` = VALUES(`x_km`),
|
||||
`y_km` = VALUES(`y_km`),
|
||||
`z_km` = VALUES(`z_km`),
|
||||
`vx_km_s` = VALUES(`vx_km_s`),
|
||||
`vy_km_s` = VALUES(`vy_km_s`),
|
||||
`vz_km_s` = VALUES(`vz_km_s`),
|
||||
`distance_km` = VALUES(`distance_km`),
|
||||
`distance_au` = VALUES(`distance_au`)
|
||||
");
|
||||
|
||||
foreach ($missions as $mission) {
|
||||
if (!is_file($mission['csv'])) {
|
||||
throw new RuntimeException('CSV-Datei nicht gefunden: ' . $mission['csv']);
|
||||
}
|
||||
|
||||
$handle = fopen($mission['csv'], 'rb');
|
||||
if ($handle === false) {
|
||||
throw new RuntimeException('CSV-Datei konnte nicht geoeffnet werden: ' . $mission['csv']);
|
||||
}
|
||||
|
||||
$header = fgetcsv($handle, 0, ',', '"', '\\');
|
||||
if ($header === false) {
|
||||
fclose($handle);
|
||||
throw new RuntimeException('CSV-Kopf konnte nicht gelesen werden: ' . $mission['csv']);
|
||||
}
|
||||
|
||||
$count = 0;
|
||||
while (($values = fgetcsv($handle, 0, ',', '"', '\\')) !== false) {
|
||||
if (count($values) !== count($header)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$row = array_combine($header, $values);
|
||||
if (!is_array($row)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$dateTdbRaw = trim((string) ($row['date_tdb'] ?? ''));
|
||||
$dateTdbNormalized = preg_replace('/^A\.D\.\s+/i', '', $dateTdbRaw) ?? $dateTdbRaw;
|
||||
$date = DateTimeImmutable::createFromFormat('Y-M-d H:i:s.u', $dateTdbNormalized, new DateTimeZone('UTC'));
|
||||
if (!$date instanceof DateTimeImmutable) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$insertStatement->execute([
|
||||
':mission_key' => $mission['key'],
|
||||
':mission_name' => $mission['name'],
|
||||
':date_tdb' => $date->format('Y-m-d H:i:s'),
|
||||
':jd_tdb' => (float) $row['jd_tdb'],
|
||||
':x_km' => (float) $row['x_km'],
|
||||
':y_km' => (float) $row['y_km'],
|
||||
':z_km' => (float) $row['z_km'],
|
||||
':vx_km_s' => (float) $row['vx_km_s'],
|
||||
':vy_km_s' => (float) $row['vy_km_s'],
|
||||
':vz_km_s' => (float) $row['vz_km_s'],
|
||||
':distance_km' => (float) $row['distance_km'],
|
||||
':distance_au' => (float) $row['distance_au'],
|
||||
]);
|
||||
$count++;
|
||||
}
|
||||
|
||||
fclose($handle);
|
||||
echo $mission['name'] . ': ' . $count . " Zeilen importiert.\n";
|
||||
}
|
||||
|
||||
echo "Import abgeschlossen.\n";
|
||||
Reference in New Issue
Block a user