私はこの問題の解決策を探して探しましたが、何も見つかりません。
私は、matplotlib を介して長方形の FITS 画像を生成し、続いて AstroPy (または PyFITS) を使用してそれらに WCS 座標を適用しています。私の画像は銀河の緯度と経度であるため、私のマップに適したヘッダー キーワードはGLON-CAR
and GLAT-CAR
(直交投影の場合) である必要があります。SAO DS9でこの同じ地図投影法を使用する他の地図を見てきましたが、座標はうまく機能します...グリッドは本来あるべき完全に直交しています。FITS の標準的な投影法は、ここで見つけることができます。
しかし、マップを生成すると、座標はまったくデカルトではありません。これは、私のマップ (左) とほぼ同じ地域の別の参照マップ (右) を並べて比較したものです。どちらも FITS ヘッダーにリストされていますGLON-CAR
がGLAT-CAR
、私のものは SAO DS9 で見ると厄介です (座標グリッドは FITS ヘッダーのデータに基づいて SAO DS9 が生成するか、少なくとも FITS ファイルのどこかに保存されていることに注意してください)。
投影が間違っていると、座標割り当てアルゴリズムが各ピクセルに間違った座標を割り当てるため、これは問題です。
誰かがこれに遭遇したことがありますか、それとも何が問題なのか知っていますか?
他の投影法を適用してみましたが (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)
ご協力いただきありがとうございます。