README.md

# SwedenCrsTransformations

Elixir library for transformation of geographic coordinates between WGS84 and the Swedish coordinate reference systems SWEREF99 and RT90.

This library is a port of the TypeScript library [sweden_crs_transformations_4typescript](https://github.com/TomasJohansson/sweden_crs_transformations_4typescript), which is based on the C#.NET library [MightyLittleGeodesy](https://github.com/bjornsallarp/MightyLittleGeodesy/). All libraries are released with the MIT license.

## Features

- Transform coordinates between WGS84, SWEREF99, and RT90 coordinate reference systems
- Support for 20 different CRS projections:
  - WGS84 (global GPS coordinates)
  - SWEREF99 TM (national Swedish grid)
  - 12 local SWEREF99 projection zones
  - 6 local RT90 projection zones
- High precision transformations using Gauss-Kreuger projection formulas
- Comprehensive test suite with coordinate accuracy validation

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `sweden_crs_transformations` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:sweden_crs_transformations, "~> 0.1.0"}
  ]
end
```

## Usage

### Basic coordinate transformation

```elixir
# Create a WGS84 coordinate (Stockholm Central Station)
coord = SwedenCrsTransformations.CrsCoordinate.new(:wgs84, 59.330231, 18.059196)

# Transform to SWEREF99 TM
sweref_coord = SwedenCrsTransformations.CrsCoordinate.transform(coord, :sweref_99_tm)
# => %SwedenCrsTransformations.CrsCoordinate{
#      crs_projection: :sweref_99_tm,
#      y_latitude: 6580822.0,
#      x_longitude: 674032.0
#    }

# Transform to RT90
rt90_coord = SwedenCrsTransformations.CrsCoordinate.transform(coord, :rt90_2_5_gon_v)
```

### Using EPSG numbers

```elixir
# Create coordinate by EPSG number (3006 = SWEREF99 TM)
{:ok, coord} = SwedenCrsTransformations.CrsCoordinate.new_by_epsg_number(3006, 6580822, 674032)

# Transform by EPSG number (4326 = WGS84)
wgs84_coord = SwedenCrsTransformations.CrsCoordinate.transform_by_epsg_number!(coord, 4326)
```

### Convenient module-level functions

```elixir
# You can also use the main module for convenience
coord = SwedenCrsTransformations.new(:wgs84, 59.330231, 18.059196)
transformed = SwedenCrsTransformations.transform(coord, :sweref_99_tm)
```

### Available CRS projections

- `:wgs84` - WGS84 (EPSG:4326)
- `:sweref_99_tm` - SWEREF99 TM (EPSG:3006)
- `:sweref_99_12_00` through `:sweref_99_23_15` - SWEREF99 local zones
- `:rt90_7_5_gon_v` through `:rt90_5_0_gon_o` - RT90 local zones

Get all available projections:

```elixir
SwedenCrsTransformations.CrsProjection.get_all()
# => [:wgs84, :sweref_99_tm, :sweref_99_12_00, ...]
```

## Running Tests

```bash
mix test
```

All tests pass with coordinate accuracy within:

- 0.000007 degrees for WGS84 transformations
- 0.5 meters for SWEREF99 and RT90 transformations

## License

MIT License - see LICENSE file for details.

This library is based on:

- [sweden_crs_transformations_4typescript](https://github.com/TomasJohansson/sweden_crs_transformations_4typescript) by Tomas Johansson (MIT)
- [MightyLittleGeodesy](https://github.com/bjornsallarp/MightyLittleGeodesy/) by Björn Sållarp (MIT)

## Credits

- Original C# implementation: Björn Sållarp
- TypeScript port: Tomas Johansson
- Elixir port: Based on the TypeScript version