Source code for lories.location
# -*- coding: utf-8 -*-
"""
lories.core.location
~~~~~~~~~~~~~~~~~~~~
"""
from __future__ import annotations
from typing import Optional
import pytz as tz
from lories.core import ResourceError, ResourceUnavailableError # noqa
from lories.util import to_timezone
[docs]
class Location:
"""
Location objects are convenient containers for latitude, longitude,
timezone, and altitude data associated with a particular
geographic location.
Parameters
----------
latitude : float.
Positive is north of the equator.
Use decimal degrees notation.
longitude : float.
Positive is east of the prime meridian.
Use decimal degrees notation.
timezone : str or pytz.timezone, default is 'UTC'.
See
http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
for a list of valid time zones.
altitude : float, default 0.
Altitude from sea level in meters.
"""
TYPE = "location"
def __init__(
self,
latitude: float,
longitude: float,
timezone: str | tz.BaseTzInfo = tz.UTC,
altitude: Optional[float] = None,
country: Optional[str] = None,
state: Optional[str] = None,
) -> None:
self.latitude = latitude
self.longitude = longitude
self._timezone = to_timezone(timezone)
self._altitude = altitude
# TODO: deduct country, state and timezone from latitude and longitude
# with geopy and save to override config file
self.country = country
self.state = state
def __repr__(self):
attrs = ["latitude", "longitude", "altitude", "timezone"]
return f"{type(self).__name__}({', '.join(f'{attr}={str(getattr(self, attr))}' for attr in attrs)})"
def __str__(self):
attrs = ["latitude", "longitude", "altitude", "timezone"]
return f"{type(self).__name__}:\n" + "\n\t".join(f"{attr} = {str(getattr(self, attr))}" for attr in attrs)
@property
def timezone(self) -> tz.BaseTzInfo:
return self._timezone
@property
def altitude(self) -> float:
if self._altitude is None:
return 0.0
return self._altitude
[docs]
class LocationException(ResourceError):
"""
Raise if an error occurred accessing the location.
"""
[docs]
class LocationUnavailableException(ResourceUnavailableError, LocationException):
"""
Raise if a configured location access can not be found.
"""