meteorshower eingebaut
This commit is contained in:
@@ -134,3 +134,66 @@
|
|||||||
[Fri Apr 3 18:36:49 2026] [::1]:53631 Accepted
|
[Fri Apr 3 18:36:49 2026] [::1]:53631 Accepted
|
||||||
[Fri Apr 3 18:36:49 2026] [::1]:53631 [200]: GET /favicon.ico
|
[Fri Apr 3 18:36:49 2026] [::1]:53631 [200]: GET /favicon.ico
|
||||||
[Fri Apr 3 18:36:49 2026] [::1]:53631 Closing
|
[Fri Apr 3 18:36:49 2026] [::1]:53631 Closing
|
||||||
|
[Fri Apr 3 18:44:31 2026] [::1]:59929 Accepted
|
||||||
|
[Fri Apr 3 18:44:36 2026] [::1]:59929 [200]: GET /monatsvorhersage_old.php?year=2026&month=8
|
||||||
|
[Fri Apr 3 18:44:36 2026] [::1]:59929 Closing
|
||||||
|
[Fri Apr 3 18:45:03 2026] [::1]:63306 Accepted
|
||||||
|
[Fri Apr 3 18:45:09 2026] [::1]:63306 [200]: GET /monatsvorhersage_old.php?year=2026&month=8
|
||||||
|
[Fri Apr 3 18:45:09 2026] [::1]:63306 Closing
|
||||||
|
[Fri Apr 3 18:48:05 2026] [::1]:62679 Accepted
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:62679 [200]: GET /monatsvorhersage_old.php?year=2026&month=4
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:62679 Closing
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:49184 Accepted
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:49184 [200]: GET /css/style.css
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:49184 Closing
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:52798 Accepted
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:52798 [200]: GET /js/astronomy.browser.min.js
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:52798 Closing
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:55547 Accepted
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:55547 [200]: GET /images/star16x16.png
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:55238 Accepted
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:55238 [200]: GET /images/star16x16_rays.png
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:55547 Closing
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:55238 Closing
|
||||||
|
[Fri Apr 3 18:48:10 2026] [::1]:56364 Accepted
|
||||||
|
[Fri Apr 3 18:48:11 2026] [::1]:56364 [200]: GET /favicon.ico
|
||||||
|
[Fri Apr 3 18:48:11 2026] [::1]:56364 Closing
|
||||||
|
[Fri Apr 3 18:49:14 2026] [::1]:56788 Accepted
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:56788 [200]: GET /monatsvorhersage_old.php?year=2026&month=8
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:56788 Closing
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:50541 Accepted
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:50541 [200]: GET /css/style.css
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:64984 Accepted
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:50541 Closing
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:64984 [200]: GET /js/astronomy.browser.min.js
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:64984 Closing
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:59992 Accepted
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:59556 Accepted
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:59992 [200]: GET /images/star16x16.png
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:59556 [200]: GET /images/star16x16_rays.png
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:59992 Closing
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:59556 Closing
|
||||||
|
[Fri Apr 3 18:49:19 2026] [::1]:50294 Accepted
|
||||||
|
[Fri Apr 3 18:49:20 2026] [::1]:50294 [200]: GET /favicon.ico
|
||||||
|
[Fri Apr 3 18:49:20 2026] [::1]:50294 Closing
|
||||||
|
[Fri Apr 3 18:51:40 2026] [::1]:63754 Accepted
|
||||||
|
[Fri Apr 3 18:51:46 2026] [::1]:63754 [200]: GET /monatsvorhersage_old.php?year=2026&month=8
|
||||||
|
[Fri Apr 3 18:51:46 2026] [::1]:63754 Closing
|
||||||
|
[Fri Apr 3 18:53:18 2026] [::1]:57294 Accepted
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:57294 [200]: GET /monatsvorhersage_old.php?year=2026&month=8
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:57294 Closing
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:55563 Accepted
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:55563 [200]: GET /css/style.css
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:58259 Accepted
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:55563 Closing
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:58259 [200]: GET /js/astronomy.browser.min.js
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:58259 Closing
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:59141 Accepted
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:59141 [200]: GET /images/star16x16.png
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:56253 Accepted
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:56253 [200]: GET /images/star16x16_rays.png
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:59141 Closing
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:56253 Closing
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:53603 Accepted
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:53603 [200]: GET /favicon.ico
|
||||||
|
[Fri Apr 3 18:53:24 2026] [::1]:53603 Closing
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ $venusPeakMagnitudeEvents = [];
|
|||||||
$outerPlanetEvents = [];
|
$outerPlanetEvents = [];
|
||||||
$outerPlanetStationEvents = [];
|
$outerPlanetStationEvents = [];
|
||||||
$moonOccultations = [];
|
$moonOccultations = [];
|
||||||
|
$meteorShowerPeaks = [];
|
||||||
$seasonChanges = [];
|
$seasonChanges = [];
|
||||||
$timeChanges = [];
|
$timeChanges = [];
|
||||||
$monthEventList = [];
|
$monthEventList = [];
|
||||||
@@ -92,6 +93,91 @@ if (!function_exists('buildMonthOccultationStarLabel')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!function_exists('normalizeMonthForecastDegree')) {
|
||||||
|
function normalizeMonthForecastDegree(float $value): float
|
||||||
|
{
|
||||||
|
$normalized = fmod($value, 360.0);
|
||||||
|
if ($normalized < 0.0) {
|
||||||
|
$normalized += 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $normalized;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('monthForecastSolarLongitude')) {
|
||||||
|
function monthForecastSolarLongitude(DateTimeImmutable $dateTime): float
|
||||||
|
{
|
||||||
|
$julianDay = ((float) $dateTime->format('U')) / 86400.0 + 2440587.5;
|
||||||
|
$daysSinceJ2000 = $julianDay - 2451545.0;
|
||||||
|
$meanLongitude = normalizeMonthForecastDegree(280.46 + 0.9856474 * $daysSinceJ2000);
|
||||||
|
$meanAnomalyRad = deg2rad(normalizeMonthForecastDegree(357.528 + 0.9856003 * $daysSinceJ2000));
|
||||||
|
|
||||||
|
return normalizeMonthForecastDegree(
|
||||||
|
$meanLongitude
|
||||||
|
+ 1.915 * sin($meanAnomalyRad)
|
||||||
|
+ 0.020 * sin(2.0 * $meanAnomalyRad)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('monthForecastForwardDegreeDistance')) {
|
||||||
|
function monthForecastForwardDegreeDistance(float $from, float $to): float
|
||||||
|
{
|
||||||
|
return normalizeMonthForecastDegree($to - $from);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('monthForecastRadiantIsVisible')) {
|
||||||
|
function monthForecastRadiantIsVisible(float $latitudeDeg, ?float $declinationDeg): bool
|
||||||
|
{
|
||||||
|
if ($declinationDeg === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return abs($latitudeDeg - $declinationDeg) < 90.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('findMonthForecastSolarLongitudeCrossing')) {
|
||||||
|
function findMonthForecastSolarLongitudeCrossing(
|
||||||
|
DateTimeImmutable $rangeStartLocal,
|
||||||
|
DateTimeImmutable $rangeEndLocal,
|
||||||
|
float $targetLongitude,
|
||||||
|
DateTimeZone $displayTimezone
|
||||||
|
): ?DateTimeImmutable {
|
||||||
|
$utc = new DateTimeZone('UTC');
|
||||||
|
$rangeStartUtc = $rangeStartLocal->setTimezone($utc);
|
||||||
|
$rangeEndUtc = $rangeEndLocal->setTimezone($utc);
|
||||||
|
|
||||||
|
$startLongitude = monthForecastSolarLongitude($rangeStartUtc);
|
||||||
|
$endLongitude = monthForecastSolarLongitude($rangeEndUtc);
|
||||||
|
$targetDelta = monthForecastForwardDegreeDistance($startLongitude, $targetLongitude);
|
||||||
|
$rangeDelta = monthForecastForwardDegreeDistance($startLongitude, $endLongitude);
|
||||||
|
|
||||||
|
if ($targetDelta > $rangeDelta + 0.0001) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$low = (int) $rangeStartUtc->format('U');
|
||||||
|
$high = (int) $rangeEndUtc->format('U');
|
||||||
|
|
||||||
|
for ($i = 0; $i < 40; $i++) {
|
||||||
|
$mid = (int) floor(($low + $high) / 2);
|
||||||
|
$midLongitude = monthForecastSolarLongitude(new DateTimeImmutable('@' . $mid));
|
||||||
|
$midDelta = monthForecastForwardDegreeDistance($startLongitude, $midLongitude);
|
||||||
|
|
||||||
|
if ($midDelta < $targetDelta) {
|
||||||
|
$low = $mid;
|
||||||
|
} else {
|
||||||
|
$high = $mid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (new DateTimeImmutable('@' . $high))->setTimezone($displayTimezone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$dbConfig = require __DIR__ . '/../config/database.php';
|
$dbConfig = require __DIR__ . '/../config/database.php';
|
||||||
$dsn = sprintf(
|
$dsn = sprintf(
|
||||||
@@ -250,6 +336,24 @@ try {
|
|||||||
'size' => $row['major_axis'] !== null ? (float) $row['major_axis'] : 8.0,
|
'size' => $row['major_axis'] !== null ? (float) $row['major_axis'] : 8.0,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$meteorStmt = $pdo->query(
|
||||||
|
"SELECT designation, shower_code, radiant_delta_deg, peak_sol, zhr, zhr_variable
|
||||||
|
FROM meteorshowers
|
||||||
|
WHERE peak_sol IS NOT NULL
|
||||||
|
ORDER BY peak_sol ASC, designation ASC"
|
||||||
|
);
|
||||||
|
|
||||||
|
while ($row = $meteorStmt->fetch()) {
|
||||||
|
$meteorShowerPeaks[] = [
|
||||||
|
'designation' => trim((string) ($row['designation'] ?? '')),
|
||||||
|
'shower_code' => trim((string) ($row['shower_code'] ?? '')),
|
||||||
|
'radiant_delta_deg' => $row['radiant_delta_deg'] !== null ? (float) $row['radiant_delta_deg'] : null,
|
||||||
|
'peak_sol' => (float) $row['peak_sol'],
|
||||||
|
'zhr' => $row['zhr'] !== null ? (int) $row['zhr'] : null,
|
||||||
|
'zhr_variable' => trim((string) ($row['zhr_variable'] ?? '')),
|
||||||
|
];
|
||||||
|
}
|
||||||
} catch (Throwable $e) {
|
} catch (Throwable $e) {
|
||||||
$starDataError = $e->getMessage();
|
$starDataError = $e->getMessage();
|
||||||
}
|
}
|
||||||
@@ -884,6 +988,62 @@ foreach ($moonOccultations as $occultationEvent) {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$monthStartLocal = new DateTimeImmutable(
|
||||||
|
sprintf('%04d-%02d-01 00:00:00', $selectedYear, $selectedMonth),
|
||||||
|
new DateTimeZone($chartTimezone)
|
||||||
|
);
|
||||||
|
$monthEndLocal = $monthStartLocal->modify('first day of next month');
|
||||||
|
|
||||||
|
foreach ($meteorShowerPeaks as $meteorShowerPeak) {
|
||||||
|
if (!monthForecastRadiantIsVisible($chartLatitude, $meteorShowerPeak['radiant_delta_deg'] ?? null)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$peakSol = isset($meteorShowerPeak['peak_sol']) ? (float) $meteorShowerPeak['peak_sol'] : null;
|
||||||
|
if ($peakSol === null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$peakDateTime = findMonthForecastSolarLongitudeCrossing(
|
||||||
|
$monthStartLocal,
|
||||||
|
$monthEndLocal,
|
||||||
|
$peakSol,
|
||||||
|
new DateTimeZone($chartTimezone)
|
||||||
|
);
|
||||||
|
if (!$peakDateTime instanceof DateTimeImmutable) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$designation = trim((string) ($meteorShowerPeak['designation'] ?? ''));
|
||||||
|
$showerCode = trim((string) ($meteorShowerPeak['shower_code'] ?? ''));
|
||||||
|
$zhr = $meteorShowerPeak['zhr'] ?? null;
|
||||||
|
$zhrVariable = trim((string) ($meteorShowerPeak['zhr_variable'] ?? ''));
|
||||||
|
$rateText = '';
|
||||||
|
|
||||||
|
if (is_int($zhr) && $zhr >= 0) {
|
||||||
|
$rateText = 'ZHR ca. ' . $zhr;
|
||||||
|
} elseif ($zhrVariable !== '') {
|
||||||
|
$rateText = 'ZHR ca. ' . $zhrVariable;
|
||||||
|
}
|
||||||
|
|
||||||
|
$labelParts = [];
|
||||||
|
$labelParts[] = 'Maximum ' . ($designation !== '' ? $designation : 'Meteorstrom');
|
||||||
|
if ($showerCode !== '') {
|
||||||
|
$labelParts[] = $showerCode;
|
||||||
|
}
|
||||||
|
if ($rateText !== '') {
|
||||||
|
$labelParts[] = $rateText;
|
||||||
|
}
|
||||||
|
|
||||||
|
$monthEventList[] = [
|
||||||
|
'event' => implode(' - ', $labelParts),
|
||||||
|
'date' => $peakDateTime->format('d.m.Y'),
|
||||||
|
'time' => $peakDateTime->format('H:i'),
|
||||||
|
'local_iso' => $peakDateTime->format(DateTimeInterface::ATOM),
|
||||||
|
'type' => 'meteor_shower_peak',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
usort(
|
usort(
|
||||||
$monthEventList,
|
$monthEventList,
|
||||||
static fn (array $a, array $b): int => strcmp((string) ($a['local_iso'] ?? ''), (string) ($b['local_iso'] ?? ''))
|
static fn (array $a, array $b): int => strcmp((string) ($a['local_iso'] ?? ''), (string) ($b['local_iso'] ?? ''))
|
||||||
|
|||||||
Reference in New Issue
Block a user