Stellarium 天空文化构建实战:用 Sky Telescope 数据生成星座连线与星名文件

发布时间:2026/9/24 13:52:41
Stellarium 天空文化构建实战:用 Sky  Telescope 数据生成星座连线与星名文件 桌面应用图形学科研【免费下载链接】stellariumStellarium is a free GPL software which renders realistic skies in real time with OpenGL. It is available for Linux/Unix, Windows, macOS and Haiku. With Stellarium, you really see what you can see with your eyes, binoculars or a small telescope.项目地址https://gitcode.com/gh_mirrors/ste/stellarium点击查看免费下载Stellarium 的 modern_stModern / Sky Telescope天空文化将国际天文学联合会IAU的 88 星座标准与 Sky TelescopeST杂志的星座图与星名体系整合进开源天文模拟器。本文以仓库内 skycultures/modern_st/README.md 为核心完整讲解如何用附带的两个 Python 脚本把 ST 提供的原始数据翻译成 Stellarium 可用的星座连线constellationship.fab与星名star_names.fab文件并结合 Constellation.cpp、ConstellationMgr.cpp 等源码揭示数据在 Stellarium 内部的加载链路。读完本文你将掌握 ST 数据格式的解析规则、VizieR 在线星表查询与缓存策略、三类翻译陷阱的处理方式以及如何独立重建或维护一套完整的现代天空文化数据。modern_st基于 Sky Telescope 的现代天空文化文化定位与数据来源根据 skycultures/modern_st/description.mdModern 天空文化是当今全球现代天文学家通用的方案也是 IAU 的官方星座体系其历史根源可追溯到古希腊天文学并受到伊斯兰天文学影响。它的星座图形与星名全部来自 Sky Telescope 的定义因此熟悉 ST《口袋星空图集》Pocket Sky Atlas、《Sky Atlas 2000.0》以及 ST 杂志星图的用户会感到高度一致。现代文化把天球划分为 88 个大小不等的区域即星座每个星座都有 IAU 发布的精确边界。这套体系已在日常使用中全面取代其他天空文化的同类集合。目录内容与元数据结构skycultures/modern_st/目录下的文件构成了一套完整天空文化的全部素材文件作用index.json天空文化元数据星座连线lines、IAU 边界edges、名称等description.md人类可读的文化描述简介、引用、作者、许可SnT_constellations.txtST 提供的星座连线原始数据固定宽度记录SnT_star_names.docxST 提供的星名 Word 文档generate_constellationship.py星座连线数据生成脚本generate_star_names.py星名数据生成脚本CMakeLists.txt安装规则将整个目录安装到${SDATALOC}/skycultures/modern_stindex.json的顶层字段以id: modern_st开头包括regionWorld、classification[single]、fallback_to_international_namesfalse、constellations数组、edges_typeiau、edges_sourcepbarbier.com 的 IAU 边界数据、edges_epochB1875以及edges数组每条如001:002 M 22:52:00 34:30:00 22:52:00 52:30:00 AND LAC表示相邻星座边界顶点及所属星座缩写。constellations数组中每个条目的lines字段由HipparcosHIP目录编号组成例如仙女座{ id: CON modern_st And, lines: [[677, 3092, 5447, 9640], [113726, 116631, 116805, 116584], [116631, 2912, 3092], [2912, 5447, 4436, 3881, 5434, 7607], [3092, 3031, 3693, 4463]], common_name: {english: Chained Maiden, native: Andromeda, pronounce: an-DRAH-mih-duh, context: ST constellation name, translators_comments: ancient, daughter of Cepheus} }common_name对象中的english英文通用名、native拉丁名、pronounce读音与contextST constellation name会直接用于界面显示与搜索。一、星座连线数据生成constellationship.fab1.1 数据来源SnT_constellations.txt 的记录格式ST 提供的 SnT_constellations.txt 是每行 32 个字符的固定宽度记录文件头部注释给出了完整字段定义位置含义1–5恒星视星等visual magnitude6空7–14赤经 RA小时及小数J2000.015空16–23北天极距 NPD度及小数J2000.0赤纬 dec 90 − NPD24空25–28拜耳希腊字母可能带角标29线宽代码1 粗线2 中粗线3 或 4 细线3 与 4 无区别4 仅用于强制另起新线30–32星座缩写绘图规则文件头注释明确说明若本记录最后四个字符作为一个整体与前一条记录相同则是已开始连线的延续若最后四个字符与上一条不同则在上一点结束当前线并在新坐标处另起一条新线线宽取这四个字符中第一个字符给出的代码大多数情况下坐标为真实恒星位置但也有少数情况坐标接近而非正好在某颗星上——这是 ST 在恒星不属于本星座、仅用于补全图形时故意留下的间隙详见后文非星座恒星。另外ST 数据用Erj作为 Eridanus波江座在 π 星之后的延续星座代号由于 π 星略微位于 Cetus 内ST 自己的绘图软件要求最后四个字符之一发生变化才能另起新线因此他们伪造了Erj这个星座名来强制换行。解析脚本必须把Erj还原为Eri。1.2 环境准备与依赖generate_constellationship.py 是 Python 3 脚本依赖astroquery访问 VizieR 在线星表与percache磁盘缓存。官方推荐的隔离环境创建方式# 创建 Python 虚拟环境 $ virtualenv -p /usr/bin/python3 python_virtualenv $ . python_virtualenv/bin/activate $ pip install astroquery percache1.3 生成命令脚本从STDIN读取 ST 星座数据向STDOUT输出 Stellarium 星座连线语法诊断与进度信息打印到STDERR# 生成 constellationship.fab 文件 $ ./generate_constellationship.py SnT_constellations.txt constellationship.fab # 可选强制重新执行 VizieR 查询 $ rm .hip_cache1.4 脚本工作原理正则解析输入generate_constellationship.py的snt_data()函数用一条正则逐行匹配输入data_regex re.compile(r([0-9\. -]{5}) ([0-9\. ]{8}) ([0-9\. ]{8}) ([A-Za-z0-9 -]{3})([a-zA-Z0-9 ])([0-9])([a-zA-Z]{3}))依次捕获星等、RA、NPD、拜耳名、上标、线宽、星座缩写NPD 换算为赤纬dec 90 - npd。遇到Erj会替换为Eri。无法匹配且不以#开头的行会向 STDERR 输出WARNING: No match: ...便于排查数据问题。VizieR 星表查询与匹配每个顶点都要通过get_hip(ra, dec, mag)查询 VizieR 服务将 RA/Dec 坐标翻译成 Stellarium 使用的 Hipparcos 目录编号。实现要点查询目录为I/239/hip_mainHipparcos 主星表仅取HIP与Vmag列通过Vmagmag-0.5..mag0.5约束在目标星等 ±0.5 等范围内搜索按星等排序后取第一条结果先以 0.05° 半径做定点搜索API 响应更快若找不到再扩大到 1.5° 半径的圆形搜索。后者的存在正是为了兼容 ST连线终点停在非本星座恒星附近半度处的惯例例如飞马座的 Alpheratz 其实位于仙女座使用SkyCoord在 J2000.0 历元构造坐标对象。磁盘缓存由于每颗星查询 VizieR 需要数秒脚本用percache.Cache(.hip_cache, livesyncTrue)对get_hip()做装饰器缓存。livesyncTrue保证即使CtrlC中断已缓存的值也能保留供下次运行使用。若修改了get_hip()函数本身必须删除.hip_cache文件否则会拿到过期的缓存结果。连线的连续性判定脚本以线宽 星座的组合作为一条连续线的标识current_line {weight}{constellation}。当该组合变化时视为换线上一顶点成为旧线终点新顶点成为新线起点。仅当同一线上存在前一个顶点时才向该星座追加(previous_hip, current_hip)线段元组。数据歧义的人工修正ST 原始数据在个别顶点上存在歧义脚本做了三处硬编码修正源码注释分别引用了 GitHub Issue #1438、#1414if vertex[constellation] Cyg and vertex[bayer] 31-: current_hip 99848 # ST 数据中 o2 (31) Cyg 顶点位置有歧义 elif vertex[constellation] Pup and vertex[bayer] alf: current_hip 30438 # 确保 nu Pup 到老人星(Canopus)的线真正终止于老人星 elif vertex[constellation] UMa and vertex[bayer] xi: current_hip 55203 # 确保 nu UMa 到 xi UMa 的线真正终止于 xi UMa若某顶点查询不到 HIP 编号脚本会抛出ValueError并给出该顶点的拜耳名、星座、坐标与星等方便人工介入。Mensa 与 Microscopium 的特殊补全脚本最后为 ST 未提供的两个星座做了补全——用各自星座的 α、β 星各生成一条连线constellationship[Men].append( (29271, 23467,) ) constellationship[Mic].append( (102831, 102989,) )对照 index.jsonMensa 的lines为[[29271, 23467]]Microscopium 的lines为[[102831, 102989]]与脚本补全完全一致——这证实了当前仓库中的连线数据正是本脚本流程的产物。输出格式脚本最终按星座缩写排序输出格式为 Stellarium 的constellationship.fab语法星座缩写 线段数 起点HIP 终点HIP 起点HIP 终点HIP ...例如Men 1 29271 23467。输出后脚本按捕获的KeyboardInterrupt情况以非零状态退出此时仍会先输出已收集的数据。二、翻译注意事项Translation CaveatsREADME 明确列出了把 ST 数据翻译成 Stellarium 连线时必须注意的三类问题线宽Line weightST 星图用不同线宽绘制星座连线例如人马座茶壶东侧的茶匙teaspoon星群就比主星座画得更细。而Stellarium 目前无法绘制不同线宽的星座线因此generate_constellationship.py选择把全部线都画出来。虽然只保留最粗线的过滤器实现起来相对容易但为了让 Stellarium 的连线最接近 ST 星图的观感保留全部连线是更优选择。非星座恒星Non-constellation starsST 有一项惯例当连线终点是一颗不属于本星座的恒星时如飞马座图形使用的 Alpheratz该星实际在仙女座内连线会在距目标星半度处提前终止。而 Stellarium 的星座线绘制功能要求所有连线必须终止于恒星。这正是get_hip()采用 1.5° 大半径搜索并就近匹配的原因——把线端附近的星找出来作为实际端点。缺失的星座Missing constellationsST没有提供 Microscopium显微镜座和 Mensa山案座的星座连线因此严格按原始数据计算出的constellationship.fab只包含 88 个星座中的 86 个。脚本通过上文所述的 α/β 星补全逻辑让最终数据保持 88 个星座全部有连线。三、星名数据生成star_names.fab3.1 数据来源ST 提供了 Word 文档 SnT_star_names.docx内含 ST 出版物中使用的恒星名称及确定方法说明。文档中的恒星以独立段落组织每段用制表符分隔星名与拜耳命名部分星名带脚注星名后跟数字、逗号与空格。3.2 环境准备除astroquery、percache外还需要python-docx来解析.docx# 创建 Python 虚拟环境 $ virtualenv -p /usr/bin/python3 python_virtualenv $ . python_virtualenv/bin/activate $ pip install astroquery percache python-docx3.3 生成命令# 生成 star_names.fab 文件 $ ./generate_star_names.py SnT_star_names.docx star_names.fab # 可选强制重新执行 VizieR 查询 $ rm .hip_cache_stars注意该脚本与星座脚本不同文档路径通过命令行参数传入而非 STDIN缺少参数时会打印Usage: generate_star_names.py SnT_star_names.docx并退出。3.4 脚本工作原理docx 段落解析与过滤generate_star_names.py用正则^\s*([^,0-9])[ 0-9,]*\t(.*)$从每个段落中提取星名 拜耳名文档开头有一份标准/非标准星名对照表也会匹配该正则脚本通过白名单跳过非标准条目名单包括Alnair、Almaak、Alphekka、Alnath、Etamin、Mirphak、Phad、Rigil Kent、Shedir、Nonstandard文档包含两份排序不同的星名清单脚本只取第一份重复的星名直接跳过。VizieR 查询与缓存每个星名先用拜耳名、再用星名本身依次调用get_hip(name)查询I/239/hip_main取第一条结果的HIP编号两次都失败则该星会被丢弃并输出 warning。查询结果缓存于.hip_cache_stars文件同样livesyncTrue。手工补充的著名恒星有几类星无法通过上述流程自动获得编号脚本用硬编码补充Pocket Sky Atlas 中额外收录的著名恒星共 13 颗例如Proxima CentauriHIP 70890、Barnards StarHIP 87937、Hinds Crimson StarHIP 23203、Vela X-1HIP 44368、Lalande 21185HIP 54035、Groombridge 1830HIP 57939、Herschels Garnet StarHIP 107259、Krueger 60HIP 110893等VizieR 查不到结果的星Alula AustralisHIP 55203与ArkabHIP 95241。输出格式清理掉所有无 HIP 编号的星后按 HIP 编号排序输出每行一条HIP 编号|_(星名)star_names.fab这种HIP|_(name)的格式在整个仓库中通用——Stellarium 的通用星名文件正是 skycultures/common_star_names.fab由 StarMgr.cpp 通过StelFileMgr::findFile(skycultures/common_star_names.fab)加载并维护在commonNamesMap中见 StarMgr.hpp 的注释。因此生成脚本产出的星名文件可以被 Stellarium 直接使用或并入通用星名体系。四、Stellarium 侧的数据消费链路源码视角4.1 天空文化的加载入口StelSkyCultureMgr.cpp 以index.json为每个天空文化的入口文件constexpr char indexFileName[] /index.json并按 id 读取其元数据。天空文化切换后ConstellationMgr.cpp 的loadLinesNamesAndArt(const StelSkyCulture culture)会遍历culture.constellations即 index.json 的constellations数组为每个条目构造Constellation对象并加载连线、名称与艺术图。4.2 lines 数组如何变成屏幕上的连线Constellation.cpp 的Constellation::read()解析每个星座条目id必须形如CON cultureName Abbrev如CON modern_st And否则整条记录被拒绝common_name的english/native/pronounce/context等字段被逐一读取lines数组中的每个元素是一个折线段polyline折线中每个点可以是字符串如DSO:...指向深空天体、thin/bold修饰符——后者当前版本尚不支持会被忽略或数字 HIP 编号数字顶点通过HP NR_OF_HIP ? starMgr-searchHP(HP) : starMgr-searchGaia(HP)解析Constellation.cppHIP 编号范围内的星走searchHP更大的编号走盖亚Gaia星表查询找不到对应恒星时整条星座记录会被跳过并输出警告cant find star HIP ...连续顶点两两成对加入constellation线段列表随后计算重心用于标签放置、按hull_radius/hull_extension生成凸包Convex Hull最终由ConstellationMgr::drawLines()渲染。4.3 与旧版 constellationship.fab 的渊源Constellation.hpp 的注释仍保留着历史说明——星座类成员保存星座缩写与 Hipparcos 目录编号取自文件constellationship.fab。也就是说generate_constellationship.py输出的constellationship.fab是 Stellarium 历来的星座连线数据格式而现代版本的index.json以 JSON 承载了同一份信息lines中的 HIP 序列与 fab 的缩写 线段数 HIP对...结构一一对应。若你想把脚本输出接入新版 Stellarium只需把 fab 内容转写成 index.json 中对应星座的lines数组即可。五、完整工作流与运维建议把以上内容串成一套可重复的更新流程# 1. 准备环境只需一次 $ virtualenv -p /usr/bin/python3 python_virtualenv $ . python_virtualenv/bin/activate $ pip install astroquery percache python-docx # 2. 重新生成星座连线需要联网访问 VizieR视缓存情况耗时数分钟 $ ./generate_constellationship.py SnT_constellations.txt constellationship.fab # 3. 重新生成星名文件 $ ./generate_star_names.py SnT_star_names.docx star_names.fab # 4. 数据有更新或修改了脚本后务必清掉缓存再重跑 $ rm .hip_cache .hip_cache_stars实操建议首次运行耗时较长每颗星查询 VizieR 约需数秒几百个顶点累积下来耗时明显请耐心等待并留意 STDERR 的进度输出每个顶点都会打印拜耳名 星座 [ra..., dec..., mag...]... HIP 编号。缓存是双刃剑.hip_cache与.hip_cache_stars能大幅加速重复运行但修改get_hip()逻辑后必须删除否则会静默复用旧结果。善用 STDERR 诊断WARNING: No match、warning: xxx has no HIP designation、Unable to locate HIP for ...等输出能帮你快速定位 ST 源数据或解析逻辑的问题。验证输出完整性检查生成的 fab 是否覆盖 88 个星座注意 Mensa / Microscopium 依赖脚本末尾的特殊补全对照 index.json 中的lines确认编号与 HIP 星表一致确保 Stellarium 加载时不会出现cant find star HIP ... skipping constellation的警告。数据落位按 CMakeLists.txt 的规则整个modern_st目录会被安装到安装前缀下的skycultures/modern_st/Stellarium 启动后由StelSkyCultureMgr据此目录的index.json注册该天空文化。通过上述流程你可以完整复现 Stellarium 内置的 Sky Telescope 现代天空文化也能够基于同一套脚本与数据源为其他以 HIP 编号为恒星主键的星图或工具定制自己的星座连线与星名数据集。赞分享桌面应用图形学科研【免费下载链接】stellariumStellarium is a free GPL software which renders realistic skies in real time with OpenGL. It is available for Linux/Unix, Windows, macOS and Haiku. With Stellarium, you really see what you can see with your eyes, binoculars or a small telescope.项目地址https://gitcode.com/gh_mirrors/ste/stellarium点击查看免费下载相关推荐9Router Dashboard 显示成本异常偏高怎么排查9Router Dashboard 显示成本异常偏高怎么排查 当你通过 9Router 代理多个 AI 供应商Claude Code、GLM、MiniMax桌面应用图形学科研深度实战Blender MMD Tools专业工作流全解析与高效技巧深度实战Blender MMD Tools专业工作流全解析与高效技巧 Blender MMD Tools是一款专为Blender设计的强大插件实现了Miku桌面应用图形学科研Stellarium 中的 Modern (H.A. Rey) 天空文化Rey 星座连线的实现、数据结构与源码解析Stellarium 中的 Modern H.A. Rey 天空文化Rey 星座连线的实现、数据结构与源码解析 本文围绕 Stellarium 开源仓库中内置桌面应用图形学科研上一篇react-native-quick-crypto 项目教程下一篇【亲测免费】 PoDoFo一款强大的PDF文件处理开源库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考