Change Log

1.0.3 (2026-02-12)

Bug Fixes

  • Bugfix for supporting non-coordinate inputs to transforms supporting quantities. (#706)

1.0.2 (2026-02-11)

Bug Fixes

  • Fix two bugs in the LabelMapperConverter:

    1. When roundtripping a LabelMapperArray, with a non-default number of inputs, deserialization fails because the init of the LabelMapperArray will set the number of inputs in the model to the default value of 2, which is then attempted to be overridden by later deseriaization methods.

    2. The converter fails when lazy_load is set to false and the mapper is an array.

    Both of these issues have been resolved. (#701)

1.0.1 (2026-01-22)

Bug Fixes

  • Fix gwcs evaluation when the input or output frames are None or EmptyFrame. (#684)

Legacy Change Log

1.0.0 (2026-01-15)

  • Raise an error when inserting a transform before the first coordinate frame. [#654]

  • Remove with_units argument from __call__ and invert. Use the Shared API functions instead, pixel_to_world and world_to_pixel. [#635]

  • Adjust and fix tests. Replace logging with warnings. [#659]

  • Update the Native API. [#660]

  • Update doc dependencies to remove sphinx-tabs in favor of sphinx-inline-tabs. [#676]

  • Enable MyPy type checking. [#657]

0.26.1 (2025-11-19)

  • Fix an indexing bug in spectroscopy.SellmeierZemax where the output n for array-type wavelength inputs had the correct shape, but had the same value for all elements. [#642]

  • Deprecate the private _toindex function in favor of a public to_index function. [#619]

0.26.0 (2025-09-18)

  • Fix the computation of lon_pole for Zenitahl projections and declination of +/-90 deg. [#616]

  • Enable inputs_mapping in selector.LabelMapperArray. [#626]

  • Deprecate with_units argument in favor of the high level Shared API. [#634]

0.25.1 (2025-06-20)

  • Relax the oldest allowed numpy version to 1.25 [#607]

0.25.0 (2025-06-19)

  • Removed from PyPi

  • Reorganize documentation to have two separate introductions (user and developer) [#604]

  • Test with latest version of Python and drop Python 3.10 [#569]

  • Fix API issue with wcs.numerical_inverse. [#565]

  • Switch to using a new sphinx theme and clean up the documentation. [#580]

  • Fix bug where “vector” (shape (n,) not shape (1, n)) arrays would loose all their entries except the first if with_units=True was used. [#563]

  • Bugfix for __call__ and invert incorrectly handling units when involving “parameterless” transforms. [#562]

  • Refactor wcs.coordinate_frames into its own sub-module. [#567]

  • Bugfix for outside_footprint modifying the input coordinates. [#595]

  • Derive the longitude of the celestial pole from the supplied projection. [#600]

  • Add FITSImagingWCSTransform. [#602]

0.24.0 (2025-02-04)

  • Coordinate frames now have a “native” order and then are sorted based on axes_order. [#457]

  • WCS.numerical_inverse no longer accepts high level objects (with_units= is not supported) use WCS.inverse. [#457]

  • CoordinateFrame.coordinates has been replaced by CoordinateFrame.to_high_level_coordinates [#457]

  • CoordinateFrame.to_quantity has been replaced by CoordinateFrame.from_high_level_coordinates. [#457]

  • Inputs to CelestialFrame, such as axes_names are now explicitly in lon, lat order and will re sorted based on axes_order=. [#457]

  • Implement code linting and automatic formatting. [#544]

  • Refactor WCS to use a Pipeline base class which adds basic checks to ensure that the pipeline is valid. These include checking for duplicate frame names and that the last transform is None. [#545]

  • Bugfix for WCS.invert and WCS.to_fits that prevented evaluation when the attached bounding box happened to have units on its values. [#554]

0.23.0 (skipped)

This was skipped to avoid issues with an ongoing JWST release.

0.22.0 (2024-12-19)

  • Replace usages of copy_arrays with memmap [#503]

  • Fix an issue with units in wcs_from_points. [#507]

  • Fix incorrect units being returned in the low level WCS API. [#512]

  • Synchronize region.py with the copies of it in JWST and Romancal. [#517]

  • Add support for compound bounding boxes and ignored bounding box entries. [#519]

  • Add gwcs.examples module, based on the examples located in the testing conftest.py. [#521]

  • Force bounding_box to always be returned as a F ordered box. [#522]

  • Move the bounding box attachment to the forward transform property. [#532]

  • Adjust world_to_array_index_values to round to integer coordinates as specified by APE 14. [#525]

  • Add warning filter to asdf extension to prevent the bounding_box order warning for gwcs objects originating from a file. [#526]

  • Fixed a bug where evaluating the inverse transform did not respect the bounding box. [#498]

  • Improved reliability of inside/outside footprint computations when evaluating inverse transform with bounding box. [#536]

0.21.0 (2024-03-10)

  • Improve documentation. [#483]

  • Add a minimum version requirement for asdf-wcs-schemas. [#491]

  • Fix WCS.__str__ for instances without transforms. [#489]

0.20.0 (2023-11-29)

  • Replace pkg_resources with importlib.metadata. [#478]

  • Serialize and deserialize pixel_shape with asdf. [#480]

0.19.0 (2023-09-15)

Bug Fixes

  • Synchronize array_shape and pixel_shape attributes of WCS objects. [#439]

  • Fix failures and warnings with numpy 2.0. [#472]

other

  • Remove deprecated old bounding_box. The new implementation is released with astropy v 5.3. [#458]

  • Refactor CoordinateFrame.axis_physical_types. [#459]

  • StokesFrame uses now astropy.coordinates.StokesCoord. [#452]

  • Dropped support for Python 3.8. [#451]

  • Fixed a call to astropy.coordinates in wcstools.wcs_from_points. [#448]

  • Code and docstrings clean up. [#460]

  • Register all available asdf extension manifests from asdf-wcs-schemas except 1.0.0 (which contains duplicate tag versions). [#469]

  • Register empty extension for 1.0.0 to avoid warning about a missing extension when opening old files. [#475]

0.18.3 (2022-12-23)

Bug Fixes

  • Fixed a bug in the estimate of pixel scale in the iterative inverse code. [#423]

  • Fixed constant term in the polynomial used for SIP fitting. Improved stability and accuracy of the SIP fitting code. [#427]

0.18.2 (2022-09-07)

Bug Fixes

  • Corrected the reported requested forward SIP accuracy and reported fit residuals by to_fits_sip() and to_fits(). [#413, #419]

  • Fixed a bug due to which the check for divergence in _fit_2D_poly() and hence in to_fits() and to_fits_sip() was ignored. [#414]

New Features

0.18.1 (2022-03-15)

Bug Fixes

  • Remove references to the six package. [#402]

0.18.0 (2021-12-22)

Bug Fixes

  • Updated code in region.py with latest improvements and bug fixes from stsci.skypac.regions.py [#382]

  • Added support to _compute_lon_pole() for computation of lonpole for all projections from astropy.modeling.projections. This also extends support for different projections in wcs_from_fiducial(). [#389]

New Features

  • Enabled CompoundBoundingBox support for wcs. [#375]

  • Moved schemas to standalone package asdf-wcs-schemas. Reworked the serialization code to use ASDF converters. [#388]

0.17.1 (2021-11-27)

Bug Fixes

  • Fixed a bug with StokesProfile and array types. [#384]

0.17.0 (2021-11-17)

Bug Fixes

  • world_axis_object_components and world_axis_object_classes now ensure unique keys in CompositeFrame and CoordinateFrame. [#356]

  • Fix issue where RuntimeWarning is raised when there are NaNs in coordinates in angle wrapping code [#367]

  • Fix deprecation warning when wcs is initialized with a pipeline [#368]

  • Use CD formalism in WCS.to_fits_sip(). [#380]

New Features

  • wcs_from_points now includes fitting for the inverse transform. [#349]

  • Generalized WCS.to_fits_sip to be able to create a 2D celestial FITS WCS from celestial subspace of the WCS. Also, now WCS.to_fits_sip supports arbitrary order of output axes. [#357]

API Changes

  • Modified interface to wcs_from_points function to better match analogous function in astropy. [#349]

  • Model._BoundingBox was renamed to Model.ModelBoundingBox. [#376, #377]

0.16.1 (2020-12-20)

Bug Fixes

  • Fix a regression with pixel_to_world for output frames with one axis. [#342]

0.16.0 (2020-12-18)

New Features

  • Added an option to to_fits_sip() to be able to specify the reference point (crpix) of the FITS WCS. [#337]

  • Added support for providing custom range of degrees in to_fits_sip. [#339]

Bug Fixes

  • bounding_box now works with tuple of Quantities. [#331]

  • Fix a formula for estimating crpix in to_fits_sip() so that crpix is near the center of the bounding box. [#337]

  • Allow sub-pixel sampling of the WCS model when computing SIP approximation in to_fits_sip(). [#338]

  • Fixed a bug in to_fits_sip due to which inv_degree was ignored. [#339]

0.15.0 (2020-11-13)

New Features

  • Added insert_frame method to modify the pipeline of a WCS object. [#299]

  • Added to_fits_tab method to generate FITS header and binary table extension following FITS WCS -TAB convention. [#295]

  • Added in_image function for testing whether a point in world coordinates maps back to the domain of definition of the forward transformation. [#322]

  • Implemented iterative inverse for some imaging WCS. [#324]

0.14.0 (2020-08-19)

New Features

  • Updated versions of schemas for gwcs objects based on latest versions of transform schemas in asdf-standard. [#307]

  • Added a wcs.Step class to allow serialization to ASDF to use references. [#317]

  • wcs.pipeline now is a list of Step instances instead of a (frame, transform) tuple. Use WCS.pipeline.transform and WCS.pipeline.frame to access them. [#319]

Bug Fixes

  • Fix a bug in polygon fill for zero-width bounding boxes. [#293]

  • Add an optional parameter input_frame to wcstools.wcs_from_fiducial. [#312]

0.13.0 (2020-03-26)

New Features

  • Added two new transforms - SphericalToCartesian and CartesianToSpherical. [#275, #284, #285]

  • Added to_fits_sip method to generate FITS header with SIP keywords [#286]

  • Added get_ctype_from_ucd function. [#288]

Bug Fixes

  • Fixed an off by one issue in utils.make_fitswcs_transform. [#290]

0.12.0 (2019-12-24)

New Features

  • gwcs.WCS now supports the world_axis_object_components and world_axis_object_classes methods of the low level WCS API as specified by APE 14.

  • Removed astropy-helpers from package. [#249]

  • Added a method fix_inputs which returns an unique WCS from a compound WCS by fixing inputs. [#254]

  • Added two new transforms - ToDirectionCosines and FromDirectionCosines. [#256]

  • Added new transforms WavelengthFromGratingEquation, AnglesFromGratingEquation3D. [#259]

  • gwcs.WCS now supports the new world_axis_names and pixel_axis_names properties on LowLevelWCS objects. [#260]

  • Update the StokesFrame to work for arrays of coordinates and integrate with APE 14. [#258]

  • Added Snell3D, SellmeierGlass and SellmeierZemax transforms. [#270]

API Changes

  • Changed the initialization of TemporalFrame to be consistent with other

    coordinate frames. [#242]

Bug Fixes

  • Ensure that world_to_pixel_values and pixel_to_world_values always accept and return floats, even if the underlying transform uses units. [#248]

0.11.0 (2019/07/26)

New Features

  • Add a schema and tag for the Stokes frame. [#164]

  • Added WCS.pixel_shape property. [#233]

Bug Fixes

  • Update util.isnumerical(…) to recognize big-endian types as numeric. [#225]

  • Fixed issue in unified WCS API (APE14) for transforms that use Quantity. [#222]

  • Fixed WCS API issues when output_frame is 1D, e.g. Spectral only. [#232]

0.10.0 (12/20/2018)

New Features

  • Initializing a WCS object with a pipeline list now keeps the complete CoordinateFrame objects in the WCS.pipeline. The effect is that a WCS object can now be initialized with a pipeline from a different WCS object. [#174]

  • Implement support for astropy APE 14 (https://doi.org/10.5281/zenodo.1188875). [#146]

  • Added a wcs_from_[points function which creates a WCS object two matching sets of points (x,y) and (ra, dec). [#42]

0.9.0 (2018-05-23)

New Features

  • Added a TemporalFrame to represent relative or absolute time axes. [#125]

  • Removed deprecated grid_from_domain function and WCS.domain property. [#119]

  • Support for Python 2.x, 3.0, 3.1, 3.2, 3.3 and 3.4 was removed. [#119]

  • Add a coordinate_to_quantity method to CoordinateFrame which handles converting rich coordinate input to numerical values. It is an inverse of the coordinates method. [#133]

  • Add a StokesFrame which converts from ‘I’, ‘Q’, ‘U’, ‘V’ to 0-3. [#133]

  • Support serializing the base CoordinateFrame class to asdf, by making a specific tag and schema for Frame2D. [#150]

  • Generalized the footrpint calculation to all output axes. [#167]

API Changes

  • The argument output="numerical_plus" was replaced by a bool argument with_units. [#156]

  • Added a new flag axis_type to the footprint method. It controls what type of footprint to calculate. [#167]

Bug Fixes

  • Fixed a bug in bounding_box definition when the WCS has only one axis. [#117]

  • Fixed a bug in grid_from_bounding_box which caused the grid to be larger than the image in cases when the bounding box is on the edges of an image. [#121]

0.8.0 (2017-11-02)

  • LabelMapperRange now returns LabelMapperRange._no_label when the key is not within any range. [#71]

  • LabelMapperDict now returns LabelMapperDict._no_label when the key does not match. [#72]

  • Replace domain with bounding_box. [#74]

  • Added a LabelMapper model where mapper is an instance of Model. [#78]

  • Evaluating a WCS with bounding box was moved to astropy.modeling. [#86]

  • RegionsSelector now handles the case when a label does not have a corresponding transform and returns RegionsSelector.undefined_transform_value. [#86]

  • GWCS now deals with axes types which are neither celestial nor spectral as “unknown” and creates a transform equivalent to the FITS linear transform. [#92]

0.7 (2016-12-23)

New Features

  • Added wcs_from_fiducial function to wcstools. [#34]

  • Added domain to the WCS object. [#36]

  • Added grid_from_domain function. [#36]

  • The WCS object can return now an SkyCoord or Quantity object. This is triggered by a new parameter to the __call__ method, output which takes values of “numericals” (default) or “numericals_plus”. [#64]

API_Changes

  • Added atol argument to LabelMapperDict, representing the absolute tolerance [#29]

  • The CoordinateFrame.transform_to method was removed [#64]

Bug Fixes

  • Fixed a bug in LabelMapperDict where a wrong index was used.[#29]

  • Changed the order of the inputs when LabelMapperArray is evaluated as the inputs are supposed to be image coordinates. [#29]

  • Renamed variables in read_wcs_from_header to match loop variable [#63]

0.5.1 (2016-02-01)

Bug Fixes

  • Added ASDF requirement to setup. [#30]

  • Import OrderedDict from collections, not from astropy. [#32]

0.5 (2015-12-28)

Initial release on PYPI.