最近在 Hacker News 上看到一个很有意思的 Show HN 作品:输入一个地址,页面就会告诉你 8 月 12 日的日食在你家屋顶上看起来是什么效果。这类工具平常看起来只是“地图 + 天文数据”的简单拼接,但真正实现时,你会发现地址解析、天文计算、时区换算、地平可见度判断这些环节一个都不能少。
这篇文章就围绕这个需求,从零实现一个命令行版“输入地址查日食可见度”工具。完整代码可以直接复制运行,包含地址解析、日月位置计算、日食分类与结果输出,适合对 Python 工程化、天文算法和应用开发感兴趣的读者。读完你会掌握:
- 如何把“瓦伦西亚”这类地址字符串转换成经纬度;
- 如何用 Skyfield 计算任意位置在 2026 年 8 月 12 日的日食观测结果;
- 如何判断某个地点是“全食”“偏食”还是“看不到”;
- 如何把这个脚本扩展成一个 Web API 或地图可视化工具。
文章示例代码在 Python 3.10 + Skyfield 2.x 环境下编写,其他版本语法兼容性应该没问题,如果遇到差异请以官方文档为准。
1. 背景与核心概念
1.1 什么是 2026 年 8 月 12 日日食
日食的本质是月亮运行到太阳和地球之间,月影投射到地球表面,遮挡住太阳光。由于月亮本影在地球表面覆盖范围很小,同一时刻只有少数地区的观测者能看到日全食,其他地区可能只能看到日偏食,甚至完全看不到。
2026 年 8 月 12 日会发生一次日全食,全食带主要经过格陵兰东南部、北大西洋到西班牙北部和地中海西部一带,欧洲多个地区也能看到不同程度的偏食。对国内用户来说,地理位置不同,结果差异会非常大:同一个时刻,有人在晴空下见证白昼变黑夜,有人那边太阳还在地平线以下,什么都看不到。
“从地址查日食”这个需求,本质上要解决