diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2021-07-04 19:58:23 +0200 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2021-07-04 19:58:23 +0200 | 
| commit | 8f688c51a07bc79d62ecee416bdfdcbabc14e262 (patch) | |
| tree | 93eb29f3085754eb1f6507b8835efa12f8ea1788 /bin | |
| parent | 71e128041c83d9f26bcd7212088e6b50b0ec8319 (diff) | |
Use transport-apis repo to determine EFA endpoints for departure details
Diffstat (limited to 'bin')
| -rwxr-xr-x | bin/nvm | 41 | 
1 files changed, 40 insertions, 1 deletions
@@ -14,8 +14,10 @@ import dateutil.parser  from jinja2 import Environment, FileSystemLoader, select_autoescape +import geojson  import json  import os +import shapely.geometry  headers = {      "Access-Control-Allow-Origin": "*", @@ -30,6 +32,31 @@ ajax_headers = {  db_rest_api = os.getenv("NVM_DB_REST_API", "https://v5.db.transport.rest")  env = Environment(loader=FileSystemLoader("templates"), autoescape=select_autoescape()) +apis = None + + +class TransportAPIs: +    def __init__(self): +        self.apis = list() +        base = "ext/transport-apis/data/de" +        for filename in os.listdir(base): +            with open(f"{base}/{filename}", "r") as f: +                data = json.load(f) +            if data["type"].get("efa", False): +                try: +                    area = data["coverage"]["realtimeCoverage"]["area"] +                except KeyError: +                    continue +                # surely there must be a more elegant way to load a JSON sub-dict as GeoJSON +                area = geojson.loads(json.dumps(area)) +                self.apis.append((data["options"], shapely.geometry.shape(area))) + +    def get_efa(self, location): +        location = shapely.geometry.Point(*location) +        for api, area in self.apis: +            if area.contains(location): +                return api +        return None  class Departure: @@ -42,11 +69,18 @@ class Departure:          self.classes = str()          self.station_name = None -        self.stop_name = None          self.stop_name = obj.get("stop", dict()).get("name", None)          self.station_name = obj.get("station", dict()).get("name", self.stop_name) +        try: +            self.location = ( +                obj["stop"]["location"]["longitude"], +                obj["stop"]["location"]["latitude"], +            ) +        except KeyError: +            self.location = None +          if "," in self.direction:              self.direction, self.suffix = self.direction.split(",", maxsplit=1)          else: @@ -126,6 +160,9 @@ async def show_departure_board(request):      departures = list(map(Departure, departures)) +    if len(departures): +        efa_endpoint = apis.get_efa(departures[0].location) +      station_name_freq = dict()      now = datetime.now().timestamp()      for departure in departures: @@ -190,6 +227,8 @@ if __name__ == "__main__":      parser.add_argument("--prefix", type=str, metavar="PATH", default="/")      args = parser.parse_args() +    apis = TransportAPIs() +      app = web.Application()      app.router.add_get(args.prefix, show_landing_page)      app.router.add_get(f"{args.prefix}board/{{eva}}", show_departure_board)  | 
