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) return (np.rad2deg(bearing)) % 360.0