1"""``geopy.units`` module provides utility functions for performing
2angle and distance unit conversions.
3
4Some shortly named aliases are provided for convenience (e.g.
5:func:`.km` is an alias for :func:`.kilometers`).
6"""
7
8import math
9
10# Angles
11
12
13def degrees(radians=0, arcminutes=0, arcseconds=0):
14    """
15    Convert angle to degrees.
16    """
17    deg = 0.
18    if radians:
19        deg = math.degrees(radians)
20    if arcminutes:
21        deg += arcminutes / arcmin(degrees=1.)
22    if arcseconds:
23        deg += arcseconds / arcsec(degrees=1.)
24    return deg
25
26
27def radians(degrees=0, arcminutes=0, arcseconds=0):
28    """
29    Convert angle to radians.
30    """
31    if arcminutes:
32        degrees += arcminutes / arcmin(degrees=1.)
33    if arcseconds:
34        degrees += arcseconds / arcsec(degrees=1.)
35    return math.radians(degrees)
36
37
38def arcminutes(degrees=0, radians=0, arcseconds=0):
39    """
40    Convert angle to arcminutes.
41    """
42    if radians:
43        degrees += math.degrees(radians)
44    if arcseconds:
45        degrees += arcseconds / arcsec(degrees=1.)
46    return degrees * 60.
47
48
49def arcseconds(degrees=0, radians=0, arcminutes=0):
50    """
51    Convert angle to arcseconds.
52    """
53    if radians:
54        degrees += math.degrees(radians)
55    if arcminutes:
56        degrees += arcminutes / arcmin(degrees=1.)
57    return degrees * 3600.
58
59
60# Lengths
61
62def kilometers(meters=0, miles=0, feet=0, nautical=0):
63    """
64    Convert distance to kilometers.
65    """
66    ret = 0.
67    if meters:
68        ret += meters / 1000.
69    if feet:
70        ret += feet / ft(1.)
71    if nautical:
72        ret += nautical / nm(1.)
73    ret += miles * 1.609344
74    return ret
75
76
77def meters(kilometers=0, miles=0, feet=0, nautical=0):
78    """
79    Convert distance to meters.
80    """
81    return (kilometers + km(nautical=nautical, miles=miles, feet=feet)) * 1000
82
83
84def miles(kilometers=0, meters=0, feet=0, nautical=0):
85    """
86    Convert distance to miles.
87    """
88    ret = 0.
89    if nautical:
90        kilometers += nautical / nm(1.)
91    if feet:
92        kilometers += feet / ft(1.)
93    if meters:
94        kilometers += meters / 1000.
95    ret += kilometers / 1.609344
96    return ret
97
98
99def feet(kilometers=0, meters=0, miles=0, nautical=0):
100    """
101    Convert distance to feet.
102    """
103    ret = 0.
104    if nautical:
105        kilometers += nautical / nm(1.)
106    if meters:
107        kilometers += meters / 1000.
108    if kilometers:
109        miles += mi(kilometers=kilometers)
110    ret += miles * 5280
111    return ret
112
113
114def nautical(kilometers=0, meters=0, miles=0, feet=0):
115    """
116    Convert distance to nautical miles.
117    """
118    ret = 0.
119    if feet:
120        kilometers += feet / ft(1.)
121    if miles:
122        kilometers += km(miles=miles)
123    if meters:
124        kilometers += meters / 1000.
125    ret += kilometers / 1.852
126    return ret
127
128
129# Compatible names
130
131rad = radians
132arcmin = arcminutes
133arcsec = arcseconds
134km = kilometers
135m = meters
136mi = miles
137ft = feet
138nm = nautical
139