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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
|
.. doctest-skip-all
.. _astropy-wcs:
***************************************
World Coordinate System (`astropy.wcs`)
***************************************
.. _wcslib: http://www.atnf.csiro.au/people/mcalabre/WCS/wcslib/index.html
.. _distortion paper: http://www.atnf.csiro.au/people/mcalabre/WCS/dcs_20040422.pdf
.. _SIP: http://irsa.ipac.caltech.edu/data/SPITZER/docs/files/spitzer/shupeADASS.pdf
Introduction
============
`astropy.wcs` contains utilities for managing World Coordinate System
(WCS) transformations in FITS files. These transformations map the
pixel locations in an image to their real-world units, such as their
position on the sky sphere. These transformations can work both
forward (from pixel to sky) and backward (from sky to pixel).
It performs three separate classes of WCS transformations:
- Core WCS, as defined in the `FITS WCS standard`_, based on Mark
Calabretta's `wcslib`_. (Also includes ``TPV`` and ``TPD``
distortion, but not ``SIP``).
- Simple Imaging Polynomial (`SIP`_) convention. (See :doc:`note about SIP in headers <note_sip>`.)
- table lookup distortions as defined in the FITS WCS `distortion
paper`_.
Each of these transformations can be used independently or together in
a standard pipeline.
Getting Started
===============
The basic workflow is as follows:
1. ``from astropy import wcs``
2. Call the `~astropy.wcs.WCS` constructor with an
`astropy.io.fits` `~astropy.io.fits.Header` and/or
`~astropy.io.fits.HDUList` object.
3. Optionally, if the FITS file uses any deprecated or
non-standard features, you may need to call one of the
`~astropy.wcs.wcs.WCS.fix` methods on the object.
4. Use one of the following transformation methods:
- From pixels to world coordinates:
- `~astropy.wcs.wcs.WCS.all_pix2world`: Perform all three
transformations in series (core WCS, SIP and table lookup
distortions) from pixel to world coordinates. Use this one
if you're not sure which to use.
- `~astropy.wcs.wcs.WCS.wcs_pix2world`: Perform just the core
WCS transformation from pixel to world coordinates.
- From world to pixel coordinates:
- `~astropy.wcs.wcs.WCS.all_world2pix`: Perform all three
transformations (core WCS, SIP and table lookup
distortions) from world to pixel coordinates, using an
iterative method if necessary.
- `~astropy.wcs.wcs.WCS.wcs_world2pix`: Perform just the core
WCS transformation from world to pixel coordinates.
- Performing `SIP`_ transformations only:
- `~astropy.wcs.wcs.WCS.sip_pix2foc`: Convert from pixel to
focal plane coordinates using the `SIP`_ polynomial
coefficients.
- `~astropy.wcs.wcs.WCS.sip_foc2pix`: Convert from focal
plane to pixel coordinates using the `SIP`_ polynomial
coefficients.
- Performing `distortion paper`_ transformations only:
- `~astropy.wcs.wcs.WCS.p4_pix2foc`: Convert from pixel to
focal plane coordinates using the table lookup distortion
method described in the FITS WCS `distortion paper`_.
- `~astropy.wcs.wcs.WCS.det2im`: Convert from detector
coordinates to image coordinates. Commonly used for narrow
column correction.
For example, to convert pixel coordinates to world coordinates::
>>> from astropy.wcs import WCS
>>> w = WCS('image.fits')
>>> lon, lat = w.all_pix2world(30, 40, 0)
>>> print(lon, lat)
Using `astropy.wcs`
===================
Loading WCS information from a FITS file
----------------------------------------
This example loads a FITS file (supplied on the commandline) and uses
the WCS cards in its primary header to transform.
.. literalinclude:: examples/from_file.py
:language: python
Building a WCS structure programmatically
-----------------------------------------
This example, rather than starting from a FITS header, sets WCS values
programmatically, uses those settings to transform some points, and then
saves those settings to a new FITS header.
.. literalinclude:: examples/programmatic.py
:language: python
.. note::
The members of the WCS object correspond roughly to the key/value
pairs in the FITS header. However, they are adjusted and
normalized in a number of ways that make performing the WCS
transformation easier. Therefore, they can not be relied upon to
get the original values in the header. To build up a FITS header
directly and specifically, use `astropy.io.fits.Header` directly.
.. _wcslint:
Validating the WCS keywords in a FITS file
------------------------------------------
Astropy includes a commandline tool, ``wcslint`` to check the WCS
keywords in a FITS file::
> wcslint invalid.fits
HDU 1:
WCS key ' ':
- RADECSYS= 'ICRS ' / Astrometric system
RADECSYS is non-standard, use RADESYSa.
- The WCS transformation has more axes (2) than the image it is
associated with (0)
- 'celfix' made the change 'PV1_5 : Unrecognized coordinate
transformation parameter'.
HDU 2:
WCS key ' ':
- The WCS transformation has more axes (3) than the image it is
associated with (0)
- 'celfix' made the change 'In CUNIT2 : Mismatched units type
'length': have 'Hz', want 'm''.
- 'unitfix' made the change 'Changed units: 'HZ ' -> 'Hz''.
Bounds checking
---------------
Bounds checking is enabled by default, and any computed world
coordinates outside of [-180°, 180°] for longitude and [-90°, 90°] in
latitude are marked as invalid. To disable this behavior, use
`astropy.wcs.Wcsprm.bounds_check`.
Supported projections
=====================
As `astropy.wcs` is based on `wcslib`_, it supports the standard
projections defined in the `FITS WCS standard`_. These projection
codes are specified in the second part of the ``CTYPEn`` keywords
(accessible through `Wcsprm.ctype <astropy.wcs.Wcsprm.ctype>`), for
example, ``RA---TAN-SIP``. The supported projection codes are:
- ``AZP``: zenithal/azimuthal perspective
- ``SZP``: slant zenithal perspective
- ``TAN``: gnomonic
- ``STG``: stereographic
- ``SIN``: orthographic/synthesis
- ``ARC``: zenithal/azimuthal equidistant
- ``ZPN``: zenithal/azimuthal polynomial
- ``ZEA``: zenithal/azimuthal equal area
- ``AIR``: Airy's projection
- ``CYP``: cylindrical perspective
- ``CEA``: cylindrical equal area
- ``CAR``: plate carrée
- ``MER``: Mercator's projection
- ``COP``: conic perspective
- ``COE``: conic equal area
- ``COD``: conic equidistant
- ``COO``: conic orthomorphic
- ``SFL``: Sanson-Flamsteed ("global sinusoid")
- ``PAR``: parabolic
- ``MOL``: Mollweide's projection
- ``AIT``: Hammer-Aitoff
- ``BON``: Bonne's projection
- ``PCO``: polyconic
- ``TSC``: tangential spherical cube
- ``CSC``: COBE quadrilateralized spherical cube
- ``QSC``: quadrilateralized spherical cube
- ``HPX``: HEALPix
- ``XPH``: HEALPix polar, aka "butterfly"
And, if built with wcslib 5.0 or later, the following polynomial
distortions are supported:
- ``TPV``: Polynomial distortion
- ``TUV``: Polynomial distortion
.. note::
Though wcslib 5.4 and later handles ``SIP`` polynomial distortion,
for backward compatibility, ``SIP`` is handled by astropy itself
and methods exist to handle it specially.
Subsetting and Pixel Scales
===========================
WCS objects can be broken apart into their constituent axes using the
`~astropy.wcs.WCS.sub` function. There is also a `~astropy.wcs.WCS.celestial`
convenience function that will return a WCS object with only the celestial axes
included.
The pixel scales of a celestial image or the pixel dimensions of a non-celestial
image can be extracted with the utility functions
`~astropy.wcs.utils.proj_plane_pixel_scales` and
`~astropy.wcs.utils.non_celestial_pixel_scales`. Likewise, celestial pixel
area can be extracted with the utility function
`~astropy.wcs.utils.proj_plane_pixel_area`.
Matplotlib plots with correct WCS projection
============================================
The :ref:`WCSAxes <wcsaxes>` framework, previously a standalone package, allows
the :class:`~astropy.wcs.WCS` to be used to define projections in Matplotlib.
More information on using WCSAxes can be found :ref:`here <wcsaxes>`.
.. plot::
:context: reset
:include-source:
:align: center
from matplotlib import pyplot as plt
from astropy.io import fits
from astropy.wcs import WCS
from astropy.utils.data import get_pkg_data_filename
filename = get_pkg_data_filename('tutorials/FITS-images/HorseHead.fits')
hdu = fits.open(filename)[0]
wcs = WCS(hdu.header)
fig = plt.figure()
fig.add_subplot(111, projection=wcs)
plt.imshow(hdu.data, origin='lower', cmap=plt.cm.viridis)
plt.xlabel('RA')
plt.ylabel('Dec')
Other information
=================
.. toctree::
:maxdepth: 1
relax
history
See Also
========
- `wcslib`_
Reference/API
=============
.. automodapi:: astropy.wcs
.. automodapi:: astropy.wcs.utils
Acknowledgments and Licenses
============================
`wcslib`_ is licenced under the `GNU Lesser General Public License
<http://www.gnu.org/licenses/lgpl.html>`_.
|