Beobachtungsvorschlaege um Objektbilder und Namen erweitern
This commit is contained in:
@@ -270,6 +270,7 @@ CREATE TABLE IF NOT EXISTS `dso_objects` (
|
|||||||
`cstar_names` text DEFAULT NULL,
|
`cstar_names` text DEFAULT NULL,
|
||||||
`identifiers` longtext DEFAULT NULL,
|
`identifiers` longtext DEFAULT NULL,
|
||||||
`common_names` longtext DEFAULT NULL,
|
`common_names` longtext DEFAULT NULL,
|
||||||
|
`common_names_german` longtext DEFAULT NULL,
|
||||||
`ned_notes` longtext DEFAULT NULL,
|
`ned_notes` longtext DEFAULT NULL,
|
||||||
`openngc_notes` longtext DEFAULT NULL,
|
`openngc_notes` longtext DEFAULT NULL,
|
||||||
`image` varchar(255) DEFAULT NULL,
|
`image` varchar(255) DEFAULT NULL,
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ Nur explizit zugeordnete DSO-Typen berücksichtigen. Insbesondere `Dup` (Dublett
|
|||||||
## Größe und Helligkeit
|
## Größe und Helligkeit
|
||||||
|
|
||||||
- Der Größenfilter gilt ausschließlich für die fünf Deep-Sky-Gruppen in der Tabelle, niemals für Einzelsterne, Doppelsterne, Veränderliche, Planeten, Mond oder Kometen.
|
- Der Größenfilter gilt ausschließlich für die fünf Deep-Sky-Gruppen in der Tabelle, niemals für Einzelsterne, Doppelsterne, Veränderliche, Planeten, Mond oder Kometen.
|
||||||
- Vorgabe für die maximale Deep-Sky-Größe: 500 Bogensekunden; im Formular änderbar oder durch Leeren aufhebbar.
|
- Die maximale Deep-Sky-Größe wird im Formular in Bogenminuten eingegeben und ist auf 60′ begrenzt; ein leeres Feld hebt die jeweilige Grenze auf. Intern wird weiterhin in Bogensekunden gerechnet.
|
||||||
- Als Größenmaß dient die große Achse `major_axis`: Bogenminuten × 60 = Bogensekunden. Der Import übernimmt diesen Wert unverändert; die Einheit ist in der [OpenNGC-Katalogbeschreibung](https://github.com/mattiaverga/OpenNGC/blob/master/NGC_guide.txt) dokumentiert. Fehlende oder nicht positive Größen werden bei aktiver Größengrenze ausgelassen.
|
- Als Größenmaß dient die große Achse `major_axis`: Bogenminuten × 60 = Bogensekunden. Der Import übernimmt diesen Wert unverändert; die Einheit ist in der [OpenNGC-Katalogbeschreibung](https://github.com/mattiaverga/OpenNGC/blob/master/NGC_guide.txt) dokumentiert. Fehlende oder nicht positive Größen werden bei aktiver Größengrenze ausgelassen.
|
||||||
- Für Deep Sky die visuelle Helligkeit `v_mag` verwenden. Andere Filterbänder nicht stillschweigend als V-Helligkeit einsetzen. `cstar_v_mag` ist die Helligkeit des Zentralsterns, nicht des gesamten Nebels.
|
- Für Deep Sky die visuelle Helligkeit `v_mag` verwenden. Andere Filterbänder nicht stillschweigend als V-Helligkeit einsetzen. `cstar_v_mag` ist die Helligkeit des Zentralsterns, nicht des gesamten Nebels.
|
||||||
- Vorgabe: 12 mag oder heller, also numerisch `v_mag <= 12`.
|
- Vorgabe: 12 mag oder heller, also numerisch `v_mag <= 12`.
|
||||||
|
|||||||
@@ -53,6 +53,11 @@ try {
|
|||||||
if (!is_string($value) || strlen($value) > 32) {
|
if (!is_string($value) || strlen($value) > 32) {
|
||||||
observationReply(['ok' => false, 'error' => 'Ungültige Filterangabe.'], 422);
|
observationReply(['ok' => false, 'error' => 'Ungültige Filterangabe.'], 422);
|
||||||
}
|
}
|
||||||
|
if (in_array($key, ['object_size_min', 'object_size_max'], true) && $value !== '') {
|
||||||
|
if (is_numeric($value)) {
|
||||||
|
$value = (string) ((float) $value * 60);
|
||||||
|
}
|
||||||
|
}
|
||||||
$filters[$key] = $value;
|
$filters[$key] = $value;
|
||||||
}
|
}
|
||||||
foreach (['object_types' => ['moon', 'planets', 'open_clusters', 'globular_clusters', 'galaxies', 'nebulae',
|
foreach (['object_types' => ['moon', 'planets', 'open_clusters', 'globular_clusters', 'galaxies', 'nebulae',
|
||||||
|
|||||||
@@ -46,6 +46,15 @@ $_SESSION['observation_csrf'] ??= bin2hex(random_bytes(32));
|
|||||||
.observation-results-table td { vertical-align: top; }
|
.observation-results-table td { vertical-align: top; }
|
||||||
.observation-results-table small { display: block; color: var(--text-dim); max-width: 22rem; }
|
.observation-results-table small { display: block; color: var(--text-dim); max-width: 22rem; }
|
||||||
.observation-results-table td:nth-child(n+3) { white-space: nowrap; }
|
.observation-results-table td:nth-child(n+3) { white-space: nowrap; }
|
||||||
|
.observation-object-image { display: block; width: 4rem; height: 4rem; object-fit: cover; border-radius: .3rem; }
|
||||||
|
.observation-image-dialog { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: min(92vw, 900px); max-width: none; max-height: 92vh; margin: 0; padding: 0; border: 1px solid rgba(226,193,93,.55); border-radius: var(--radius); background: linear-gradient(145deg, rgba(34,40,68,.99), rgba(7,10,25,.99) 55%, rgba(24,20,42,.99)); color: var(--text); box-shadow: 0 2px 0 rgba(255,255,255,.12) inset, 0 0 0 1px rgba(0,0,0,.7), 0 18px 0 -10px rgba(200,168,75,.16), 0 34px 0 -18px rgba(200,168,75,.1), 0 35px 95px rgba(0,0,0,.85); animation: observation-dialog-in .22s ease-out; }
|
||||||
|
.observation-image-dialog::backdrop { background: rgba(0,0,8,.86); backdrop-filter: blur(5px); }
|
||||||
|
.observation-image-dialog-content { position: relative; padding: 3.2rem 1rem 1rem; transform-style: preserve-3d; }
|
||||||
|
.observation-image-dialog-title { position: absolute; top: 1rem; left: 1rem; margin: 0; color: var(--gold); font-size: 1rem; }
|
||||||
|
.observation-image-dialog-close { position: absolute; top: .55rem; right: .7rem; border: 0; background: transparent; color: var(--text-dim); font-size: 1.8rem; line-height: 1; cursor: pointer; }
|
||||||
|
.observation-image-dialog-close:hover { color: var(--gold); }
|
||||||
|
.observation-image-dialog-image { display: block; max-width: 100%; max-height: 82vh; margin: 0 auto; object-fit: contain; border: 1px solid rgba(226,193,93,.3); border-radius: .35rem; box-shadow: 0 12px 25px rgba(0,0,0,.58), 0 2px 0 rgba(255,255,255,.1) inset; transform: translateZ(12px); }
|
||||||
|
@keyframes observation-dialog-in { from { opacity: 0; transform: translate(-50%, -50%) scale(.92) rotateX(4deg); } to { opacity: 1; transform: translate(-50%, -50%) scale(1) rotateX(0); } }
|
||||||
.observation-sort { border: 0; background: transparent; color: inherit; font: inherit; text-transform: inherit; letter-spacing: inherit; text-align: left; cursor: pointer; padding: 0.35rem 0; }
|
.observation-sort { border: 0; background: transparent; color: inherit; font: inherit; text-transform: inherit; letter-spacing: inherit; text-align: left; cursor: pointer; padding: 0.35rem 0; }
|
||||||
.observation-sort:hover { color: var(--gold); }
|
.observation-sort:hover { color: var(--gold); }
|
||||||
.observation-sort:focus-visible { outline: 2px solid var(--gold); outline-offset: 3px; }
|
.observation-sort:focus-visible { outline: 2px solid var(--gold); outline-offset: 3px; }
|
||||||
@@ -91,18 +100,18 @@ $_SESSION['observation_csrf'] ??= bin2hex(random_bytes(32));
|
|||||||
<section class="card" aria-labelledby="observation-object-title">
|
<section class="card" aria-labelledby="observation-object-title">
|
||||||
<h2 id="observation-object-title">Eigenschaften der Objekte</h2>
|
<h2 id="observation-object-title">Eigenschaften der Objekte</h2>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Scheinbare Größe – nur Deep Sky (Bogensekunden)</legend>
|
<legend>Scheinbare Größe – nur Deep Sky (Bogenminuten)</legend>
|
||||||
<div class="observation-fields">
|
<div class="observation-fields">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="object-size-min">Minimum (″)</label>
|
<label for="object-size-min">Minimum (′)</label>
|
||||||
<input type="number" id="object-size-min" name="object_size_min" min="0" step="any" placeholder="Keine Untergrenze" aria-describedby="object-size-help">
|
<input type="number" id="object-size-min" name="object_size_min" min="0" max="60" step="any" placeholder="Keine Untergrenze" aria-describedby="object-size-help">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="object-size-max">Maximum (″)</label>
|
<label for="object-size-max">Maximum (′)</label>
|
||||||
<input type="number" id="object-size-max" name="object_size_max" min="0" step="any" value="500" placeholder="Keine Obergrenze" aria-describedby="object-size-help">
|
<input type="number" id="object-size-max" name="object_size_max" min="0" max="60" step="any" value="60" placeholder="Keine Obergrenze" aria-describedby="object-size-help">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p class="observation-help" id="object-size-help">Dieser Filter gilt nur für Galaxien, Sternhaufen und Nebel einschließlich planetarischer Nebel. Verglichen wird die größte Katalogausdehnung. Bei gesetzter Größengrenze werden Deep-Sky-Objekte ohne Größenangabe ausgelassen. 60″ = 1′.</p>
|
<p class="observation-help" id="object-size-help">Dieser Filter gilt nur für Galaxien, Sternhaufen und Nebel einschließlich planetarischer Nebel. Verglichen wird die größte Katalogausdehnung. Bei gesetzter Größengrenze werden Deep-Sky-Objekte ohne Größenangabe ausgelassen. Maximal 60′.</p>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Helligkeit</legend>
|
<legend>Helligkeit</legend>
|
||||||
@@ -206,6 +215,7 @@ $_SESSION['observation_csrf'] ??= bin2hex(random_bytes(32));
|
|||||||
<table class="data-table observation-results-table">
|
<table class="data-table observation-results-table">
|
||||||
<caption>Klick auf eine Überschrift setzt das Hauptkriterium. Umschalt + Klick ergänzt weitere Kriterien; erneuter Klick kehrt die Richtung um. Das nächste Kriterium entscheidet bei gleichen Werten. Fehlende Werte folgen innerhalb der jeweiligen Sortiergruppe am Ende.</caption>
|
<caption>Klick auf eine Überschrift setzt das Hauptkriterium. Umschalt + Klick ergänzt weitere Kriterien; erneuter Klick kehrt die Richtung um. Das nächste Kriterium entscheidet bei gleichen Werten. Fehlende Werte folgen innerhalb der jeweiligen Sortiergruppe am Ende.</caption>
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
|
<th scope="col">Bild</th>
|
||||||
<th scope="col"><button type="button" class="observation-sort" data-sort="name">Objekt<span class="observation-sort-indicator" aria-hidden="true">↕</span></button></th>
|
<th scope="col"><button type="button" class="observation-sort" data-sort="name">Objekt<span class="observation-sort-indicator" aria-hidden="true">↕</span></button></th>
|
||||||
<th scope="col"><button type="button" class="observation-sort" data-sort="type">Typ<span class="observation-sort-indicator" aria-hidden="true">↕</span></button></th>
|
<th scope="col"><button type="button" class="observation-sort" data-sort="type">Typ<span class="observation-sort-indicator" aria-hidden="true">↕</span></button></th>
|
||||||
<th scope="col"><button type="button" class="observation-sort" data-sort="magnitude">Helligkeit<span class="observation-sort-indicator" aria-hidden="true">↕</span></button></th>
|
<th scope="col"><button type="button" class="observation-sort" data-sort="magnitude">Helligkeit<span class="observation-sort-indicator" aria-hidden="true">↕</span></button></th>
|
||||||
@@ -228,6 +238,13 @@ $_SESSION['observation_csrf'] ??= bin2hex(random_bytes(32));
|
|||||||
</section>
|
</section>
|
||||||
</form>
|
</form>
|
||||||
<form id="observation-display-options"></form>
|
<form id="observation-display-options"></form>
|
||||||
|
<dialog class="observation-image-dialog" id="observation-image-dialog" aria-labelledby="observation-image-dialog-title">
|
||||||
|
<div class="observation-image-dialog-content">
|
||||||
|
<button type="button" class="observation-image-dialog-close" id="observation-image-dialog-close" aria-label="Bildfenster schließen">×</button>
|
||||||
|
<h2 class="observation-image-dialog-title" id="observation-image-dialog-title"></h2>
|
||||||
|
<img class="observation-image-dialog-image" id="observation-image-dialog-image" alt="">
|
||||||
|
</div>
|
||||||
|
</dialog>
|
||||||
<script src="js/observation_suggestions.js" defer></script>
|
<script src="js/observation_suggestions.js" defer></script>
|
||||||
|
|
||||||
<?php require __DIR__ . '/footer.php'; ?>
|
<?php require __DIR__ . '/footer.php'; ?>
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
const tbody = document.getElementById('observation-rows');
|
const tbody = document.getElementById('observation-rows');
|
||||||
const previous = document.getElementById('observation-previous');
|
const previous = document.getElementById('observation-previous');
|
||||||
const next = document.getElementById('observation-next');
|
const next = document.getElementById('observation-next');
|
||||||
|
const imageDialog = document.getElementById('observation-image-dialog');
|
||||||
|
const imageDialogImage = document.getElementById('observation-image-dialog-image');
|
||||||
|
const imageDialogTitle = document.getElementById('observation-image-dialog-title');
|
||||||
|
const imageDialogClose = document.getElementById('observation-image-dialog-close');
|
||||||
const pageSize = 50;
|
const pageSize = 50;
|
||||||
let data = null;
|
let data = null;
|
||||||
let displayedRows = [];
|
let displayedRows = [];
|
||||||
@@ -117,16 +121,66 @@
|
|||||||
}
|
}
|
||||||
row.append(td);
|
row.append(td);
|
||||||
}
|
}
|
||||||
|
function closeImageDialog() {
|
||||||
|
if (imageDialog?.open) imageDialog.close();
|
||||||
|
}
|
||||||
|
function openImageDialog(url, title) {
|
||||||
|
if (!imageDialog || !imageDialogImage || !imageDialogTitle || typeof imageDialog.showModal !== 'function') {
|
||||||
|
window.open(url, '_blank', 'noopener');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
imageDialogTitle.textContent = title;
|
||||||
|
imageDialogImage.src = url;
|
||||||
|
imageDialogImage.alt = `Bild von ${title}`;
|
||||||
|
imageDialog.showModal();
|
||||||
|
imageDialogClose?.focus();
|
||||||
|
}
|
||||||
|
imageDialogClose?.addEventListener('click', closeImageDialog);
|
||||||
|
imageDialog?.addEventListener('click', event => {
|
||||||
|
if (event.target === imageDialog) closeImageDialog();
|
||||||
|
});
|
||||||
function render() {
|
function render() {
|
||||||
tbody.replaceChildren();
|
tbody.replaceChildren();
|
||||||
const fragment = document.createDocumentFragment();
|
const fragment = document.createDocumentFragment();
|
||||||
for (const item of displayedRows.slice(page * pageSize, (page + 1) * pageSize)) {
|
for (const item of displayedRows.slice(page * pageSize, (page + 1) * pageSize)) {
|
||||||
const row = document.createElement('tr');
|
const row = document.createElement('tr');
|
||||||
row.dataset.objectId = item.id;
|
row.dataset.objectId = item.id;
|
||||||
cell(row, item.name, item.note);
|
const imageCell = document.createElement('td');
|
||||||
|
if (item.image) {
|
||||||
|
const link = document.createElement('a');
|
||||||
|
link.href = item.image;
|
||||||
|
link.title = `Bild von ${item.name} vergrößern`;
|
||||||
|
link.addEventListener('click', event => {
|
||||||
|
event.preventDefault();
|
||||||
|
openImageDialog(item.image, item.name);
|
||||||
|
});
|
||||||
|
const image = document.createElement('img');
|
||||||
|
image.src = item.image;
|
||||||
|
image.alt = `Bild von ${item.name}`;
|
||||||
|
image.loading = 'lazy';
|
||||||
|
image.className = 'observation-object-image';
|
||||||
|
link.append(image);
|
||||||
|
imageCell.append(link);
|
||||||
|
} else {
|
||||||
|
imageCell.textContent = '—';
|
||||||
|
}
|
||||||
|
row.append(imageCell);
|
||||||
|
const nameCell = document.createElement('td');
|
||||||
|
nameCell.textContent = item.name;
|
||||||
|
if (item.common_name) {
|
||||||
|
const commonName = document.createElement('small');
|
||||||
|
commonName.textContent = item.common_name;
|
||||||
|
nameCell.append(commonName);
|
||||||
|
}
|
||||||
|
if (item.note) {
|
||||||
|
const note = document.createElement('small');
|
||||||
|
note.textContent = item.note;
|
||||||
|
nameCell.append(note);
|
||||||
|
}
|
||||||
|
row.append(nameCell);
|
||||||
cell(row, item.type);
|
cell(row, item.type);
|
||||||
cell(row, item.best.magnitude === null ? 'Helligkeit unbekannt' : `${number(item.best.magnitude)} mag`, item.magnitude_note);
|
cell(row, item.best.magnitude === null ? 'Helligkeit unbekannt' : `${number(item.best.magnitude)} mag`, item.magnitude_note);
|
||||||
cell(row, item.size_arcsec === null ? '—' : `${number(item.size_arcsec)}″`);
|
cell(row, item.size_arcsec === null ? '—' : `${number(item.size_arcsec / 60, 2)}′`);
|
||||||
const windows = document.createElement('td');
|
const windows = document.createElement('td');
|
||||||
for (const interval of item.intervals) {
|
for (const interval of item.intervals) {
|
||||||
const line = document.createElement('div');
|
const line = document.createElement('div');
|
||||||
|
|||||||
@@ -2,6 +2,26 @@
|
|||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
/** Catalog values are server-owned; the client only supplies selection filters. */
|
/** Catalog values are server-owned; the client only supplies selection filters. */
|
||||||
|
function observationDsoImage(array $row): ?string
|
||||||
|
{
|
||||||
|
$catalogs = [
|
||||||
|
['messier', 'messier', 'm'],
|
||||||
|
['ngc', 'ngc', 'ngc'],
|
||||||
|
['ic', 'ic', 'ic'],
|
||||||
|
];
|
||||||
|
foreach ($catalogs as [$field, $folder, $prefix]) {
|
||||||
|
$number = preg_replace('/\D+/', '', trim((string) ($row[$field] ?? '')));
|
||||||
|
if ($number === '' || !ctype_digit($number)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$relative = 'images/dso/' . $folder . '/' . $prefix . $number . '.png';
|
||||||
|
if (is_file(__DIR__ . '/' . $relative)) {
|
||||||
|
return $relative;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
function observationCatalog(PDO $pdo, array $types): array
|
function observationCatalog(PDO $pdo, array $types): array
|
||||||
{
|
{
|
||||||
$mapping = [
|
$mapping = [
|
||||||
@@ -21,16 +41,30 @@ function observationCatalog(PDO $pdo, array $types): array
|
|||||||
$objects = [];
|
$objects = [];
|
||||||
if ($codes !== []) {
|
if ($codes !== []) {
|
||||||
$placeholders = implode(',', array_fill(0, count($codes), '?'));
|
$placeholders = implode(',', array_fill(0, count($codes), '?'));
|
||||||
$stmt = $pdo->prepare("SELECT id, name, messier, object_type_abrev, ra_deg, dec_deg, major_axis, v_mag
|
$stmt = $pdo->prepare("SELECT id, name, messier, ngc, ic, common_names_german, common_names, object_type_abrev, ra_deg, dec_deg, major_axis, v_mag
|
||||||
FROM dso_objects WHERE object_type_abrev IN ($placeholders)
|
FROM dso_objects WHERE object_type_abrev IN ($placeholders)
|
||||||
AND ra_deg IS NOT NULL AND dec_deg IS NOT NULL");
|
AND ra_deg IS NOT NULL AND dec_deg IS NOT NULL");
|
||||||
$stmt->execute(array_keys($codes));
|
$stmt->execute(array_keys($codes));
|
||||||
foreach ($stmt as $row) {
|
foreach ($stmt as $row) {
|
||||||
$messier = trim((string) ($row['messier'] ?? ''));
|
$messier = trim((string) ($row['messier'] ?? ''));
|
||||||
|
$messierLabel = preg_replace('/^M\s*/i', 'M', $messier);
|
||||||
|
if ($messierLabel !== '' && !preg_match('/^M/i', $messierLabel)) {
|
||||||
|
$messierLabel = 'M' . $messierLabel;
|
||||||
|
}
|
||||||
|
$commonName = trim((string) ($row['common_names_german'] ?? ''));
|
||||||
|
if ($commonName === '') {
|
||||||
|
$commonName = trim((string) ($row['common_names'] ?? ''));
|
||||||
|
}
|
||||||
|
$displayName = $row['name'];
|
||||||
|
if ($messierLabel !== '') {
|
||||||
|
$displayName .= ' / ' . $messierLabel;
|
||||||
|
}
|
||||||
$objects[] = [
|
$objects[] = [
|
||||||
'id' => 'dso-' . $row['id'],
|
'id' => 'dso-' . $row['id'],
|
||||||
'name' => $row['name'] . ($messier !== '' ? ' · M ' . $messier : ''),
|
'name' => $displayName,
|
||||||
|
'common_name' => $commonName,
|
||||||
'group' => $codes[$row['object_type_abrev']],
|
'group' => $codes[$row['object_type_abrev']],
|
||||||
|
'image' => observationDsoImage($row),
|
||||||
'ra_deg' => (float) $row['ra_deg'], 'dec_deg' => (float) $row['dec_deg'],
|
'ra_deg' => (float) $row['ra_deg'], 'dec_deg' => (float) $row['dec_deg'],
|
||||||
// OpenNGC MajAx is in arcminutes; GUI and Python use arcseconds.
|
// OpenNGC MajAx is in arcminutes; GUI and Python use arcseconds.
|
||||||
'size_arcsec' => $row['major_axis'] !== null && (float) $row['major_axis'] > 0
|
'size_arcsec' => $row['major_axis'] !== null && (float) $row['major_axis'] > 0
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ def validate(payload):
|
|||||||
raw = payload['filters']
|
raw = payload['filters']
|
||||||
result = {}
|
result = {}
|
||||||
for key, low, high, optional in (
|
for key, low, high, optional in (
|
||||||
('object_size_min', 0, 1296000, True), ('object_size_max', 0, 1296000, True),
|
('object_size_min', 0, 3600, True), ('object_size_max', 0, 3600, True),
|
||||||
('object_magnitude', -40, 40, True), ('object_altitude_min', 0, 90, False),
|
('object_magnitude', -40, 40, True), ('object_altitude_min', 0, 90, False),
|
||||||
('object_altitude_max', 0, 90, False), ('object_azimuth_start', 0, 360, False),
|
('object_altitude_max', 0, 90, False), ('object_azimuth_start', 0, 360, False),
|
||||||
('object_azimuth_end', 0, 360, False), ('sun_altitude_max', -90, 0, False),
|
('object_azimuth_end', 0, 360, False), ('sun_altitude_max', -90, 0, False),
|
||||||
@@ -269,6 +269,8 @@ def calculate(payload):
|
|||||||
if best:
|
if best:
|
||||||
results.append({'id': obj['id'], 'name': obj['name'], 'group': group, 'type': LABELS[group],
|
results.append({'id': obj['id'], 'name': obj['name'], 'group': group, 'type': LABELS[group],
|
||||||
'size_arcsec': obj.get('size_arcsec'), 'best': best, 'intervals': intervals,
|
'size_arcsec': obj.get('size_arcsec'), 'best': best, 'intervals': intervals,
|
||||||
|
'image': obj.get('image'),
|
||||||
|
'common_name': obj.get('common_name'),
|
||||||
'magnitude_note': 'Modellschätzung' if moving else 'Katalogwert',
|
'magnitude_note': 'Modellschätzung' if moving else 'Katalogwert',
|
||||||
'note': obj.get('note', '')})
|
'note': obj.get('note', '')})
|
||||||
except (ValueError, TypeError, ZeroDivisionError, OverflowError):
|
except (ValueError, TypeError, ZeroDivisionError, OverflowError):
|
||||||
|
|||||||
Reference in New Issue
Block a user