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

Cartesian projection issue in a FITS image through PyFITS / AstroPy

我已经寻找并寻找了解决该问题的方法,但是却一无所获。

我正在通过matplotlib生成矩形FITS图像,然后使用AstroPy(或PyFITS)将WCS坐标应用于它们。我的图像采用银河系经度和纬度,因此适合于我的地图的标头关键字应为GLON-CARGLAT-CAR(对于笛卡尔投影)。我已经看过其他在SAO DS9中使用相同地图投影的地图,并且坐标可以很好地工作...网格完全应该是正交的。 FITS标准投影可以在这里找到。

但是,当我生成地图时,坐标完全不是笛卡尔坐标。这是我的地图(左)与另一个大致相同区域的参考地图(右)的并排比较。在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底图,但在将其用于计算机上时遇到了一些麻烦)。

我的标头代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 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)

感谢您的任何帮助,您可以提供。


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

只是为了弄清楚我的意思,请在上面的代码之后并在写出文件之前尝试一下:

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

运气好的话?

如果您查看所查看的"参考"文件的标题,您会发现CRVAL2在那里为零。 只是要清楚,CRVAL2为非零没有什么问题,但是网格不再是直线的。