class Planner(object): """Class that joins route, weather and time The class produces a tables with time, location and local weather at this time (historical or forecast) """ def __init__(self, route_file, darksky_apikey): """Initialise class :route_path: path to a gpx file containing the route :darksky_apikey: key to the darksky api """ self.route = Route(route_file) self.historical_weather = Historical_Weather( coordinates=self.route.get_short_coordinates(), darksky_apikey=darksky_apikey, filename=self._get_historical_weather_filename(route_file)) self.weather_forecast = Forecast_Weather( coordinates=self.route.get_short_coordinates(), darksky_apikey=darksky_apikey) def _get_historical_weather_filename(self, filename): """Add and change extension of the route filename :filename: filename """ filename, file_extension = os.path.splitext(filename) return filename + "_weather.db" def get_plan(self, plan_type, **kwargs): """Return a plan object that can iterate through historically computed plans and get a plan using the current forecast. For example, to iterate through historical plans ``` plan = planner.get_plan(...) for plan in planner.historical_plans(): # compute something for the plan plan.plan() returns the plan for current forecast ``` :plan_type: either of the strings 'with_constant_speed', 'with_wind', 'with_wind_and_elevation', 'with_elevation' :starting_time: departure hour (all plans) :speed: constant speed along the journey (constant speed plan) :P_rider: power of the rider (in Watts) (wind/elevation plans) :K: constant K describing cross-sectional area and drag coefficient (in Ns^2/m^2) (wind/elevation plans) """ if "with_constant_power" == plan_type: return Plan_With_Constant_Power( starting_time=kwargs["starting_time"], route=self.route, historical_weather=self.historical_weather, weather_forecast=self.weather_forecast, **kwargs)