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

Python 通过PyFITS/AstroPy在FITS图像中的笛卡尔投影问题,python,matplotlib-basemap,fits,pyfits,astropy,Python,Matplotlib Basemap,Fits,Pyfits,Astropy,我一直在寻找解决这个问题的办法,但什么也没有找到 我通过matplotlib生成矩形拟合图像,然后使用AstroPy(或PyFITS)将WCS坐标应用于这些图像。我的图像位于银河经纬度,因此适合我的地图的标题关键字应该是GLON-CAR和GLAT-CAR(用于笛卡尔投影)。我已经看过了,用同样的地图投影,坐标很好。。。网格应该是完全正交的。可以找到标准投影 但当我生成地图时,坐标根本不是笛卡尔坐标。下面是我的地图(左)和另一张大致相同区域的参考地图(右)的并排比较。两者都列在FITS标题中的GL

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

我通过matplotlib生成矩形拟合图像,然后使用AstroPy(或PyFITS)将WCS坐标应用于这些图像。我的图像位于银河经纬度,因此适合我的地图的标题关键字应该是
GLON-CAR
GLAT-CAR
(用于笛卡尔投影)。我已经看过了,用同样的地图投影,坐标很好。。。网格应该是完全正交的。可以找到标准投影

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

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

有没有人遇到过这种情况,或者知道可能是什么问题

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

我不敢相信这会是AstroPy的错误,但我找不到任何其他原因。。。除非标题中的参数格式不正确,但我仍然不知道这会如何导致我遇到的问题。或者你会推荐使用其他东西吗?(我看过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)

谢谢你能提供的帮助

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

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

header['CRPIX2'] -= header['CRVAL2'] / header['CDELT2']
header['CRVAL2'] = 0.
运气好吗


如果您查看所查看的“reference”文件的标题,您将看到
CRVAL2
在那里为零。需要明确的是,
CRVAL2
为非零没有什么错,但网格不再是直线的。

就是这样!!!哇,非常感谢。。。我自己永远不会发现这个解决方案。只是给将来遇到这个问题的人一个提示。。。因为这意味着将参考坐标设置为原点(0,0),所以最后一个难题是确定原点的像素值(CRPIX1和CRPIX2)。因此,根据地图的坐标,一个或两个参考像素可能为负值。我不得不稍微修改astrofrog的代码以使其适合我(特别是,我必须乘以倒数——也就是1/头['CDELT1']),才能得到正确的值。@Teachey-啊,是的,我得到了错误的方法-修正!