Source code for SatelliteCameraViewer.constellation_database

""" Constellation Database """

# https://en.wikipedia.org/wiki/IAU_designated_constellations
# In contemporary astronomy, 88 constellations are recognized by the International Astronomical Union (IAU).

# The same list as https://www.iau.org/IAU/Iau/Science/What-we-do/The-Constellations.aspx
# We don't need all the columns; but, they are left there for completeness reasons
# Also see https://commons.wikimedia.org/wiki/File:Constellations,_equirectangular_plot.svg
# For a positioning check

# Wikipedia was scraped with approx' the following code
#
# import requests
# from bs4 import BeautifulSoup
# headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' }
# url = "https://en.wikipedia.org/wiki/IAU_designated_constellations"
# response = requests.get(url, headers=headers)
# response.raise_for_status()
# soup = BeautifulSoup(response.text, "html.parser")
# table = soup.find("div", {"id": "bodyContent"}).find_next("table")
# # Extract headers
# headers = [th.get_text(strip=True) for th in table.find_all("th")]
# print(headers)
# # Extract rows
# for row in table.find_all("tr")[1:]:
#     cols = [td.get_text(strip=True) for td in row.find_all("td")]
#     print(cols)

import re
from .StarCatalog.constellation import Constellation

[docs] class ConstellationDatabase: """ ConstellationDatabase """ _data = [ ['Constellation', 'IAU Abbr', 'NASA Abbr', 'Genitive', 'Origin', 'Meaning', 'Brightest star Name', 'Brightest star Vis. mag.'], ['Andromeda', 'And', 'Andr', 'Andromedae', 'ancient (Ptolemy)', 'Andromeda(mythological character)', 'Alpheratz', '2.06'], ['Antlia', 'Ant', 'Antl', 'Antliae', '1756,Lacaille, as Antlia Pneumatica', '(air) pump', 'α Antliae', '4.25'], ['Apus', 'Aps', 'Apus', 'Apodis', '1598,Plancius,Keyser,de Houtman', 'bird-of-paradise', 'α Apodis', '3.83'], ['Aquarius', 'Aqr', 'Aqar', 'Aquarii', 'ancient (Ptolemy)', 'water-bearer', 'Sadalsuud', '2.87'], ['Aquila', 'Aql', 'Aqil', 'Aquilae', 'ancient (Ptolemy)', 'eagle', 'Altair', '0.76'], ['Ara', 'Ara', 'Arae', 'Arae', 'ancient (Ptolemy)', 'altar', 'β Arae', '2.84'], ['Aries', 'Ari', 'Arie', 'Arietis', 'ancient (Ptolemy)', 'ram', 'Hamal', '2.00'], ['Auriga', 'Aur', 'Auri', 'Aurigae', 'ancient (Ptolemy)', 'charioteer', 'Capella', '0.08'], ['Boötes', 'Boo', 'Boot', 'Boötis', 'ancient (Ptolemy)', 'herdsman', 'Arcturus', '-0.05'], ['Caelum', 'Cae', 'Cael', 'Caeli', '1756,Lacaille, as Caelum Sculptorium', 'chiselor engraving tool', 'α Caeli', '4.46'], ['Camelopardalis', 'Cam', 'Caml', 'Camelopardalis', '1613,Plancius', 'giraffe', 'β Camelo\xadpardalis', '4.02'], ['Cancer', 'Cnc', 'Canc', 'Cancri', 'ancient (Ptolemy)', 'crab', 'β Cancri', '3.52'], ['Canes Venatici', 'CVn', 'CVen', 'Canum Venaticorum', '1690,Firmamentum Sobiescianum,Hevelius', 'hunting dogs', 'Cor Caroli', '2.81'], ['Canis Major', 'CMa', 'CMaj', 'Canis Majoris', 'ancient (Ptolemy)', 'greater dog', 'Sirius', '-1.46'], ['Canis Minor', 'CMi', 'CMin', 'Canis Minoris', 'ancient (Ptolemy)', 'lesser dog', 'Procyon', '0.34'], ['Capricornus', 'Cap', 'Capr', 'Capricorni', 'ancient (Ptolemy)', 'sea goat', 'Deneb Algedi', '2.83'], ['Carina', 'Car', 'Cari', 'Carinae', 'ancient (Ptolemy); 1756,Lacaille, split from Argo Navis', 'keel', 'Canopus', '-0.74'], ['Cassiopeia', 'Cas', 'Cass', 'Cassiopeiae', 'ancient (Ptolemy)', 'Cassiopeia(mythological character)', 'Schedar', '2.24'], ['Centaurus', 'Cen', 'Cent', 'Centauri', 'ancient (Ptolemy)', 'centaur', 'Alpha Centauri', '-0.27'], ['Cepheus', 'Cep', 'Ceph', 'Cephei', 'ancient (Ptolemy)', 'Cepheus(mythological character)', 'Alderamin', '2.46'], ['Cetus', 'Cet', 'Ceti', 'Ceti', 'ancient (Ptolemy)', 'sea monster(later interpreted as a whale)', 'Diphda', '2.02'], ['Chamaeleon', 'Cha', 'Cham', 'Chamaeleontis', '1598,Plancius,Keyser,de Houtman', 'chameleon', 'α Chamae\xadleontis', '4.06'], ['Circinus', 'Cir', 'Circ', 'Circini', '1756,Lacaille', 'compasses', 'α Circini', '3.19'], ['Columba', 'Col', 'Colm', 'Columbae', '1592,Plancius, split from Canis Major', 'dove', 'Phact', '2.65'], ['Coma Berenices', 'Com', 'Coma', 'Comae Berenices', 'ancient (Ptolemy); 1536,Caspar Vopel, split from Leo', "Berenice's hair", 'β Comae Berenices', '4.26'], ['Corona Australis', 'CrA', 'CorA', 'Coronae Australis', 'ancient (Ptolemy)', 'southerncrown', 'α Coronae Australis', '4.10'], ['Corona Borealis', 'CrB', 'CorB', 'Coronae Borealis', 'ancient (Ptolemy)', 'northern crown', 'Alphecca', '2.24'], ['Corvus', 'Crv', 'Corv', 'Corvi', 'ancient (Ptolemy)', 'crow', 'Gienah', '2.59'], ['Crater', 'Crt', 'Crat', 'Crateris', 'ancient (Ptolemy)', 'cup', 'δ Crateris', '3.56'], ['Crux', 'Cru', 'Cruc', 'Crucis', '1589,Plancius, split from Centaurus', 'southerncross', 'Acrux', '0.76'], ['Cygnus', 'Cyg', 'Cygn', 'Cygni', 'ancient (Ptolemy)', 'swanor Northern Cross', 'Deneb', '1.25'], ['Delphinus', 'Del', 'Dlph', 'Delphini', 'ancient (Ptolemy)', 'dolphin', 'β Delphini', '3.62'], ['Dorado', 'Dor', 'Dora', 'Doradus', '1598,Plancius,Keyser,de Houtman', 'mahi-mahi(dolphinfish)', 'α Doradus', '3.28'], ['Draco', 'Dra', 'Drac', 'Draconis', 'ancient (Ptolemy)', 'dragon', 'Eltanin', '2.23'], ['Equuleus', 'Equ', 'Equl', 'Equulei', 'ancient (Ptolemy)', 'pony', 'α Equulei', '3.92'], ['Eridanus', 'Eri', 'Erid', 'Eridani', 'ancient (Ptolemy)', 'river Eridanus(mythology)', 'Achernar', '0.46'], ['Fornax', 'For', 'Forn', 'Fornacis', '1756,Lacaille, as Fourneau Chymique', '(chemical)furnace', 'α Fornacis', '3.85'], ['Gemini', 'Gem', 'Gemi', 'Geminorum', 'ancient (Ptolemy)', 'twins', 'Pollux', '1.14'], ['Grus', 'Gru', 'Grus', 'Gruis', '1598,Plancius,Keyser,de Houtman', 'crane(bird)', 'Alnair', '1.74'], ['Hercules', 'Her', 'Herc', 'Herculis', 'ancient (Ptolemy)', 'Hercules(mythological character)', 'Korne\xadphoros', '2.81'], ['Horologium', 'Hor', 'Horo', 'Horologii', '1756,Lacaille', 'pendulum clock', 'α Horologii', '3.85'], ['Hydra', 'Hya', 'Hyda', 'Hydrae', 'ancient (Ptolemy)', 'Hydra(mythological creature)', 'Alphard', '2.00'], ['Hydrus', 'Hyi', 'Hydi', 'Hydri', '1598,Plancius,Keyser,de Houtman', 'lesserwater snake', 'β Hydri', '2.80'], ['Indus', 'Ind', 'Indi', 'Indi', '1598,Plancius,Keyser,de Houtman', 'Indian(of unspecified type)', 'α Indi', '3.11'], ['Lacerta', 'Lac', 'Lacr', 'Lacertae', '1690,Firmamentum Sobiescianum,Hevelius', 'lizard', 'α Lacertae', '3.76'], ['Leo Minor', 'LMi', 'LMin', 'Leonis Minoris', '1690,Firmamentum Sobiescianum,Hevelius', 'lesser lion', '46 Leonis Minoris', '3.83'], ['Leo', 'Leo', 'Leon', 'Leonis', 'ancient (Ptolemy)', 'lion', 'Regulus', '1.35'], ['Lepus', 'Lep', 'Leps', 'Leporis', 'ancient (Ptolemy)', 'hare', 'Arneb', '2.59'], ['Libra', 'Lib', 'Libr', 'Librae', 'ancient (Ptolemy)', 'balance', 'Zuben\xadeschemali', '2.61'], ['Lupus', 'Lup', 'Lupi', 'Lupi', 'ancient (Ptolemy)', 'wolf', 'α Lupi', '2.30'], ['Lynx', 'Lyn', 'Lync', 'Lyncis', '1690,Firmamentum Sobiescianum,Hevelius', 'lynx', 'α Lyncis', '3.14'], ['Lyra', 'Lyr', 'Lyra', 'Lyrae', 'ancient (Ptolemy)', 'lyre/harp', 'Vega', '0.02'], ['Mensa', 'Men', 'Mens', 'Mensae', '1756,Lacaille, as Mons Mensæ', 'Table Mountain(South Africa)', 'α Mensae', '5.09'], ['Microscopium', 'Mic', 'Micr', 'Microscopii', '1756,Lacaille', 'microscope', 'γ Microscopii', '4.68'], ['Monoceros', 'Mon', 'Mono', 'Monocerotis', '1613,Plancius', 'unicorn', 'β Monocerotis', '3.74'], ['Musca', 'Mus', 'Musc', 'Muscae', '1598,Plancius,Keyser,de Houtman', 'fly', 'α Muscae', '2.69'], ['Norma', 'Nor', 'Norm', 'Normae', '1756,Lacaille', "carpenter's level", 'γ2Normae', '4.02'], ['Octans', 'Oct', 'Octn', 'Octantis', '1756,Lacaille', 'octant (instrument)', 'ν Octantis', '3.73'], ['Ophiuchus', 'Oph', 'Ophi', 'Ophiuchi', 'ancient (Ptolemy)', 'serpent-bearer', 'Rasalhague', '2.07'], ['Orion', 'Ori', 'Orio', 'Orionis', 'ancient (Ptolemy)', 'Orion(mythological character)', 'Rigel', '0.13'], ['Pavo', 'Pav', 'Pavo', 'Pavonis', '1598,Plancius,Keyser,de Houtman', 'peacock', 'Peacock', '1.94'], ['Pegasus', 'Peg', 'Pegs', 'Pegasi', 'ancient (Ptolemy)', 'Pegasus(mythological winged horse)', 'Enif', '2.40'], ['Perseus', 'Per', 'Pers', 'Persei', 'ancient (Ptolemy)', 'Perseus(mythological character)', 'Mirfak', '1.82'], ['Phoenix', 'Phe', 'Phoe', 'Phoenicis', '1598,Plancius,Keyser,de Houtman', 'phoenix', 'Ankaa', '2.38'], ['Pictor', 'Pic', 'Pict', 'Pictoris', '1756,Lacaille, as Equuleus Pictoris', "Painter (originally 'painter's easel')", 'α Pictoris', '3.27'], ['Pisces', 'Psc', 'Pisc', 'Piscium', 'ancient (Ptolemy)', 'fish(plural)', 'Alpherg', '3.61'], ['Piscis Austrinus', 'PsA', 'PscA', 'Piscis Austrini', 'ancient (Ptolemy)', 'southern fish', 'Fomalhaut', '1.16'], ['Puppis', 'Pup', 'Pupp', 'Puppis', 'ancient (Ptolemy); 1756,Lacaille, split from Argo Navis', 'poop deck', 'Naos', '2.25'], ['Pyxis', 'Pyx', 'Pyxi', 'Pyxidis', '1756,Lacaille, as Pyxis Nautica', "mariner's compass", 'α Pyxidis', '3.67'], ['Reticulum', 'Ret', 'Reti', 'Reticuli', '1756,Lacaille', 'eyepiece graticule', 'α Reticuli', '3.32'], ['Sagitta', 'Sge', 'Sgte', 'Sagittae', 'ancient (Ptolemy)', 'arrow', 'γ Sagittae', '3.47'], ['Sagittarius', 'Sgr', 'Sgtr', 'Sagittarii', 'ancient (Ptolemy)', 'archer', 'Kaus Australis', '1.85'], ['Scorpius', 'Sco', 'Scor', 'Scorpii', 'ancient (Ptolemy)', 'scorpion', 'Antares', '0.91'], ['Sculptor', 'Scl', 'Scul', 'Sculptoris', '1756,Lacaille, as Apparatus Sculptoris', "sculptor(originally 'sculptor's studio')", 'α Sculptoris', '4.30'], ['Scutum', 'Sct', 'Scut', 'Scuti', '1690,Firmamentum Sobiescianum,Hevelius', 'shield (of Sobieski)', 'α Scuti', '3.83'], ['Serpens', 'Ser', 'Serp', 'Serpentis', 'ancient (Ptolemy)', 'snake', 'Unukalhai', '2.62'], ['Sextans', 'Sex', 'Sext', 'Sextantis', '1690,Firmamentum Sobiescianum,Hevelius', 'sextant', 'α Sextantis', '4.49'], ['Taurus', 'Tau', 'Taur', 'Tauri', 'ancient (Ptolemy)', 'bull', 'Aldebaran', '0.86'], ['Telescopium', 'Tel', 'Tele', 'Telescopii', '1756,Lacaille', 'telescope', 'α Telescopii', '3.51'], ['Triangulum Australe', 'TrA', 'TrAu', 'Trianguli Australis', '1598,Plancius,Keyser,de Houtman', 'southern triangle', 'Atria', '1.91'], ['Triangulum', 'Tri', 'Tria', 'Trianguli', 'ancient (Ptolemy)', 'triangle', 'β Trianguli', '3.00'], ['Tucana', 'Tuc', 'Tucn', 'Tucanae', '1598,Plancius,Keyser,de Houtman', 'toucan', 'α Tucanae', '2.86'], ['Ursa Major', 'UMa', 'UMaj', 'Ursae Majoris', 'ancient (Ptolemy)', 'great bear', 'Alioth', '1.77'], ['Ursa Minor', 'UMi', 'UMin', 'Ursae Minoris', 'ancient (Ptolemy)', 'lesser bear', 'Polaris', '1.98'], ['Vela', 'Vel', 'Velr', 'Velorum', 'ancient (Ptolemy); 1756,Lacaille, split from Argo Navis', 'sails', 'γ Velorum', '1.83'], ['Virgo', 'Vir', 'Virg', 'Virginis', 'ancient (Ptolemy)', 'virgin, maiden', 'Spica', '0.97'], ['Volans', 'Vol', 'Voln', 'Volantis', '1598,Plancius,Keyser,de Houtman, as Piscis Volans', 'flying fish', 'γ2Volantis', '3.75'], ['Vulpecula', 'Vul', 'Vulp', 'Vulpeculae', '1690,Firmamentum Sobiescianum,Hevelius, as Vulpecula cum Ansere', "littlefox(originally, 'little fox with the goose')", 'α Vulpeculae', '4.40'], ] _constellations = [] _index = {} def __init__(self): """ ConstellationDatabase """ @classmethod def _build(cls): """ _build """ if ConstellationDatabase._constellations and len(ConstellationDatabase._constellations) > 0: return ConstellationDatabase._constellations = [Constellation(*v) for v in ConstellationDatabase._data[1:]] ConstellationDatabase._index = {} for c in cls._constellations: for v in [c.constellation, c.iau_abbreviations, c.nasa_abbreviations, c.genitive, c.origin, c.meaning]: ConstellationDatabase._index[v.lower()] = c
[docs] @classmethod def find(cls, name: str): """ find """ cls._build() try: return cls._index[name.lower()] except: raise IndexError(name) from None
[docs] @classmethod def all(cls): """ all """ cls._build() return cls._constellations
[docs] @classmethod def match(cls, pattern) -> list : """ match """ cls._build() regex = re.compile(pattern, re.IGNORECASE) results = {} for keyword in set(filter(lambda v: regex.match(v), cls._index.keys())): results[cls.find(keyword)] = None return sorted(results.keys(), key=lambda v: v.constellation)
[docs] @classmethod def fullmatch(cls, pattern) -> list : """ fullmatch """ cls._build() regex = re.compile(pattern, re.IGNORECASE) results = {} for keyword in set(filter(lambda v: regex.fullmatch(v), cls._index.keys())): results[cls.find(keyword)] = None return sorted(results.keys(), key=lambda v: v.constellation)
[docs] @classmethod def search(cls, pattern) -> list : """ search """ cls._build() regex = re.compile(pattern, re.IGNORECASE) results = {} for keyword in set(filter(lambda v: regex.search(v), cls._index.keys())): results[cls.find(keyword)] = None return sorted(results.keys(), key=lambda v: v.constellation)
@classmethod def __len__(cls): """ __len__ """ cls._build() return len(cls._constellations)
def _main(args=None): """ _main """ cd = ConstellationDatabase() print('# Constellations =', len(cd)) for name in ['Orion', 'TRIANGULI AUSTRALIS', 'Sco', 'great bear', 'Norma']: print('%-20s= %s' % (name, str(cd.find(name))[0:150])) print('') for c in cd.all(): if c.constellation in [c.iau_abbreviations, c.nasa_abbreviations]: print('same:', c.constellation, c.iau_abbreviations, c.nasa_abbreviations, c.meaning) print('') what = r'Roger|Rabbit' print('search()', what) for c in cd.search(what): print('\t', c) print('') what = r'great' print('search()', what) for c in cd.search(what): print('\t', c) print('') what = r'Lacaille' print('search()', what) for c in cd.search(what): print('\t', c) print('') what = r'Australis|Majoris' print('search()', what) for c in cd.search(what): print('\t', c) print('') print('match()', what) for c in cd.match(what): print('\t', c) print('') what = r'Leo|Ursa' print('match()', what) for c in cd.match(what): print('\t', c) print('') what = r'Leo' print('match()', what) for c in cd.match(what): print('\t', c) print('') what = r'Leo' print('fullmatch()', what) for c in cd.fullmatch(what): print('\t', c) print('') if __name__ == '__main__': _main()