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