接天体方位角和高度角的计算 - 且听风吟的文章 - 知乎 ,已知观测者的位置(地理坐标(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自带的求地方恒星时的函数,求得的赤经赤纬误差很小,使用自己所写的求恒星时的函数,赤经误差在角分级别,当然,实际情况是还要考虑大气误差等影响。

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

已知坐标求方位角_由方位角高度角求赤经赤纬相关推荐

  1. lisp pause 坐标值_lisp 已知坐标绘断面图_测量并写坐标(表格方式) - AutoLISP/Visual LISP...

    ;;;功能:测量并写坐标(表格方式) (输出XYZ) ;;;日期:zml84 于 2007-04-07 ;;;======================================== (def ...

  2. lisp 已知坐标绘断面图_【干货】横断面测量数据批量转换成断面图,CASS应该如何做?...

    最近,一个小伙伴私信我咨询:已经完成了横断面外业测量,断面线上的高程点都是按顺序采集的(下图所示),想批量输出横断面图.如果一条条横断面手工连点绘制断面线,然后绘制断面图-- 重复操作,大量的断面也会 ...

  3. 已知坐标求方位角_【干货】RTK视频实操 | 求转换参数详解和七点注意事项!

    RTK视频教学,『求转换参数』,技术员结合测量一线实操经验,运用工程之星5.0软件为大家讲解如何求转换参数,以及求转换参数需要注意哪些事项. 求转换参数操作 通常情况下,科力达工程之星直接输出的坐标为 ...

  4. 已知基点的经纬度,根据方位角和运动距离求另外一点的经纬度

    1. 已知基点的经纬度,根据方位角和运动距离求另外一点的经纬度 1.1 需求概述及图解 假设方位角是α, 那从点1到点2的平移距离分别如下所示dsinα, dcosα. 这里正北为0度.已知基点(点1 ...

  5. python求斜边上的高是多少厘米_已知一个直角三角形的两条直角边,如何求斜边上的高的长度...

    展开全部 利用:直角32313133353236313431303231363533e59b9ee7ad9431333431333963三角形的面积不变,即两直角边的乘积的一半=斜边乘以斜边上的高的一 ...

  6. CAD手机看图软件中如何根据已知坐标点绘制线段?

    在使用CAD手机看图软件查看CAD图纸的过程中,需要绘制直线或者多线段的时候,一般情况下是选择已有图形夹点进行绘制,但如果已知具体的每个坐标点,那么该如何通过坐标点连接起对应的线段?接下来给大家简单介 ...

  7. 如何计算已知坐标之间的角度?

    如何计算已知坐标之间的角度? 在二维平面坐标系中,我们经常需要计算两个点之间的角度.本文将介绍如何使用Python程序,根据已知的坐标计算两点间的夹角. 首先,我们需要了解一些数学知识.如果我们已知两 ...

  8. 【C++】已知二叉树先序遍历+中序遍历 求后序遍历

    题目:已知二叉树先序遍历+中序遍历 求后序遍历 对于一棵二叉树,给定其先序遍历的结果序列和中序遍历的结果序列,请写出其后序遍历的结果序列. 输入样例: GDAFEMHZ(先序遍历的结果序列) ADEF ...

  9. 已知一个点的经纬度、方位角、距离,求另一点经纬度

    /*** 长半径a=6378137 米*/public static double EARTH_RADIUS = 6378137;/*** 短半径b=6356752.3142*/public stat ...

最新文章

  1. 边缘使用 K8s 门槛太高?OpenYurt 这个功能帮你快速搭建集群!
  2. Java 9:好的,坏的和私有的接口方法
  3. 新加坡区块链公司Tribe Accelerator完成7000万美元融资
  4. [置顶]大型网站技术架构(一)大型网站架构演化
  5. Q81:“三角形网格”之“PLY文件”
  6. SCOM 2007 R2安装部署各组件支持的操作系统详细列表
  7. 阿里centos php版本升级
  8. 卸载centos7自带java,安装oracle的jdk8
  9. layui的按钮禁用与启用
  10. NERO8注册码序列号
  11. java读写yml文件
  12. 赶上了秋招的末班车,抓住了秋招的尾巴,成功上岸了
  13. java邮件发送代码报错_javamail发送附件不通过也不报错
  14. Tomcat11——Tomat集群
  15. 国内外10大项目外包平台
  16. 跑步感到痛苦,试试超慢跑
  17. 安超云生态 | 安超云与硅格半导体完成产品兼容互认证 携手打造协同生态
  18. 精妙绝伦!阿里资深架构师撰写这份:并发编程,可谓“独具匠心”
  19. 【软件测试】入门答疑,概念
  20. cbtc仿真系统总结

热门文章

  1. 后端不哭!最新优化性能经验分享来啦
  2. 音视频技术开发周刊 | 196
  3. 容联雷辉:视频系统由标清进入到移动高清时代
  4. 研效优化实践:Python单测——从入门到起飞
  5. 大牛书单 | 新年聊创新:技术人必备思维
  6. 腾讯TEG校招群聊天记录曝光,速来围观!
  7. FFMPEG结构体分析
  8. C语言文件操作 fopen, fclose, mkdir(打开关闭文件,建文件夹,判断文件是否存在可读或可写)
  9. c++无锁链表的实现
  10. 关于SQLContext过期,SparkSession登场