85 lines
1.9 KiB
Python
85 lines
1.9 KiB
Python
|
"""Distance util functions."""
|
||
|
|
||
|
import logging
|
||
|
from numbers import Number
|
||
|
|
||
|
_LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
KILOMETERS_SYMBOL = 'km'
|
||
|
METERS_SYMBOL = 'm'
|
||
|
FEET_SYMBOL = 'ft'
|
||
|
MILES_SYMBOL = 'mi'
|
||
|
|
||
|
VALID_UNITS = [
|
||
|
KILOMETERS_SYMBOL,
|
||
|
METERS_SYMBOL,
|
||
|
FEET_SYMBOL,
|
||
|
MILES_SYMBOL,
|
||
|
]
|
||
|
|
||
|
|
||
|
def convert(value, unit_1, unit_2):
|
||
|
"""Convert one unit of measurement to another."""
|
||
|
if not isinstance(value, Number):
|
||
|
raise TypeError(str(value) + ' is not of numeric type')
|
||
|
|
||
|
if unit_1 == unit_2:
|
||
|
return value
|
||
|
|
||
|
if unit_1 not in VALID_UNITS:
|
||
|
_LOGGER.error('Unknown unit of measure: ' + str(unit_1))
|
||
|
raise ValueError('Unknown unit of measure: ' + str(unit_1))
|
||
|
elif unit_2 not in VALID_UNITS:
|
||
|
_LOGGER.error('Unknown unit of measure: ' + str(unit_2))
|
||
|
raise ValueError('Unknown unit of measure: ' + str(unit_2))
|
||
|
|
||
|
meters = value
|
||
|
|
||
|
if unit_1 == MILES_SYMBOL:
|
||
|
meters = __miles_to_meters(value)
|
||
|
elif unit_1 == FEET_SYMBOL:
|
||
|
meters = __feet_to_meters(value)
|
||
|
elif unit_1 == KILOMETERS_SYMBOL:
|
||
|
meters = __kilometers_to_meters(value)
|
||
|
|
||
|
result = meters
|
||
|
|
||
|
if unit_2 == MILES_SYMBOL:
|
||
|
result = __meters_to_miles(meters)
|
||
|
elif unit_2 == FEET_SYMBOL:
|
||
|
result = __meters_to_feet(meters)
|
||
|
elif unit_2 == KILOMETERS_SYMBOL:
|
||
|
result = __meters_to_kilometers(meters)
|
||
|
|
||
|
return result
|
||
|
|
||
|
|
||
|
def __miles_to_meters(miles):
|
||
|
"""Convert miles to meters."""
|
||
|
return miles * 1609.344
|
||
|
|
||
|
|
||
|
def __feet_to_meters(feet):
|
||
|
"""Convert feet to meters."""
|
||
|
return feet * 0.3048
|
||
|
|
||
|
|
||
|
def __kilometers_to_meters(kilometers):
|
||
|
"""Convert kilometers to meters."""
|
||
|
return kilometers * 1000
|
||
|
|
||
|
|
||
|
def __meters_to_miles(meters):
|
||
|
"""Convert meters to miles."""
|
||
|
return meters * 0.000621371
|
||
|
|
||
|
|
||
|
def __meters_to_feet(meters):
|
||
|
"""Convert meters to feet."""
|
||
|
return meters * 3.28084
|
||
|
|
||
|
|
||
|
def __meters_to_kilometers(meters):
|
||
|
"""Convert meters to kilometers."""
|
||
|
return meters * 0.001
|