# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.15.0]

Version 0.15.0 - 7 months and 234 commits in the making.
Introducing unigrid - unified, memory mapped grids, and
shining from a substantial number of cleanups and
improvements.

### Added

- Rumination #12: Unigrids and the `UG` grid maintenance utility
- Unigrid maintenance tool `UG`
- Support for memory mapped unigrids
- read_grid(...) - mostly for unigrid maintenance
- Introducing X.md, the (rudimentary) transformation register
- Some additions to the TM register
- NKG.md, the (incomplete) register of transformations originating
  from the Nordic Geodetic Commission
- trait Context: get_grid_value()
- GridSource enum, for improved handling of internal vs. external grids
- arcsec_to_radians (opposite of to_arcsec) for coordinate types
- Support for additional grid file types: Gravsoft with subgrids,
  Golden Software ASCII grid, GTX
- Support for determination of the point of intersection of lines in the 2D (projected) plane
- Helmert: Support angular args in microarcseconds, linear args in millimeters

### Fixed

- Prefix modifiers for macros now work properly
- Pipelines now have a meaningful `_name` (=their entire invocation)
- Swap band order of `eur_nkg_nkgrf17vel.deformation` (now `nkgrf17vel.deformation`)
  from NEU to ENU.

### Changed

- MSRV set to 1.87, and Rust Edition to 2024, following georust/geo
- Clean up and consolidate the macro- and operation decoding
- Op.steps is only used by the pipeline operator, so make it
  an `Option<Vec<Op>>`, instead of a zero-sized `Vec<Op>`
- Remove superfluous fields `steps` and `id` from `OpDescriptor`
- Remove superfluous field `id` from `Op`
- In general enormous changes and cleanups, mostly code internal

### Removed

- NTv2Grid (BaseGrid is now feature compatible with NTv2Grid)

-------------------------------------------------------------------------------

## [0.14.0] - 2025-08-14

### Added

- `CoordinateSet`: xyz(), set_xyz(), xyzt(), set_xyzt() methods
- Vector space operators (Add, Sub, Mul, Div) for all built
  in coordinate tuple types (Coor4D, Coor3D, Coor2D, Coor32)
- `TriaxialEllpisoid`, mostly as a placeholder
- Rumination #10: What's wrong with 19111
- kp, the coordinate processing tool, now supports computation of scale, distortion,
  and meridian convergence factors, akin to PROJ's  `proj -S ...` and `proj -V ...`
  switches

### Fixed

- A large number of linguistic errors and ambiguities

### Changed

- `CoordinateTuple` trait now requires implementation of the constructor
  method `new(fill: f64)`, returning an object of `dim()` copies of `fill`.
- The huge `Ellipsoid`-implementation switched to a new trait `EllipsoidBase`,
  and a number of associated traits requiring `EllipsoidBase`.
- Meaning of `EllipsoidBase::aspect_ratio()` switched from *b / a* to the
  apparently more common *a / b*
- Major restructuring and clean up of `lib.rs`. Only marginally visible externally,
  if using `use geodesy::prelude::*`
- Moved some_basic_coorNdinates to `crate::test_dat::coorNd`
- Changed MSRV to 1.74

### Removed

- `CHANGES.md`
- Unused parallel context stub `context/parallel.rs`

## [0.13.0] - 2024-04-06

### Added

- Better support for handling coordinates via the `CoordinateSet` and
  `CoordinateTuple` traits.

  Not introduced all over the code base, but see `tmerc.rs`, `merc.rs`
  and the documentation for `CoordinateSet` and `CoordinateTuple` for
  usage examples

  **Note** that there is a minor **breaking change** involved in this
  (see "Changed" below)

