python - 天文学 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 创建图像,但任何其他语言和/或库都是有效的。
谢谢。
解决方案
我能够将 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 以进行图像模拟时,这有点超出我的能力。我可能会弄清楚,但可能其他人会更容易知道如何做到这一点。但至少现在你有一部分等式(如果我正确理解你的问题)。
推荐阅读
- fhir-server-for-azure - Microsoft 是否在 $everything 查询中添加了对 _count 的支持?
- c# - 如何从图像获取绑定在源上的图像路径
- deep-learning - 如何使用 Pytorch 实现将 Alexnet 中的附加输入数据与最后一个 dropout 层的输出连接起来?
- reactjs - 将 _isMounted 定义为变量与状态之间有什么区别?
- visual-studio-code - 在 Markdown 文件中引用 vscode 扩展
- xml - 如何访问嵌套档案?
- html - 如何减少谷歌翻译语言类型?
- ios - 核心数据 NSPredicate:返回与另一个对象相关的所有对象,该对象的 ID 出现在给定数组中
- java - Android 中的 KeyChain API KeyStore#getCertificate 在 C++ 或 HAL 中是否有本机实现?
- node.js - 在 Azure 函数中返回正文