Source code for igclib.geography.geo

from igclib.constants import TOLERANCE
from igclib.geography import distance, heading
from shapely import geometry


[docs]class GeoPoint: """ GeoPoint """ def __init__(self, lat=None, lon=None, altitude=None, record=None, status=None): if record is not None: self.lat = record['lat'] self.lon = record['lon'] self.altitude = record['gps_alt'] self.status = status else: self.lat = lat self.lon = lon self.altitude = altitude self.goal_distance = None def close_enough(self, wpt): # TODO delete when proper task validation return abs(distance(self, wpt) - wpt.radius) < 10 + wpt.radius * TOLERANCE def __getitem__(self, key): if key == 0: return self.lat elif key == 1: return self.lon else: raise IndexError
[docs]class Turnpoint(GeoPoint): """ Turnpoint """ def __init__(self, lat, lon, radius=None, altitude=None, name=None, desc=None, role=None, first_tag=None): super().__init__(lat, lon, altitude) self.radius = radius self.name = name self.desc = desc self.role = role self.first_tag = first_tag def __contains__(self, point): return distance(self, point) < self.radius
[docs]class Arc: """ Arc """ def __init__(self, lat, lon, p1=None, p2=None, radius=None): self.lat = lat self.lon = lon if radius is not None: self.radius = radius self.start_angle = -180 self.end_angle = 180 else: # why these two distances are not necessary equal is a mystery self.radius = max(distance(self, p1), distance(self, p2)) p1_heading = heading(self, p1) p2_heading = heading(self, p2) self.start_angle = min(p1_heading, p2_heading) self.end_angle = max(p1_heading, p2_heading) def __contains__(self, point): return (distance(self, point) < self.radius) and (self.start_angle <= heading(self, point) <= self.end_angle) def __getitem__(self, key): if key == 0: return self.lat elif key == 1: return self.lon else: raise IndexError
[docs]class Opti: """ Opti """ def __init__(self, dist, legs, points, angles): self.distance = dist self.legs = legs self.points = points self._angles = angles
[docs]class Point(geometry.Point): def __getitem__(self, key): if key == 0: return self.x elif key == 1: return self.y else: raise IndexError def serialize(self): return {'lat': self.x, 'lon': self.y, 'altitude': self.z, 'agl': self.agl if hasattr(self, 'agl') else None}