# Source code for ptrail.utilities.DistanceCalculator

```"""
DistanceCalculator module contains various types of distance formulas that can be used to calculate
distance between 2 points on the surface of earth depending on the CRS being used.

| Authors: Salman Haidri, Yaksh J Haranwala
"""

import numpy as np

from ptrail.utilities import constants as const

np.seterr(invalid='ignore')

[docs]class FormulaLog:
[docs]    @staticmethod
def haversine_distance(lat1, lon1, lat2, lon2):
"""
The haversine formula calculates the great-circle distance between 2 points.
The great-circle distance is the shortest distance over the earth's surface.

Parameters
----------
lat1: float
The latitude value of point 1.
lon1: float
The longitude value of point 1.
lat2: float
The latitude value of point 2.
lon2: float
The longitude value of point 2.

Returns
-------
float
The great-circle distance between the 2 points.
"""
lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])
val_one = (np.sin((lat2 - lat1) / 2.0) ** 2 + np.cos(lat1) * np.cos(lat2) * np.sin((lon2 - lon1) / 2.0) ** 2)

crow_distance = 2 * np.arctan2(val_one ** 0.5, (1 - val_one) ** 0.5)

return (const.RADIUS_OF_EARTH * crow_distance) * 1000

[docs]    @staticmethod
def bearing_calculation(lat1, lon1, lat2, lon2):
"""
Calculates bearing between 2 points. Bearing can be defined as direction or
an angle, between the north-south line of earth or meridian and the line connecting
the target and the reference point.

Parameters
----------
lat1:
The latitude value of point 1.
lon1:
The longitude value of point 1.
lat2:
The latitude value of point 2.
lon2:
The longitude value of point 2.

Returns
-------
float
Bearing between 2 points
"""
lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])

y = np.cos(lat2) * np.sin(lon2 - lon1)
x = np.cos(lat1) * np.sin(lat2) - np.sin(lat1) * np.cos(lat2) * np.cos(lon2 - lon1)

bearing = np.arctan2(y, x)