Konjunktionen von Planeten eingebaut
This commit is contained in:
@@ -17,6 +17,7 @@ $starLabelMagnitudeLimit = 2.0;
|
||||
$messierDatabaseMagnitudeLimit = 4.0;
|
||||
$messierDisplayMagnitudeLimit = 1.0;
|
||||
$moonPlanetMaxSeparationDeg = 1.5;
|
||||
$planetConjunctionMaxSeparationDeg = 1.0;
|
||||
$moonOccultationMaxMag = 2.0;
|
||||
|
||||
$years = range($currentYear - 2, $currentYear + 5);
|
||||
@@ -57,7 +58,9 @@ $planetData = [];
|
||||
$moonData = null;
|
||||
$moonPhaseEvents = [];
|
||||
$moonPlanetApproaches = [];
|
||||
$planetConjunctions = [];
|
||||
$moonOccultations = [];
|
||||
$seasonChanges = [];
|
||||
$monthEventList = [];
|
||||
$starDataError = null;
|
||||
|
||||
@@ -327,6 +330,23 @@ if (is_array($moonPhaseDecoded) && ($moonPhaseDecoded['ok'] ?? false)) {
|
||||
$moonPhaseEvents = is_array($moonPhaseDecoded['phases'] ?? null) ? $moonPhaseDecoded['phases'] : [];
|
||||
}
|
||||
|
||||
$seasonOutput = [];
|
||||
$seasonExitCode = 0;
|
||||
$seasonArgs = [
|
||||
$pythonScriptPath,
|
||||
'season_changes_for_month',
|
||||
(string) $selectedYear,
|
||||
(string) $selectedMonth,
|
||||
$chartTimezone,
|
||||
];
|
||||
$seasonCommand = $pythonExecutable . ' ' . implode(' ', array_map('escapeshellarg', $seasonArgs)) . ' 2>&1';
|
||||
exec($seasonCommand, $seasonOutput, $seasonExitCode);
|
||||
$seasonRaw = trim(implode("\n", $seasonOutput));
|
||||
$seasonDecoded = json_decode($seasonRaw, true);
|
||||
if (is_array($seasonDecoded) && ($seasonDecoded['ok'] ?? false)) {
|
||||
$seasonChanges = is_array($seasonDecoded['changes'] ?? null) ? $seasonDecoded['changes'] : [];
|
||||
}
|
||||
|
||||
$moonPlanetOutput = [];
|
||||
$moonPlanetExitCode = 0;
|
||||
$moonPlanetArgs = [
|
||||
@@ -348,6 +368,27 @@ if (is_array($moonPlanetDecoded) && ($moonPlanetDecoded['ok'] ?? false)) {
|
||||
$moonPlanetApproaches = is_array($moonPlanetDecoded['approaches'] ?? null) ? $moonPlanetDecoded['approaches'] : [];
|
||||
}
|
||||
|
||||
$planetConjunctionOutput = [];
|
||||
$planetConjunctionExitCode = 0;
|
||||
$planetConjunctionArgs = [
|
||||
$pythonScriptPath,
|
||||
'planet_conjunctions_for_month',
|
||||
(string) $chartLatitude,
|
||||
(string) $chartLongitude,
|
||||
(string) $chartElevation,
|
||||
(string) $selectedYear,
|
||||
(string) $selectedMonth,
|
||||
$chartTimezone,
|
||||
(string) $planetConjunctionMaxSeparationDeg,
|
||||
];
|
||||
$planetConjunctionCommand = $pythonExecutable . ' ' . implode(' ', array_map('escapeshellarg', $planetConjunctionArgs)) . ' 2>&1';
|
||||
exec($planetConjunctionCommand, $planetConjunctionOutput, $planetConjunctionExitCode);
|
||||
$planetConjunctionRaw = trim(implode("\n", $planetConjunctionOutput));
|
||||
$planetConjunctionDecoded = json_decode($planetConjunctionRaw, true);
|
||||
if (is_array($planetConjunctionDecoded) && ($planetConjunctionDecoded['ok'] ?? false)) {
|
||||
$planetConjunctions = is_array($planetConjunctionDecoded['conjunctions'] ?? null) ? $planetConjunctionDecoded['conjunctions'] : [];
|
||||
}
|
||||
|
||||
$moonOccultationStars = [];
|
||||
try {
|
||||
if (isset($pdo)) {
|
||||
@@ -427,13 +468,27 @@ foreach ($moonPhaseEvents as $phaseEvent) {
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($seasonChanges as $seasonChange) {
|
||||
if (!is_array($seasonChange)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$monthEventList[] = [
|
||||
'event' => (string) ($seasonChange['label'] ?? 'Jahreszeitenwechsel'),
|
||||
'date' => (string) ($seasonChange['local_date'] ?? ''),
|
||||
'time' => (string) ($seasonChange['local_time'] ?? ''),
|
||||
'local_iso' => (string) ($seasonChange['local_iso'] ?? ''),
|
||||
'type' => 'season_change',
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($moonPlanetApproaches as $approachEvent) {
|
||||
if (!is_array($approachEvent)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$distanceText = isset($approachEvent['separation_deg'])
|
||||
? number_format((float) $approachEvent['separation_deg'], 2, ',', '') . '°'
|
||||
? number_format((float) $approachEvent['separation_deg'], 2, ',', '') . ' Grad'
|
||||
: '';
|
||||
|
||||
$monthEventList[] = [
|
||||
@@ -445,6 +500,24 @@ foreach ($moonPlanetApproaches as $approachEvent) {
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($planetConjunctions as $conjunctionEvent) {
|
||||
if (!is_array($conjunctionEvent)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$distanceText = isset($conjunctionEvent['separation_deg'])
|
||||
? number_format((float) $conjunctionEvent['separation_deg'], 2, ',', '') . ' Grad'
|
||||
: '';
|
||||
|
||||
$monthEventList[] = [
|
||||
'event' => trim((string) ($conjunctionEvent['label'] ?? 'Planetenkonjunktion') . ($distanceText !== '' ? ' (' . $distanceText . ')' : '')),
|
||||
'date' => (string) ($conjunctionEvent['local_date'] ?? ''),
|
||||
'time' => (string) ($conjunctionEvent['local_time'] ?? ''),
|
||||
'local_iso' => (string) ($conjunctionEvent['local_iso'] ?? ''),
|
||||
'type' => 'planet_conjunction',
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($moonOccultations as $occultationEvent) {
|
||||
if (!is_array($occultationEvent)) {
|
||||
continue;
|
||||
@@ -459,7 +532,7 @@ foreach ($moonOccultations as $occultationEvent) {
|
||||
$starLabel = (string) ($star['label'] ?? 'Stern');
|
||||
$starMag = isset($star['mag']) ? number_format((float) $star['mag'], 1, ',', '') : '';
|
||||
$monthEventList[] = [
|
||||
'event' => 'Mond bedeckt ' . $starLabel . ($starMag !== '' ? ' (mag ' . $starMag . ')' : ''),
|
||||
'event' => 'Mond bedeckt ' . $starLabel . ($starMag !== '' ? ' (' . $starMag . ' mag)' : ''),
|
||||
'date' => (string) ($maximum['local_date'] ?? ''),
|
||||
'time' => (string) ($maximum['local_time'] ?? ''),
|
||||
'local_iso' => (string) ($maximum['local_iso'] ?? ''),
|
||||
@@ -558,7 +631,7 @@ $starDataErrorJson = json_encode($starDataError, JSON_UNESCAPED_UNICODE | JSON_U
|
||||
<section class="monatskarte-card">
|
||||
<div class="monatskarte-header">
|
||||
<div>
|
||||
<h3>Südhimmel <?= htmlspecialchars($months[$selectedMonth] . ' ' . (string) $selectedYear, ENT_QUOTES, 'UTF-8') ?></h3>
|
||||
<h3>Südhimmel <?= htmlspecialchars($months[$selectedMonth] . ' ' . (string) $selectedYear, ENT_QUOTES, 'UTF-8') ?></h3>
|
||||
<p id="monatskarteSouthMeta">
|
||||
<?= htmlspecialchars($chartConfig['localTimeLabel'], ENT_QUOTES, 'UTF-8') ?>,
|
||||
<?= htmlspecialchars($chartLocationName, ENT_QUOTES, 'UTF-8') ?>
|
||||
@@ -567,25 +640,25 @@ $starDataErrorJson = json_encode($starDataError, JSON_UNESCAPED_UNICODE | JSON_U
|
||||
</div>
|
||||
|
||||
<div class="monatskarte-stage monatskarte-stage-south">
|
||||
<canvas id="monatskarteSouthCanvas" width="1200" height="720" aria-label="Südhimmel-Projektion"></canvas>
|
||||
<canvas id="monatskarteSouthCanvas" width="1200" height="720" aria-label="Südhimmel-Projektion"></canvas>
|
||||
</div>
|
||||
|
||||
<div class="monatskarte-footer">
|
||||
<p id="monatskarteSouthStatus">Bereite Südhimmelkarte vor...</p>
|
||||
<p id="monatskarteSouthStatus">Bereite Südhimmelkarte vor...</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="monatskarte-card">
|
||||
<div class="monatskarte-header">
|
||||
<div>
|
||||
<h3>Mondphasen <?= htmlspecialchars($months[$selectedMonth] . ' ' . (string) $selectedYear, ENT_QUOTES, 'UTF-8') ?></h3>
|
||||
<p>Chronologisch für <?= htmlspecialchars($chartTimezone, ENT_QUOTES, 'UTF-8') ?></p>
|
||||
<h3>Ereignisse <?= htmlspecialchars($months[$selectedMonth] . ' ' . (string) $selectedYear, ENT_QUOTES, 'UTF-8') ?></h3>
|
||||
<p>Chronologische Monatsliste fuer <?= htmlspecialchars($chartTimezone, ENT_QUOTES, 'UTF-8') ?></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="monatskarte-footer">
|
||||
<?php if ($monthEventList): ?>
|
||||
<div class="riseset-grid" style="grid-template-columns: 1.3fr 1fr 1fr; row-gap: 10px;">
|
||||
<div class="riseset-grid" style="grid-template-columns: 1.5fr 1fr 1fr; row-gap: 10px;">
|
||||
<span class="riseset-label riseset-dim">Ereignis</span>
|
||||
<span class="riseset-label riseset-dim">Datum</span>
|
||||
<span class="riseset-label riseset-dim">Uhrzeit</span>
|
||||
@@ -596,68 +669,11 @@ $starDataErrorJson = json_encode($starDataError, JSON_UNESCAPED_UNICODE | JSON_U
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<p>Keine Mondphasen für diesen Monat gefunden.</p>
|
||||
<p>Fuer diesen Monat wurden keine Ereignisse gefunden.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="monatskarte-card">
|
||||
<div class="monatskarte-header">
|
||||
<div>
|
||||
<h3>Mond nahe Planeten</h3>
|
||||
<p>Maximalabstand <?= htmlspecialchars(number_format($moonPlanetMaxSeparationDeg, 1, ',', ''), ENT_QUOTES, 'UTF-8') ?>°</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="monatskarte-footer">
|
||||
<?php if ($moonPlanetApproaches): ?>
|
||||
<div class="riseset-grid" style="grid-template-columns: 1.5fr 1fr 1fr 1fr; row-gap: 10px;">
|
||||
<span class="riseset-label riseset-dim">Ereignis</span>
|
||||
<span class="riseset-label riseset-dim">Datum</span>
|
||||
<span class="riseset-label riseset-dim">Uhrzeit</span>
|
||||
<span class="riseset-label riseset-dim">Abstand</span>
|
||||
<?php foreach ($moonPlanetApproaches as $approachEvent): ?>
|
||||
<span class="riseset-val"><?= htmlspecialchars((string) ($approachEvent['label'] ?? ''), ENT_QUOTES, 'UTF-8') ?></span>
|
||||
<span class="riseset-val"><?= htmlspecialchars((string) ($approachEvent['local_date'] ?? ''), ENT_QUOTES, 'UTF-8') ?></span>
|
||||
<span class="riseset-val"><?= htmlspecialchars((string) ($approachEvent['local_time'] ?? ''), ENT_QUOTES, 'UTF-8') ?></span>
|
||||
<span class="riseset-val"><?= htmlspecialchars(number_format((float) ($approachEvent['separation_deg'] ?? 0), 2, ',', ''), ENT_QUOTES, 'UTF-8') ?>°</span>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<p>Keine Mond-Planet-Nähen innerhalb von <?= htmlspecialchars(number_format($moonPlanetMaxSeparationDeg, 1, ',', ''), ENT_QUOTES, 'UTF-8') ?>° gefunden.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="monatskarte-card">
|
||||
<div class="monatskarte-header">
|
||||
<div>
|
||||
<h3>Sternbedeckungen</h3>
|
||||
<p>Bis Grenzgröße <?= htmlspecialchars(number_format($moonOccultationMaxMag, 1, ',', ''), ENT_QUOTES, 'UTF-8') ?></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="monatskarte-footer">
|
||||
<?php if ($moonOccultations): ?>
|
||||
<div class="riseset-grid" style="grid-template-columns: 1.6fr 1fr 1fr 0.9fr; row-gap: 10px;">
|
||||
<span class="riseset-label riseset-dim">Stern</span>
|
||||
<span class="riseset-label riseset-dim">Datum</span>
|
||||
<span class="riseset-label riseset-dim">Uhrzeit</span>
|
||||
<span class="riseset-label riseset-dim">Mag</span>
|
||||
<?php foreach ($moonOccultations as $occultationEvent): ?>
|
||||
<?php $star = is_array($occultationEvent['star'] ?? null) ? $occultationEvent['star'] : []; ?>
|
||||
<?php $maximum = is_array($occultationEvent['maximum'] ?? null) ? $occultationEvent['maximum'] : []; ?>
|
||||
<span class="riseset-val"><?= htmlspecialchars((string) ($star['label'] ?? ''), ENT_QUOTES, 'UTF-8') ?></span>
|
||||
<span class="riseset-val"><?= htmlspecialchars((string) ($maximum['local_date'] ?? ''), ENT_QUOTES, 'UTF-8') ?></span>
|
||||
<span class="riseset-val"><?= htmlspecialchars((string) ($maximum['local_time'] ?? ''), ENT_QUOTES, 'UTF-8') ?></span>
|
||||
<span class="riseset-val"><?= htmlspecialchars(number_format((float) ($star['mag'] ?? 0), 1, ',', ''), ENT_QUOTES, 'UTF-8') ?></span>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<p>Keine Sternbedeckungen bis Magnitude <?= htmlspecialchars(number_format($moonOccultationMaxMag, 1, ',', ''), ENT_QUOTES, 'UTF-8') ?> gefunden.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -1265,18 +1281,18 @@ const MONTH_CHART_ERROR = <?= $starDataErrorJson ?: 'null' ?>;
|
||||
|
||||
drawDirectionLabel(0, 'Norden', 18, '600 13px Rajdhani, sans-serif', 0.78);
|
||||
drawDirectionLabel(90, 'Westen', 22, '600 13px Rajdhani, sans-serif', 0.78);
|
||||
drawDirectionLabel(180, 'Süden', 18, '600 13px Rajdhani, sans-serif', 0.78);
|
||||
drawDirectionLabel(180, 'Süden', 18, '600 13px Rajdhani, sans-serif', 0.78);
|
||||
drawDirectionLabel(270, 'Osten', 22, '600 13px Rajdhani, sans-serif', 0.78);
|
||||
|
||||
drawDirectionLabel(45, 'Nordosten', 18, '600 11px Rajdhani, sans-serif', 0.64);
|
||||
drawDirectionLabel(315, 'Nordwesten', 18, '600 11px Rajdhani, sans-serif', 0.64);
|
||||
drawDirectionLabel(135, 'Südosten', 18, '600 11px Rajdhani, sans-serif', 0.64);
|
||||
drawDirectionLabel(225, 'Südwesten', 18, '600 11px Rajdhani, sans-serif', 0.64);
|
||||
drawDirectionLabel(135, 'Südosten', 18, '600 11px Rajdhani, sans-serif', 0.64);
|
||||
drawDirectionLabel(225, 'Südwesten', 18, '600 11px Rajdhani, sans-serif', 0.64);
|
||||
|
||||
ctx.fillStyle = 'rgba(214, 226, 255, 0.62)';
|
||||
ctx.font = '600 11px Rajdhani, sans-serif';
|
||||
ctx.fillText('60°', cx, cy - radius * 0.66 - 6);
|
||||
ctx.fillText('30°', cx, cy - radius * 0.33 - 6);
|
||||
ctx.fillText('60°', cx, cy - radius * 0.66 - 6);
|
||||
ctx.fillText('30°', cx, cy - radius * 0.33 - 6);
|
||||
ctx.fillText('Zenit', cx, cy);
|
||||
}
|
||||
|
||||
@@ -2356,9 +2372,9 @@ const MONTH_CHART_ERROR = <?= $starDataErrorJson ?: 'null' ?>;
|
||||
|
||||
const directionLabels = [
|
||||
{ az: 90, text: 'Osten' },
|
||||
{ az: 135, text: 'Südosten' },
|
||||
{ az: 180, text: 'Süden' },
|
||||
{ az: 225, text: 'Südwesten' },
|
||||
{ az: 135, text: 'Südosten' },
|
||||
{ az: 180, text: 'Süden' },
|
||||
{ az: 225, text: 'Südwesten' },
|
||||
{ az: 270, text: 'Westen' },
|
||||
];
|
||||
|
||||
@@ -2384,7 +2400,7 @@ const MONTH_CHART_ERROR = <?= $starDataErrorJson ?: 'null' ?>;
|
||||
ctx.font = '600 11px Rajdhani, sans-serif';
|
||||
ctx.textAlign = 'left';
|
||||
ctx.textBaseline = 'middle';
|
||||
ctx.fillText(`${alt}°`, pt.x + 8, pt.y);
|
||||
ctx.fillText(`${alt}°`, pt.x + 8, pt.y);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2569,7 +2585,7 @@ const MONTH_CHART_ERROR = <?= $starDataErrorJson ?: 'null' ?>;
|
||||
drawMoon(width, height);
|
||||
drawPlanets(width, height);
|
||||
drawStars(width, height);
|
||||
statusEl.textContent = 'Südhimmel für ' + MONTH_CHART_CONFIG.localTimeLabel;
|
||||
statusEl.textContent = 'Südhimmel für ' + MONTH_CHART_CONFIG.localTimeLabel;
|
||||
}
|
||||
|
||||
resizeCanvas();
|
||||
|
||||
Reference in New Issue
Block a user