通过PyFITS/AstroPy在FITS图像中的笛卡尔投影问题

2024-06-02 09:39:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在寻找解决这个问题的办法,但什么也没找到。在

我通过matplotlib生成矩形拟合图像,然后使用AstroPy(或PyFITS)对它们应用WCS坐标。我的图像是在银河经纬度上的,所以适合我地图的标题关键字应该是GLON-CAR和{}(对于笛卡尔投影)。我看过other maps,它们在SAO DS9中使用相同的地图投影,坐标工作得很好。。。网格是完全正交的。FITS标准投影可以找到here.

但当我生成地图时,坐标不是笛卡尔坐标。下面是我的地图(左)和另一个大致相同地区的参考地图(右)的并排比较。两者都列在FITS标题中的GLON-CARGLAT-CAR,但我的在SAO DS9中查看时有点混乱(请注意,坐标网格是SAO DS9根据FITS标题中的数据生成的,或者至少存储在FITS文件中的某个地方):

(left) my map, and (right) reference map.  HEADER keywords are the same, both Cartesian

这是有问题的,因为如果投影错误,坐标分配算法将为每个像素分配不正确的坐标。在

有没有人遇到过这种情况,或者知道问题出在哪里?在

我尝试过应用其他预测(只是想看看它们在SAO DS9中的表现),结果很好。。。但是我的笛卡尔投影和墨卡托投影并没有像他们应该的那样得到正交网格。在

我不敢相信这会是一个太空虫,但我找不到任何其他原因。。。除非我在头中的参数格式不正确,但我仍然不明白这是如何导致我遇到的问题。或者你会推荐其他的吗?(我看过matplotlib basemap,但是在我的计算机上使用它时遇到了一些困难)。在

我的标题代码如下:

 from __future__ import division
 import numpy as np
 from astropy.io import fits as pyfits # or use 'import pyfits, same thing'

 #(lots of code in between: defining variables and simple calculations...
 #probably not relevant)

 header['BSCALE'] = (1.00000, 'REAL = TAPE*BSCALE + BZERO')
 header['BZERO'] = (0.0)
 header['BUNIT'] = ('mag ', 'UNIT OF INTENSITY')
 header['BLANK'] = (-100.00, 'BLANK VALUE')
 header['CRVAL1'] = (glon_center, 'REF VALUE POINT DEGR')   #FIRST COORDINATE OF THE CENTER
 header['CRPIX1'] = (center_x+0.5, 'REF POINT PIXEL LOCATION') ## REFERENCE X PIXEL
 header['CTYPE1'] = ('GLON-CAR', 'COORD TYPE : VALUE IS DEGR')
 header['CDELT1'] = (-glon_length/x_length, 'COORD VALUE INCREMENT WITH COUNT DGR')   ### degrees per pixel
 header['CROTA1'] = (0, 'CCW ROTATION in DGR')            
 header['CRVAL2'] = (glat_center, 'REF VALUE POINT DEGR') #Y COORDINATE OF THE CENTER
 header['CRPIX2'] = (center_y+0.5, 'REF POINT PIXEL LOCATION') #Y REFERENCE PIXEL 
 header['CTYPE2'] = ('GLAT-CAR', 'COORD TYPE: VALUE IS DEGR')   # WAS CAR OR TAN
 header['CDELT2'] = (glat_length/y_length, 'COORD VALUE INCREMENT WITH COUNT DGR') #degrees per pixel  
 header['CROTA2'] = (rotation, 'CCW ROTATION IN DEGR')                               #NEGATIVE ROTATES CCW around origin (bottom left). 
 header['DATAMIN'] = (data_min, 'Minimum data value in the file') 
 header['DATAMAX'] = (data_max, 'Maximum data value in the file')
 header['TELESCOP'] = ("Produced from 2MASS")

 pyfits.update(filename, map_data, header)

谢谢你能提供的任何帮助。在


Tags: inimportref标题datavalue地图car
1条回答
网友
1楼 · 发布于 2024-06-02 09:39:56

-CAR投影的现代定义中,GLON-CAR/GLAT-CAR投影仅在CRVAL2设置为零时产生一个直线网格。如果CRVAL2不为零,那么网格是弯曲的(这应该与Astropy无关)。您可以尝试通过调整CRVAL2和{}使{}为零来解决这个问题。这有帮助吗?在

为了澄清我的意思,在上面的代码之后,在写出文件之前,请尝试:

header['CRPIX2'] -= header['CRVAL2'] / header['CDELT2']
header['CRVAL2'] = 0.

有什么运气吗?在

如果您查看所查看的“reference”文件的头,您将看到CRVAL2在那里为零。为了清楚起见,当CRVAL2为非零时,没有任何问题,但是网格不再是直线的。在

相关问题 更多 >