欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

已知坐标求方位角_由方位角高度角求赤经赤纬

发布时间:2024/2/28 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 已知坐标求方位角_由方位角高度角求赤经赤纬 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

接天体方位角和高度角的计算 - 且听风吟的文章 - 知乎 ,已知观测者的位置(地理坐标(b,l)),天体的位置也已知(赤道坐标(α,δ)),可以计算在某一给定时间(utc(y-m-d,h:m:s))天体的方位角和高度角(A,h);反过来,已知观测者位置、观测时间、指定天空某一点(也就是给出方位角、高度角),怎么反推出该点的赤经赤纬呢?解决了这个问题,我们就能知道,像一些观星的软件stellarium、starchart、starwalk等软件,是怎么告诉我们天上的星星是哪颗的。

这个问题和之前那篇文章的推导基本上是反过来的,也就是把方位角A、高度角h、观测者纬度b,经度l和观测时间(用来求地方恒星时)当做已知量。

先上一张图片帮助理解推导过程,还是利用球面三角的几个公式。

图片来自马文章《球面天文学》

1.地平坐标系转到时角坐标系

同样的在以观测者天顶Z、北极点P、天体的位置σ三个点为球面三角形PZσ的三个点,已知PZ、Pσ、Zσ,利用球面三角知识,很容易推出(粗体斜体字是直接使用的球面三角公式):

sin(δ)=cos(90-δ)=cos(90-φ)cos(90-h)+sin(90-C)sin(90-h)cos(360-A)

=sin(φ)sin(h)+cos(φ)cos(h)cos(A)(边的余弦公式)(1)

cos(δ)sin(t)=-cos(h)sin(A)(正弦公式)(2)

cos(δ)cos(t)=sin(90-δ)cos(t)=cos(90-h)sin(90-φ)-sin(90-h)cos(90-φ)cos(360-A)

=sin(h)cos(φ)-cos(h)sin(φ)cos(A)(第一五元素公式)(3)

由(2)(3)可推得

tan(t)=sin(A)/(cos(A)sin(φ)-cos(φ)tan(h)

由此可得到

δ=asin(sin(φ)csin(h)+cos(φ)cos(h)cos(A))

t=atan(sin(A)/(cos(A)sin(φ)-cos(φ)tan(h))

实际计算t的时候,应该使用atan2函数,传入sin(t)和cos(t)的值,因为cos(δ)≥0,所以可以直接传入cos(δ)sin(t)和cos(δ)cos(t)。

2.时角坐标系转动赤道坐标系

时角坐标系和赤道坐标系的赤纬相同,只需把时角t转成赤经α。

首先我们还是需要根据UTC时间求得格林尼治恒星时S,具体公式见上面那篇文章,S加上观测者经度l就是地方恒星时,又地方恒星时对于任意天体的地方时角加上赤经,所以可得:

α=S+l-t

具体代码如下:

#由方位角高度角计算赤经赤纬 from ephem import * import math #(1)构造观测者位置变量 wpf=Observer() wpf.lat='34.179569'#纬度 wpf.lon='115.93635'#经度 wpf.elevation=40#海拔 wpf.pressure=0#压强 wpf.date=now()#取当前时间 #wpf.date="2020/4/10 10:44:53"#时间根据需要修改 p=Venus()#金星 p.compute(wpf) #世界时转为儒略日 def utc2jd(t):s=(Date(t)).tuple()#世界时的y=s[0]#年m=s[1]#月d=s[2]#日h=s[3]#时dh=h+s[4]/60.0+s[5]/3600.0if m <= 2:y = y - 1m = m + 12day_num=int(365.25*y) + int(30.6001*(m + 1))+ d + int(dh / 24.0 + 1720981.5)hour_num=(h + 12) % 24#儒略日从12点取jd=day_num+hour_num/24+s[4]/1440+s[5]/86400return jd #由世界时求恒星时,t是格林尼治时间,返回值是角时 def sidereal_t(t):jd=utc2jd(t)mjd=jd-2451545.0#约化儒略日Tu=mjd/36525s0=6.697374558+2400.05134*Tu+0.000025862333*Tu*Tu-0.000000001722222*Tu*Tu*Tu#格林尼治时0时的恒星时s=(Date(t)).tuple()M=s[3]+s[4]/60.0+s[5]/3600.0#格林尼治时的小时数s=s0+M*366.2422/365.2422#格林尼治恒星时时加上地方经度(单位化为小时)等于地方恒星时s=s%24return s #给出观测者,天体,时间信息,求天体方位角高度角 def ra_dec(obs,a,h):s=sidereal_t(obs.date)#格里尼治恒星时ls=wpf.sidereal_time()ls=s+obs.lon*180/math.pi/15#地方恒星时ls=ls*15*math.pi/180#角时转为弧度ls1=wpf.sidereal_time()sint=-math.cos(h)*math.sin(a)cost=math.cos(obs.lat)*math.sin(h)-math.cos(h)*math.sin(obs.lat)*math.cos(a)t=math.atan2(sint,cost)if t<0:t=t+2*math.pira=ls-tra1=ls1-tdec=math.asin(math.sin(obs.lat)*math.sin(h)+math.cos(obs.lat)*math.cos(h)*math.cos(a))return ra,ra1,dec #A,h= az_alt(wpf,s,t) a=p.az h=p.alt r,r1,d=ra_dec(wpf,a,h) print(degrees(p.ra),degrees(p.dec)) print(degrees(r1),degrees(d)) print(degrees(r),degrees(d))

68:21:09.6 26:30:41.2
68:21:09.6 26:30:41.2
69:01:28.0 26:30:41.2

上面是使用以金星计算的结果为例,由金星的方位角高度角反推其赤经赤纬。可以看出使用ephem自带的求地方恒星时的函数,求得的赤经赤纬误差很小,使用自己所写的求恒星时的函数,赤经误差在角分级别,当然,实际情况是还要考虑大气误差等影响。

参考:马文章《球面天文学》

总结

以上是生活随笔为你收集整理的已知坐标求方位角_由方位角高度角求赤经赤纬的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。