README.md

# Proj

Proj is an Elixir library for converting coordinates between different
coordinate systems, using Erlang NIFs to the OSGeo PROJ.4 library.

Proj also supports geodesic functions from PROJ.4.  A geodesic is the shortest
line around the globe which crosses through two points.  This is useful for
solving problems such as:

- Finding the distance between two locations

- Finding the bearings between two locations

- Finding the resulting location after moving `x` metres forwards facing a
  certain bearing from a given location

- Plotting a set of points in a line between two locations

## Installation

Before you can install Proj, you must have:

- gcc
- PROJ.4 newer than 4.9.0 (PROJ 5+ should work, but this library makes use of
  the legacy PROJ.4 API.)

### Ubuntu / Debian:

    apt install libproj-dev gcc binutils libc-dev make

### Red Hat / CentOS

    yum install proj-devel binutils gcc glibc-devel make

### macOS

    brew install proj

Proj has currently only been tested on GNU/Linux and Mac OS X.  Windows support
has not yet been tested and may require some small changes to work under a
Cygwin or MinGW environment.

## Example Usage

```elixir
iex> {:ok, bng} = Proj.from_epsg(27700) # British National Grid CRS is EPSG:27700
{:ok, #Proj<+init=epsg:27700 ...>}

# Convert the British National Grid Easting + Northing of Buckingham Palace into
# a Latitude + Longitude pair
iex> Proj.to_lat_lng!({529155, 179699}, bng)
{51.50147938477216, -0.1406319210455952}

# Convert the Latitude + Longitude of Buckingham Palace to its
# British National Grid Easting + Northing
iex> Proj.from_lat_lng!({51.501479, -0.140631}, bng)
{529155.0658918166, 179698.9583449281}

# Calculate the shortest distance "as the crow flies" in metres between
# Buckingham Palace and the Eiffel Tower
iex> Proj.Geodesic.distance({51.501476, -0.140634}, {48.8584, 2.2945})
341549.6819692767

# Calculate the resulting location after travelling 100 metres forwards from
# Buckingham Palace, facing a bearing of 060°
iex> Proj.Geodesic.travel({51.501476, -0.140634}, 60, 100)
{51.50192539979596, -0.1393868003258145}
```