首页 > 解决方案 > 天文学 RA 和 DEC 到笛卡尔坐标,然后在 2D 图像 FOV 中绘制

问题描述

我想创建一个模拟相机捕获的人造图像https://www.theimagingsource.com/products/industrial-cameras/usb-2.0-monochrome/dmk41bu02h/和镜头https://en.ids- imaging.com/store/lens-ricoh-fl-hc1214-2m-12-mm-1-2.html

所以我的问题是:从 Hipparcos 目录(https://cdsarc.u-strasbg.fr/viz-bin/ReadMe/I/239?format=html&tex=true)中获得星数据,我可以在其中获得 RA 和 DEC ,我想计算其对应的笛卡尔坐标,然后以某种方式将此 [x,y,z] 坐标转换为 [x,y] 以便我可以在图像中绘制它。

当然,观察者的位置应该在地球上,就像我用相机拍照一样。

我使用 python 作为对其进行编码的语言并使用 opencv 创建图像,但任何其他语言和/或库都是有效的。

谢谢。

标签: pythontrigonometryastropyastronomycartesian

解决方案


我能够将 hip_main.dat 目录加载到这样的目录中Table

>>> from astropy.table import Table
>>> t = Table.read('hip_main.dat', format='cds', readme='http://cdsarc.u-strasbg.fr/ftp/cats/aliases/H/Hipparcos/ReadMe')

(您也应该可以输入文件名的 URL,但由于某种原因,这对我不起作用,但如果我先手动将文件下载到本地目录,它确实有效 - 问题似乎是服务器上的原始文件是 gzip 压缩的,CDS 阅读器会被.gz文件名中的

它具有 hms/dms 坐标和度数。解析度数更快,所以我SkyCoord从它们中做了一个。它会自动检测格式是否以度为单位:

>>> coords = SkyCoord(ra=t['RAdeg'], dec=t['DEdeg'])                                                                                                                               
>>> coords                                                                                                                                                                         
<SkyCoord (ICRS): (ra, dec) in deg
    [(9.11850000e-04,   1.08901332), (3.79737000e-03, -19.49883745),
     (5.00795000e-03,  38.85928608), ..., (3.59976057e+02,   5.95663786),
     (3.59978239e+02, -64.3725722 ), (3.59978792e+02, -65.57707774)]>

它还可以从自述文件中正确检测 ICRS J1991.25。

您可以获得一个地球上的观察者位置,例如:

>>> from astropy.coordinates import EarthLocation                                                                                                                                  
>>> location = EarthLocation.of_site('greenwich')                                                                                                                                  
>>> location                                                                                                                                                                       
<EarthLocation (3980608.90246817, -102.47522911, 4966861.27310068) m>

(我只是在这里使用一个已知位置,但您可以将坐标放在地球上的任何地方)。

然后,如果您愿意,可以创建一个本地 alt/az 框架,例如:

>>> from astropy.time import Time
>>> from astropy.coordinates import AltAz                                                                                                                                          
>>> local_frame = AltAz(location=location, obstime=Time.now())                                                                                                                     
>>> local_frame                                                                                                                                                                    
<AltAz Frame (obstime=2020-08-14 12:39:58.682416, location=(3980608.90246817, -102.47522911, 4966861.27310068) m, pressure=0.0 hPa, temperature=0.0 deg_C, relative_humidity=0.0, obswl=1.0 micron)>

Then transform your original ICRS coordinates to this new frame:

```python
>>> local_coords = coords.transform_to(local_frame)                                                                                                                                
>>> local_coords                                                                                                                                                                   
<SkyCoord (AltAz: obstime=2020-08-14 12:39:58.682416, location=(3980608.90246817, -102.47522911, 4966861.27310068) m, pressure=0.0 hPa, temperature=0.0 deg_C, relative_humidity=0.0, obswl=1.0 micron): (az, alt) in deg
    [(327.54653574, -32.6138386 ), (316.63406529, -51.59917121),
     (339.37842396,   3.4498418 ), ..., (329.41414414, -28.02088907),
     (217.27653631, -71.09315213), (214.14690597, -70.46865069)]>

您还可以使用 将其转换为笛卡尔坐标local_coords.cartesian

不幸的是,当涉及到将这些投影到天空的某个 FoV 以进行图像模拟时,这有点超出我的能力。我可能会弄清楚,但可能其他人会更容易知道如何做到这一点。但至少现在你有一部分等式(如果我正确理解你的问题)。


推荐阅读