- New operators (cf. *Rumination #002* for details)
  - `stack` with options `push`, `pop`, `roll`, `unroll`, `swap` and `flip`.
  - `gravity`: Normal gravity from a number of different current and
     historical normal gravity models
  - `deflection`: Deflection of the vertical, computed from a geoid model

### Fixed

- Adhere to the [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
  recommendations
- `Tokenize::Normalize`: Whitespace error
- Better series handling in `ParsedParameters`

### Changed

- Upgrade dependencies

- The `CoordinateSet` trait now **requires** the implementation
  of a `dim()` method.

  Essentially `dim()` is just a function returning a constant,
  reflecting the native dimensionality of the underlying dataset
  (typically a `usize` in the `1..=4` range)

- Improved syntax for register resources (See *Rumination #009*)

- Change the name of `CHANGES.md` to `CHANGELOG.md`, and try to follow guidelines from
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)

### Removed

- Outdated inner_op/template.rs file
- CHANGELOG file (can still be generated by `just changelog`, but not
  tracked by git anymore)

## [0.12.0] Release notes

### Improvements

- Alternative parameter names for the `helmert` operator
  (`translations`, `rotations` etc.) (Nic Hill)
- Improved syntax and parameter handling (#92) (Thomas Knudsen)
  - `>` and `<` can be used to indicate pipeline steps that are `omit_inv` and
    `omit_fwd` respectively (syntactic sugar for `| omit_inv`, etc.)
  - True utf-8 subscripts supported in parameter names (e.g. `x₀`), as alternatives
    to the existing `x_0`-style
  - More free form syntax: Modifiers `inv`, `omit_inv` and `omit_fwd` may now prefix
    the operator name, i.e. `inv utm zone=32` is functionally identical to `utm inv zone=32`
- Implement the `axisswap` operator (#84) (Thomas Knudsen)
- Replace `once_cell` with `std::sync::OneLock`. (Corey Farwell)
- KP: Guess output dimensionality (#82) (Thomas Knudsen)
- Implement `unitconvert` operator (#80) (Sean Rennie)
- Implement latlon, lonlat, latlong, and longlat as noop-aliases (Thomas Knudsen)

### Bug fixes

- LAEA: correct lon_0 in the inverse 'rho==0' case (#90) (Thomas Knudsen)
- Mark `clap-verbosity-flag` as an optional dep (#81) (Corey Farwell)
- Repair links in README.md (Thomas Knudsen)

### Acknowledgements

Geodesy v0.12.0 materialized through contributions from

- [Corey Farwell](https://github.com/frewsxcv)
- [Nic Hill](https://github.com/nrhill1)
- [Sean Rennie](https://github.com/Rennzie)
- [Thomas Knudsen](https://github.com/busstoptaktik)

## [0.11.0] Release notes

### Improvements

- Handle lists-of-grids, `@optional` grids, and the `@null` grid in `grids=` clauses
- Support NTv2 format datum shift grids
- Overall documentation brush up and extension
- Implement `somerc`, the Swiss Oblique Mercator operator
- Implement `deformation`, the 3D intrapalte deformation operator
- Rename the `NMEA` operators to `dm/dms` and `iso_dm/iso_dms`
- Support jacobian-of-projection and the corresponding deformation factors
- `proj_parse`: Translate PROJ syntax to Rust Geodesy syntax
  with partial support for PROJ ellipsoid definitions
- Through `proj_parse`, the `Plain` context, and hence `kp` now supports PROJ syntax
  (although with the limitations implied by Geodesy only supporting parts of the PROJ
  operator gamut, and by the differing input-output conventions between `kp` and `proj/cct`)
  as demonstrated by this example:

   ```sh
   echo 55 12 | kp geo:in | kp "proj=pipeline step proj=utm zone=32 step inv proj=utm zone=32" | kp geo:out
   ```

  which does nothing, in a very convoluted way
- Partial operator introspection
- General support for 2D, 3D, 4D, and 32 bit 2D coordinates
  (`Coor2D`, `Coor3D`, `Coor4D`, `Coor32`)
- Hence `Coord` is gone

### Bug fixes

- Avoid double correction for lat_0 in inverse tmerc

### Acknowledgements

A huge thank you goes to [Sean Rennie](https://github.com/Rennzie) who a.o. did most
of the work on the improved grid support in 0.11.0,
and to [Kyle Barron](https://github.com/kylebarron) for pushing Geodesy over the
WASM barrier in 0.10.0
