"""Landesgrenze der Schweiz (aus OpenStreetMap, auf ~400 m vereinfacht, mit den Exklaven Büsingen und Campione als Löcher). Damit zeigt jeder Fahrplan seine Züge nur im eigenen Land, sonst wären grenzüberschreitende Züge doppelt auf der Karte.""" import json from pathlib import Path _B = json.loads((Path(__file__).with_name("ch_border.json")).read_text()) _BBOX = (min(x for x, _ in _B["outer"]), min(y for _, y in _B["outer"]), max(x for x, _ in _B["outer"]), max(y for _, y in _B["outer"])) def _in_ring(x: float, y: float, ring) -> bool: inside = False for (x1, y1), (x2, y2) in zip(ring, ring[1:] + ring[:1]): if (y1 > y) != (y2 > y) and x < (x2 - x1) * (y - y1) / (y2 - y1) + x1: inside = not inside return inside def in_switzerland(lon: float, lat: float) -> bool: if not (_BBOX[0] <= lon <= _BBOX[2] and _BBOX[1] <= lat <= _BBOX[3]): return False return _in_ring(lon, lat, _B["outer"]) and not any(_in_ring(lon, lat, h) for h in _B["holes"]) # Welche Züge ein Fahrplan zeigen darf, wenn mehrere Quellen aktiv sind SHOW = {"ch": in_switzerland, "de": lambda lon, lat: not in_switzerland(lon, lat)}