Source code for py1090.helpers

import math

EARTH_RADIUS = 6371008.7714 # m
r"""The average earth radius :math:`R_0`. It is defined as the mean radius of the semi-axes.
The values are taken from the WGS 84 (World Geodetic System 1984) ellipsoid
`(definition of the Department Of Defense, Jan. 2000, p. 37) <http://earth-info.nga.mil/GandG/publications/tr8350.2/wgs84fin.pdf>`_ .

.. math::

	R_0 = 6371008.7714 \mathrm{m}

"""

[docs]def distance_between(lat1, lon1, lat2, lon2): r"""Calculates the distance between two locations, in meters, using the `Haversine <http://en.wikipedia.org/wiki/Haversine_formula>`_ formula. The bearing between latitude, longitude: :math:`(\phi_1, \lambda_1)` and :math:`(\phi_2, \lambda_2)` is given by .. math:: a = \sin^2(\frac{\phi_2 - \phi_1}{2}) + \cos(\phi_1) \cos(\phi_2) \sin^2(\frac{\lambda_2 - \lambda_1}{2}) d = 2 R_0 \cdot \mathrm{atan2}(\sqrt{a}, \sqrt{1-a}) The earth radius :math:`R_0` is taken to be :py:data:`py1090.helpers.EARTH_RADIUS`. The approximation of a spherical earth is made. Args: lat1 (float): :math:`\phi_1`, the latitude of the reference location lon1 (float): :math:`\lambda_1`, the longitude of the reference location lat2 (float): :math:`\phi_2`, the latitude of the target location lon2 (float): :math:`\lambda_2`, the longitude of the target location Returns: float: the distance in meters. """ lambda1 = math.radians(lon1) lambda2 = math.radians(lon2) phi1 = math.radians(lat1) phi2 = math.radians(lat2) dphi = phi2-phi1 dlambda = lambda2-lambda1 a = math.pow(math.sin(dphi/2), 2) + math.cos(phi1)*math.cos(phi2)*math.pow(math.sin(dlambda/2), 2) dsigma = 2*math.atan2(math.sqrt(a), math.sqrt(1-a)) distance = EARTH_RADIUS * dsigma return distance
[docs]def bearing_between(lat1, lon1, lat2, lon2): r"""Calculates the bearing angle between two locations, in radians. The bearing between latitude, longitude: :math:`(\phi_1, \lambda_1)` and :math:`(\phi_2, \lambda_2)` is given by .. math:: \mathrm{atan2}(\sin(\lambda_2 - \lambda_1) \cos(\phi_1), \cos(\phi_2) \sin(\phi_1) - \sin(\phi_2) \cos(\phi_2) \cos(\lambda_2 - \lambda_1)) Args: lat1 (float): :math:`\phi_1`, the latitude of the reference location lon1 (float): :math:`\lambda_1`, the longitude of the reference location lat2 (float): :math:`\phi_2`, the latitude of the target location lon2 (float): :math:`\lambda_2`, the longitude of the target location Returns: float: the bearing angle in radians, between :math:`-\pi` and :math:`\pi`. """ lambda1 = math.radians(lon1) lambda2 = math.radians(lon2) phi1 = math.radians(lat1) phi2 = math.radians(lat2) dphi = phi2-phi1 dlambda = lambda2-lambda1 bearing = math.atan2(math.sin(dlambda)*math.cos(phi1), \ math.cos(phi2)*math.sin(phi1)-math.sin(phi2)*math.cos(phi1)*math.cos(dlambda)) return bearing
[docs]def knots_to_kmh(knots): """Converts velocity in knots to velocity in km/h. 1 knot is 1 nm/h (nautical mile per hour) and 1.852 km/h. Args: knots (float): velocity in knots Returns: float: velocity in km/h """ return 1.852*knots
[docs]def knots_to_mps(knots): """Converts velocity in knots to velocity in m/s (meters per second). 1 knot is 1 nm/h (nautical mile per hour), 1.852 km/h and about 6.67 m/s. Args: knots (float): velocity in knots Returns: float: velocity in m/s """ kmh = knots_to_kmh(knots) return 3.6*kmh