Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,11 @@ I've decided to open source it as I think it could be useful to other astrophoto
</tr>
<tr>
<td align="center"><img src="screenshots/screenshot_sky5.png" alt="Sky Dashboard" /><br/><sub>Sky Dashboard (Telescopius integration: best objects, searching & lists)</sub></td>
<td align="center"><img src="screenshots/screenshot_sky6.png" alt="Sky Dashboard" /><br/><sub>Sky Dashboard (eq/az and overlays view options)</sub></td>
<td align="center"><img src="screenshots/screenshot_sky6.png" alt="Sky Dashboard" /><br/><sub>Sky Dashboard (EQ/AZ mounts and overlays view options)</sub></td>
</tr>
<tr>
<td align="center"><img src="screenshots/screenshot_sky7.png" alt="Sky Dashboard" /><br/><sub>Sky Dashboard (All the supported DSO catalogues)</sub></td>
<td align="center"><img src="screenshots/screenshot_sky8.png" alt="Sky Dashboard" /><br/><sub>Sky Dashboard (Natural visual colours survey)</sub></td>
</tr>
</table>

Expand Down Expand Up @@ -463,7 +467,7 @@ APD requires a few third-party accounts and some technical setup. If you need he
- **Weather Dashboard**: React 18 + TypeScript + Tailwind CSS (Vite build)
- **Sky Dashboard**: Self-contained HTML page with Aladin Lite v3.6.5 sky viewer, jQuery 3.7.1 (Aladin dependency)
- **Icons**: Lucide React
- **Celestial data**: Star, constellation, and DSO data from [d3-celestial](https://github.com/ofrohn/d3-celestial) (bundled locally in `public/data/celestial/`)
- **Celestial data**: Star, constellation, and DSO data from [d3-celestial](https://github.com/ofrohn/d3-celestial) plus additional catalogs (SH2, LBN, vdB, HCG, Abell PNe) from [VizieR/CDS](https://vizier.cds.unistra.fr/) (bundled locally in `public/data/celestial/`)
- **Astronomy calculations**: Simplified VSOP87/Meeus for planet positions, moon position and phase — approximate, optimised for visual display rather than astrometric precision
- **Sky Dashboard persistence**: UI settings (panel state, sliders, toggles) stored in `localStorage` (`astro-sky-dashboard-v1`); FOVs and favorites stored in Redis via the API

Expand Down Expand Up @@ -763,7 +767,7 @@ apd/
│ ├── settings.html # Settings page (location, API keys, system status)
│ ├── theme.css # Shared CSS theme (accent colour tokens)
│ ├── logo.png # App logo / favicon
│ └── data/celestial/ # Star, constellation & DSO data (from d3-celestial)
│ └── data/celestial/ # Star, constellation & DSO data (d3-celestial + VizieR catalogs)
├── screenshots/ # README screenshots
├── .github/
│ ├── workflows/
Expand Down Expand Up @@ -812,6 +816,7 @@ APD includes or links to the following third-party components, each under its ow
|-----------|---------|-------|
| [Aladin Lite v3](https://github.com/cds-astro/aladin-lite) | GPL-3.0 | Loaded from CDS servers; compatible with AGPL-3.0 per §13 of both licenses |
| [d3-celestial](https://github.com/ofrohn/d3-celestial) data files | BSD-3-Clause | Star, constellation, and DSO catalog data bundled in `public/data/celestial/` |
| VizieR/CDS extra catalogs | Public astronomical data | SH2 (Sharpless 1959), LBN (Lynds 1965), B (Barnard 1927), LDN (Lynds 1962), vdB (van den Bergh 1966), HCG (Hickson 1993), Abell PNe (Acker+ 1992) — sourced from [VizieR, CDS Strasbourg](https://vizier.cds.unistra.fr/) and bundled in `public/data/celestial/catalogs_extra.json` |
| [Lucide](https://lucide.dev/) icons | ISC | Icon library used in the React frontend |
| [Google Fonts — Inter](https://fonts.google.com/specimen/Inter) | SIL Open Font License 1.1 | Loaded from Google Fonts CDN |
| SDO/HMI solar imagery | Public domain | Hotlinked from [Stanford JSOC](https://jsoc1.stanford.edu); NASA/SDO data is in the public domain |
Expand Down
1 change: 1 addition & 0 deletions public/data/celestial/catalogs_extra.json

Large diffs are not rendered by default.

59 changes: 55 additions & 4 deletions public/skychart.html
Original file line number Diff line number Diff line change
Expand Up @@ -760,6 +760,11 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
<label><input type="checkbox" id="chk-dso-ngc"> NGC</label>
<label><input type="checkbox" id="chk-dso-ic" checked> IC</label>
<label><input type="checkbox" id="chk-dso-ldn" checked> LDN/B</label>
<label><input type="checkbox" id="chk-dso-sh2"> SH2</label>
<label><input type="checkbox" id="chk-dso-lbn"> LBN</label>
<label><input type="checkbox" id="chk-dso-vdb"> vdB</label>
<label><input type="checkbox" id="chk-dso-hcg"> HCG</label>
<label><input type="checkbox" id="chk-dso-abell"> Abell PNe</label>
</div>
</div>
<div class="control-group">
Expand All @@ -782,6 +787,7 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
</div>
<div style="font-size: 0.9rem;">
<label class="overlay-row"><input type="checkbox" id="chk-dso-nullmag"> Unknown magnitude</label>
<div style="font-size:0.7rem;color:#666;margin-top:2px;padding-left:22px;">For NGC/IC objects missing mag data.<br>Abell, HCG, LBN, SH2 always bypass this filter.</div>
</div>
</div>
</div>
Expand Down Expand Up @@ -1043,6 +1049,9 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
planetary: ['pn']
};

// Catalogs that inherently lack visual magnitude data — bypass the mag filter
const NO_MAG_CATALOGS = new Set(['abell', 'hcg', 'lbn', 'sh2']);

function dsoTypeClass(type) {
if (['g','e','s','s0','sd','i','gg'].includes(type)) return 'dso-gx';
if (['bn','en','rn','sfr','snr'].includes(type)) return 'dso-nb';
Expand All @@ -1060,6 +1069,11 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
if (/\bNGC\s?\d/i.test(text)) cats.push('ngc');
if (/\bIC\s?\d/i.test(text)) cats.push('ic');
if (/\bLDN\s?\d/i.test(text) || /\bB\s\d/i.test(text)) cats.push('ldn');
if (/\bSH2-/i.test(text)) cats.push('sh2');
if (/\bLBN\s?\d/i.test(text)) cats.push('lbn');
if (/\bvdB\s?\d/i.test(text)) cats.push('vdb');
if (/\bHCG\s?\d/i.test(text)) cats.push('hcg');
if (/\bAbell\s?\d/i.test(text)) cats.push('abell');
return cats;
}

Expand All @@ -1071,6 +1085,16 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
if (ngc) return ngc[1];
let ic = d.match(/\b(IC\s?\d+)\b/i);
if (ic) return ic[1];
let sh2 = d.match(/\b(SH2-\d+)\b/i);
if (sh2) return sh2[1];
let lbn = d.match(/\b(LBN\s?\d+)\b/i);
if (lbn) return lbn[1];
let vdb = d.match(/\b(vdB\s?\d+)\b/i);
if (vdb) return vdb[1];
let hcg = d.match(/\b(HCG\s?\d+)\b/i);
if (hcg) return hcg[1];
let abell = d.match(/\b(Abell\s?\d+)\b/i);
if (abell) return abell[1];
let ldn = d.match(/\b(LDN\s?\d+)\b/i);
if (ldn) return ldn[1];
let barn = d.match(/\b(B\s\d+)\b/i);
Expand Down Expand Up @@ -1321,6 +1345,11 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
chkDsoNGC: document.getElementById('chk-dso-ngc').checked,
chkDsoIC: document.getElementById('chk-dso-ic').checked,
chkDsoLDN: document.getElementById('chk-dso-ldn').checked,
chkDsoSH2: document.getElementById('chk-dso-sh2').checked,
chkDsoLBN: document.getElementById('chk-dso-lbn').checked,
chkDsoVdB: document.getElementById('chk-dso-vdb').checked,
chkDsoHCG: document.getElementById('chk-dso-hcg').checked,
chkDsoAbell: document.getElementById('chk-dso-abell').checked,
chkDsoGalaxies: document.getElementById('chk-dso-galaxies').checked,
chkDsoNebulae: document.getElementById('chk-dso-nebulae').checked,
chkDsoDark: document.getElementById('chk-dso-dark').checked,
Expand Down Expand Up @@ -1392,6 +1421,11 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
if (s.chkDsoNGC != null) document.getElementById('chk-dso-ngc').checked = s.chkDsoNGC;
if (s.chkDsoIC != null) document.getElementById('chk-dso-ic').checked = s.chkDsoIC;
if (s.chkDsoLDN != null) document.getElementById('chk-dso-ldn').checked = s.chkDsoLDN;
if (s.chkDsoSH2 != null) document.getElementById('chk-dso-sh2').checked = s.chkDsoSH2;
if (s.chkDsoLBN != null) document.getElementById('chk-dso-lbn').checked = s.chkDsoLBN;
if (s.chkDsoVdB != null) document.getElementById('chk-dso-vdb').checked = s.chkDsoVdB;
if (s.chkDsoHCG != null) document.getElementById('chk-dso-hcg').checked = s.chkDsoHCG;
if (s.chkDsoAbell != null) document.getElementById('chk-dso-abell').checked = s.chkDsoAbell;
if (s.chkDsoGalaxies != null) document.getElementById('chk-dso-galaxies').checked = s.chkDsoGalaxies;
if (s.chkDsoNebulae != null) document.getElementById('chk-dso-nebulae').checked = s.chkDsoNebulae;
if (s.chkDsoDark != null) document.getElementById('chk-dso-dark').checked = s.chkDsoDark;
Expand Down Expand Up @@ -1773,12 +1807,13 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-

try {
const BASE = '/data/celestial/';
const [starsResp, starNamesResp, linesResp, constNamesResp, dsosResp] = await Promise.all([
const [starsResp, starNamesResp, linesResp, constNamesResp, dsosResp, extraResp] = await Promise.all([
fetch(BASE + 'stars.14.json'),
fetch(BASE + 'starnames.json'),
fetch(BASE + 'constellations.lines.json'),
fetch(BASE + 'constellations.json'),
fetch(BASE + 'dsos.14.json')
fetch(BASE + 'dsos.14.json'),
fetch(BASE + 'catalogs_extra.json')
]);
if (!starsResp.ok || !starNamesResp.ok || !linesResp.ok || !constNamesResp.ok)
throw new Error('HTTP fetch failed');
Expand All @@ -1788,6 +1823,11 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
const linesGeo = await linesResp.json();
const constNamesGeo = await constNamesResp.json();
const dsosGeo = dsosResp.ok ? await dsosResp.json() : { features: [] };
const extraGeo = extraResp.ok ? await extraResp.json() : { features: [] };
// Merge extra catalogs into DSO data
if (extraGeo.features && extraGeo.features.length > 0) {
dsosGeo.features = dsosGeo.features.concat(extraGeo.features);
}

function lon2ra(lon) { return lon < 0 ? lon + 360 : lon; }

Expand Down Expand Up @@ -2447,6 +2487,11 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
let catNGC = document.getElementById('chk-dso-ngc').checked;
let catIC = document.getElementById('chk-dso-ic').checked;
let catLDN = document.getElementById('chk-dso-ldn').checked;
let catSH2 = document.getElementById('chk-dso-sh2').checked;
let catLBN = document.getElementById('chk-dso-lbn').checked;
let catVdB = document.getElementById('chk-dso-vdb').checked;
let catHCG = document.getElementById('chk-dso-hcg').checked;
let catAbell = document.getElementById('chk-dso-abell').checked;
let typeGx = document.getElementById('chk-dso-galaxies').checked;
let typeNb = document.getElementById('chk-dso-nebulae').checked;
let typeDn = document.getElementById('chk-dso-dark').checked;
Expand All @@ -2460,9 +2505,15 @@ <h2 style="width:100%;text-align:center;display:flex;align-items:center;justify-
let catOk = (catM && lbl.catalogs.includes('m')) ||
(catNGC && lbl.catalogs.includes('ngc')) ||
(catIC && lbl.catalogs.includes('ic')) ||
(catLDN && lbl.catalogs.includes('ldn'));
(catLDN && lbl.catalogs.includes('ldn')) ||
(catSH2 && lbl.catalogs.includes('sh2')) ||
(catLBN && lbl.catalogs.includes('lbn')) ||
(catVdB && lbl.catalogs.includes('vdb')) ||
(catHCG && lbl.catalogs.includes('hcg')) ||
(catAbell && lbl.catalogs.includes('abell'));
let typeOk = lbl.typeGroup && typeMap[lbl.typeGroup];
let magOk = lbl.mag === null ? showNullMag : lbl.mag <= dsoMagLim;
let inNoMagCat = lbl.catalogs.some(c => NO_MAG_CATALOGS.has(c));
let magOk = inNoMagCat || (lbl.mag === null ? showNullMag : lbl.mag <= dsoMagLim);
if (catOk && typeOk && magOk) {
positionLabel(lbl.el, lbl.ra, lbl.dec, size, 10, -4);
} else {
Expand Down
Binary file added screenshots/screenshot_sky7.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/screenshot_sky8.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading