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

时间:2014-01-28 19:33:44

标签: python matplotlib-basemap fits pyfits astropy

我看了看并找到了解决这个问题的办法,但我什么都没有。

我通过matplotlib生成矩形FITS图像,然后使用AstroPy(或PyFITS)将WCS坐标应用于它们。我的图像是银河纬度和经度,因此适合我的地图的标题关键字应为GLON-CARGLAT-CAR(对于笛卡尔投影)。我查看other mapsSAO 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中的表现)并且它们表现得很好......但我的笛卡尔和墨卡托投影并没有像他们应该的那样提出正交网格。

我无法相信这会是AstroPy中的一个错误,但是我找不到任何其他原因......除非我在标题中的参数格式不正确,但我仍然看不出它会如何导致我正在经历的问题。或者你会推荐使用其他东西吗? (我已经看过matplotlib底图,但在我的计算机上工作时遇到了一些麻烦)。

我的标题代码如下:

 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)

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:7)

-CAR投影的现代定义中(来自Calabretta等人),GLON-CAR / GLAT-CAR投影仅在CRVAL2设置为零时才生成直线网格。如果CRVAL2不为零,则网格是弯曲的(这应该与Astropy无关)。您可以通过调整CRVAL2CRPIX2来尝试解决此问题,以便CRVAL2为零。这有帮助吗?

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

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

运气好吗?

如果你看一下'引用的标题'你看过的文件,你会发现那里CRVAL2为零。需要明确的是,CRVAL2不为零,错误,但网格不再是直线的。