# Geodesic functions¶

Pyrocko’s `orthodrome` module offers geodesic functions to solve a variety of common geodetic problems, like distance and angle calculation on a spheroid.

## Distance between points on earth¶

In this example we use `distance_accurate50m()` and `pyrocko.model` to calculate the distance between two points on earth.

Download `orthodrome_example1.py`

```from pyrocko import orthodrome, model

e = model.Event(lat=10., lon=20.)
s = model.Station(lat=15., lon=120.)

# one possibility:
d = orthodrome.distance_accurate50m(e, s)
print('Distance between e and s is %g km' % (d/1000.))

# another possibility:
s.set_event_relative_data(e)
print('Distance between e and s is %g km' % (s.dist_m/1000.))
```

This can also be serialised for multiple coordinates stored in `numpy.ndarray` through `distance_accurate50m_numpy()`.

Download `orthodrome_example2.py`

```import numpy as num
from pyrocko import orthodrome

ncoords = 1000

# First set of coordinates
lats_a = num.random.uniform(-180., 180., ncoords)
lons_a = num.random.uniform(-90., 90., ncoords)

# Second set of coordinates
lats_b = num.random.uniform(-180., 180., ncoords)
lons_b = num.random.uniform(-90., 90., ncoords)

orthodrome.distance_accurate50m_numpy(lats_a, lons_a, lats_b, lons_b)
```

## Azimuth and backazimuth¶

Calculation of azimuths and backazimuths between two points on a spherical earth.

Download `orthodrome_example3.py`

```from pyrocko import orthodrome

# For a single point
orthodrome.azibazi(49.1, 20.5, 45.4, 22.3)

# >>> (161.05973376168285, -17.617746351508035)  # Azimuth and backazimuth

import numpy as num  # noqa

ncoords = 1000
# First set of coordinates
lats_a = num.random.uniform(-180., 180., ncoords)
lons_a = num.random.uniform(-90., 90., ncoords)

# Second set of coordinates
lats_b = num.random.uniform(-180., 180., ncoords)
lons_b = num.random.uniform(-90., 90., ncoords)

orthodrome.azibazi_numpy(lats_a, lons_a, lats_b, lons_b)
```

## Conversion to carthesian coordinates¶

Given two sets of coordinates, `latlon_to_ne()` returns the distance in meters in north/east direction.

Download `orthodrome_example4.py`

```from pyrocko import orthodrome

# option 1, coordinates as floats
north_m, east_m = orthodrome.latlon_to_ne(
10.3,   # origin latitude
12.4,   # origin longitude
10.5,   # target latitude
12.6)   # target longitude

print(north_m, east_m)

# >>> 22199.7843582 21821.3511789

# option 2, coordinates from instances with 'lon' and 'lat' attributes

from pyrocko.gf import seismosizer   # noqa

source = seismosizer.DCSource(lat=10.3, lon=12.4)
target = seismosizer.Target(lat=10.5, lon=12.6)

north_m, east_m = orthodrome.latlon_to_ne(source, target)

print(north_m, east_m)

# >>> 22199.7843582 21821.3511789
```

## Relative carthesian coordinates to latitude and longitude¶

Download `orthodrome_example5.py`

```from pyrocko import orthodrome

# arguments: origin lat, origin lon, north [m], east [m]
lat, lon = orthodrome.ne_to_latlon(10.3, 12.4, 22200., 21821.)

print("latitude: %s, longitude: %s " % (lat, lon))

# >>> latitude: 10.4995878932, longitude: 12.5995823469
```