- mehrere Quellen (ch, de) mit je eigenem Fahrplan und Echtzeit-Feed - OSM CH+DE, mit osmium auf Schienennetz gefiltert, für pfaedle - Landesgrenze CH gegen doppelte grenzüberschreitende Züge - Import robust gegen andere Spaltenreihenfolge (gtfs.de) - Kacheln für CH+DE (Zoom 14) Noch nicht vollständig getestet (pfaedle auf Deutschland läuft). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X48pE4bzjHej8w9HyZXCjb
28 lines
1.1 KiB
Python
28 lines
1.1 KiB
Python
"""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)}
|