Geocalc

Calculate distance, bearing and more between Latitude/Longitude points.

Summary

Functions

Calculates bearing. Return radians

Converts degrees to radians. Return radians

Finds point between start and end points in direction to end point with given distance (in meters). Finds point from start point with given distance (in meters) and bearing. Return array with latitude and longitude

Calculates distance between 2 points. Return distance in meters

Finds intersection point from start points with given bearings. Return array with latitude and longitude. Raise an exception if no intersection point found

Converts radians to degrees. Return degrees

Functions

bearing(point_1, point_2)

Specs

bearing(map, map) :: number
bearing(list, list) :: number

Calculates bearing. Return radians.

Example

iex> berlin = [52.5075419, 13.4251364]
iex> paris = [48.8588589, 2.3475569]
iex> Geocalc.bearing(berlin, paris)
-1.9739245359361486
iex> Geocalc.bearing(paris, berlin)
1.0178267866082613

Example

iex> berlin = %{lat: 52.5075419, lon: 13.4251364}
iex> paris = %{latitude: 48.8588589, longitude: 2.3475569}
iex> Geocalc.bearing(berlin, paris)
-1.9739245359361486
degrees_to_radians(degrees)

Specs

degrees_to_radians(number) :: number

Converts degrees to radians. Return radians.

destination_point(point_1, bearing, distance)

Specs

destination_point(map, number, number) :: tuple
destination_point(list, number, number) :: tuple
destination_point(map, map, number) :: tuple
destination_point(list, list, number) :: tuple

Finds point between start and end points in direction to end point with given distance (in meters). Finds point from start point with given distance (in meters) and bearing. Return array with latitude and longitude.

Example

iex> berlin = [52.5075419, 13.4251364]
iex> paris = [48.8588589, 2.3475569]
iex> bearing = Geocalc.bearing(berlin, paris)
iex> distance = 400_000
iex> Geocalc.destination_point(berlin, bearing, distance)
{:ok, [50.97658022467569, 8.165929595956982]}

Example

iex> zero_point = [0.0, 0.0]
iex> equator_degrees = 90.0
iex> equator_bearing = Geocalc.degrees_to_radians(equator_degrees)
iex> distance = 1_000_000
iex> Geocalc.destination_point(zero_point, equator_bearing, distance)
{:ok, [5.484172965344896e-16, 8.993216059187306]}

Example

iex> berlin = [52.5075419, 13.4251364]
iex> bearing = -1.9739245359361486
iex> distance = 100_000
iex> Geocalc.destination_point(berlin, bearing, distance)
{:ok, [52.147030316318904, 12.076990111001148]}

Example

iex> berlin = [52.5075419, 13.4251364]
iex> paris = [48.8588589, 2.3475569]
iex> distance = 250_000
iex> Geocalc.destination_point(berlin, paris, distance)
{:ok, [51.578054644172525, 10.096282782248409]}
distance_between(point_1, point_2)

Specs

distance_between(map, map) :: number
distance_between(list, list) :: number

Calculates distance between 2 points. Return distance in meters.

Example

iex> berlin = [52.5075419, 13.4251364]
iex> paris = [48.8588589, 2.3475569]
iex> Geocalc.distance_between(berlin, paris)
878327.4291149472
iex> Geocalc.distance_between(paris, berlin)
878327.4291149472

Example

iex> berlin = %{lat: 52.5075419, lon: 13.4251364}
iex> london = %{lat: 51.5286416, lng: -0.1015987}
iex> paris = %{latitude: 48.8588589, longitude: 2.3475569}
iex> Geocalc.distance_between(berlin, paris)
878327.4291149472
iex> Geocalc.distance_between(paris, london)
344229.88946533133
intersection_point(point_1, bearing_1, point_2, bearing_2)

Specs

intersection_point(map, number, map, number) :: tuple
intersection_point(list, number, list, number) :: tuple
intersection_point(map, map, map, map) :: tuple
intersection_point(list, list, list, list) :: tuple

Finds intersection point from start points with given bearings. Return array with latitude and longitude. Raise an exception if no intersection point found.

Example

iex> berlin = [52.5075419, 13.4251364]
iex> berlin_bearing = -1.974
iex> london = [51.5286416, -0.1015987]
iex> london_bearing = 1.512
iex> Geocalc.intersection_point(berlin, berlin_bearing, london, london_bearing)
{:ok, [51.4757093398206, 9.75751801580032]}

Example

iex> berlin = [52.5075419, 13.4251364]
iex> london = [51.5286416, -0.1015987]
iex> paris = [48.8588589, 2.3475569]
iex> Geocalc.intersection_point(berlin, paris, london, paris)
{:ok, [48.858858899999994, 2.3475569000000003]}

Example

iex> berlin = %{lat: 52.5075419, lng: 13.4251364}
iex> bearing = Geocalc.degrees_to_radians(90.0)
iex> Geocalc.intersection_point(berlin, bearing, berlin, bearing)
{:error, "No intersection point found"}
radians_to_degrees(radians)

Specs

radians_to_degrees(number) :: number

Converts radians to degrees. Return degrees.