引入
"Your Sky" 是由 Fourmilab 提供的一个在线天文应用,它可以生成基于特定地理位置和时间的实时天空视图。这个工具允许用户输入观察者的纬度、经度以及日期和时间,从而得到一张显示当时天空状态的图片。这张图片会展示出可见的星星、行星、月亮以及其他天体。
"Your Sky" 可以用来模拟不同的天文条件,比如:
观察者的位置(地球上的任何地点)。
特定的时间点(可以是过去、现在或未来)。
天空的视角(例如地平线以上或全天空)。
显示哪些天体(例如只显示行星或包括所有可见的星星)。
该应用非常适合教育用途,对于天文学爱好者来说也是个非常有用的工具。它可以帮助人们了解在给定时间和地点能看到什么样的天体现象。
Fourmilab 是一家位于瑞士的实验室,以其对互联网技术的创新应用而闻名,其中包括开发了许多与天文学相关的项目。"Your Sky" 是其中一个可以让公众通过互联网探索宇宙的应用程序。
我的StarWalker项目需要使用到星图,YourSky明显是最合适的选择,经过我一段时间的研究,这是我的研究结果
请求体结构
使用一个URL就可以请求到附有一张星图的文档,其URL参数大体如下
date=0: 日期设置模式为现在的UTC时间。使用1设置为定义UTC时间,使用2设置为定义儒略日。
utc=1998%2F02%2F06+12%3A42%3A40: UTC时间设置为1998年2月6日12点42分40秒。date为0/2无效。(其HTML实体编码用半角符号亦可)
jd=2450851.02963: Julian日期(儒略日),与上面的UTC时间对应,用于天文学计算。date为1/0无效。
lat=47%B0: 观测地点的纬度为北纬47°(注意 %B0 是HTML实体编码中的度符号)。
ns=North: 指明纬度的方向是北。
lon=7%B0: 观测地点的经度为东经7°。
ew=East: 指明经度的方向是东。
deepm=2.5: 显示深空天体的最大星等。
consto=on: 显示星座轮廓。
limag=5.5: 图像中显示最暗的恒星星等。
starnm=2.0: 图像中不显示比这更亮的恒星(以星等为单位)。
starbm=2.5: 图像中不显示比这更暗的恒星(以星等为单位)。
imgsize=640: 输出图像的宽度为640像素。
fontscale=1.0: 字体大小的比例。
scheme=3: 使用的配色方案编号为3。
elements=: 这个参数未被赋值,通常用于指定要包含在图像中的特殊元素或对象列表。
完整的一个请求就是
XXXXXXXXXXXXXXXXXXXt/cgi-bin/Yoursky?date=1&utc=1998%2F02%2F06+12%3A42%3A40&jd=2450851.02963&lat=47%B0&ns=North&lon=7%B0&ew=East&deepm=2.5&consto=on&limag=5.5&starnm=2.0&starbm=2.5&imgsize=640&fontscale=1.0&scheme=3&elements=
为了方便抓取其图片,我写了一个Python脚本
实现自动抓取
import requests
import bs4
from bs4 import BeautifulSoup
import time
def starchart(lat, lon,utctime):
url = "http://fourmilab.net/cgi-bin/Yoursky"
#UTCtime format <Year>/<Month>/<Day> <Hour>:<Minute>:<Second>
params = {
"date": "1",
"utc":utctime,
"lat": lat + "%B0",
"lon": lon + "%B0",
"ns":"North",
"ew":"East",
"deepm": "2.5",
"consto": "on",
"liamg":"5.5",
"starnm":"1",
"starbm":"5",
"fontscale":"1.0",
"scheme":"3",
"imgsize": "1000",
"elements": ""}
for i in range(5):
try:
response = requests.get(url, params=params)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
print(soup)
img_url = soup.find("img")["src"]
img_data = requests.get("http://fourmilab.net" + img_url).content
with open("star_map.png", "wb") as f:
f.write(img_data)
break
except requests.RequestException as e:
print(f"请求失败,重试次数:{i + 1}")
if i < 4:
time.sleep(2)
else:
raise e
starchart("0", "0", "2023/10/1 12:00:00")
更改末尾调用模块的参数即可更改经纬度和日期
该程序使用MPL-2.0 license
AD 在这里推一下我的网站"电子鱼"XXXXXXXXp和XXXXXXXXXXXXXXXXXXXX