diff options
| author | Ariel Costas Guerrero <ariel@costas.dev> | 2025-12-07 23:33:10 +0100 |
|---|---|---|
| committer | Ariel Costas Guerrero <ariel@costas.dev> | 2025-12-07 23:37:38 +0100 |
| commit | a1d589c1a0d5a5010e5fe4e8a1ec403ffafb289f (patch) | |
| tree | 870366d9ce178530b836086e432331f78ec4a07e /src/stop_downloader/vigo | |
| parent | 5fa8d1ffeb4a3a0c5c6846de3986ec779a4fe564 (diff) | |
Implement Renfe data source
Diffstat (limited to 'src/stop_downloader/vigo')
5 files changed, 112 insertions, 37 deletions
diff --git a/src/stop_downloader/vigo/download-stops.py b/src/stop_downloader/vigo/download-stops.py index 8771e53..eda5bde 100644 --- a/src/stop_downloader/vigo/download-stops.py +++ b/src/stop_downloader/vigo/download-stops.py @@ -4,6 +4,7 @@ # "PyYAML>=6.0.2", # For YAML support # ] # /// +import csv import json import os import sys @@ -13,6 +14,9 @@ import yaml # Add YAML support for overrides OVERRIDES_DIR = "overrides" OUTPUT_FILE = "../../frontend/public/stops/vigo.json" +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + + def load_stop_overrides(file_path): """Load stop overrides from a YAML file""" if not os.path.exists(file_path): @@ -22,12 +26,14 @@ def load_stop_overrides(file_path): try: with open(file_path, 'r', encoding='utf-8') as f: overrides = yaml.safe_load(f) - print(f"Loaded {len(overrides) if overrides else 0} stop overrides") + print( + f"Loaded {len(overrides) if overrides else 0} stop overrides") return overrides or {} except Exception as e: print(f"Error loading overrides: {e}", file=sys.stderr) return {} + def apply_overrides(stops, overrides): """Apply overrides to the stop data and add new stops""" # Track existing stop IDs @@ -118,10 +124,8 @@ def apply_overrides(stops, overrides): return stops -def main(): - print("Fetching stop list data...") - # Download stop list data +def download_stops_vitrasa() -> list[dict]: url = "https://datos.vigo.org/vci_api_app/api2.jsp?tipo=TRANSPORTE_PARADAS" req = urllib.request.Request(url) @@ -141,7 +145,7 @@ def main(): name = name.replace(" ", ", ").replace('"', '').replace("'", "") processed_stop = { - "stopId": stop.get("id"), + "stopId": "vitrasa:" + str(stop.get("id")), "name": { "original": name }, @@ -151,9 +155,69 @@ def main(): } processed_stops.append(processed_stop) + return processed_stops + except Exception as e: + print(f"Error processing vigo stops data: {e}", file=sys.stderr) + return [] + + +def download_stops_renfe() -> list[dict]: + url = "https://data.renfe.com/dataset/1146f3f1-e06d-477c-8f74-84f8d0668cf9/resource/b22cd560-3a2b-45dd-a25d-2406941f6fcc/download/listado_completo_av_ld_md.csv" + req = urllib.request.Request(url) + + # CÓDIGO;DESCRIPCION;LATITUD;LONGITUD;DIRECCIÓN;C.P.;POBLACION;PROVINCIA;PAIS + + try: + with urllib.request.urlopen(req) as response: + content = response.read() + data = csv.DictReader( + content.decode('utf-8').splitlines(), + delimiter=';', + fieldnames=["CODE", "NAME", "LAT", "LNG", + "ADDRESS", "ZIP", "CITY", "PROVINCE", "COUNTRY"] + ) + + stops = [row for row in data] + + print(f"Downloaded {len(stops)} stops") + + # Process the data + processed_stops = [] + for stop in stops: + if stop.get("PROVINCE") != "Pontevedra": + continue + + name = stop.get("NAME", "").strip() + + processed_stop = { + "stopId": "renfe:" + str(stop.get("CODE", 0)), + "name": { + "original": name + }, + "latitude": float(stop.get("LAT", 0).replace(',', '.')), + "longitude": float(stop.get("LNG", 0).replace(',', '.')), + "lines": [] + } + processed_stops.append(processed_stop) + + print(f"Processed {len(processed_stops)} Renfe stops in Pontevedra") + return processed_stops + except Exception as e: + print(f"Error processing Pontevedra stops data: {e}", file=sys.stderr) + return [] + + +def main(): + print("Fetching stop list data...") + + vigo_stops = download_stops_vitrasa() + renfe_stops = download_stops_renfe() + + all_stops = vigo_stops + (renfe_stops if renfe_stops else []) + + try: # Load and apply overrides - script_dir = os.path.dirname(os.path.abspath(__file__)) - overrides_dir = os.path.join(script_dir, OVERRIDES_DIR) + overrides_dir = os.path.join(SCRIPT_DIR, OVERRIDES_DIR) # For each YML/YAML file in the overrides directory, load and apply the overrides for filename in os.listdir(overrides_dir): if not filename.endswith(".yml") and not filename.endswith(".yaml"): @@ -162,16 +226,18 @@ def main(): print(f"Loading overrides from {filename}") overrides_file = os.path.join(overrides_dir, filename) overrides = load_stop_overrides(overrides_file) - processed_stops = apply_overrides(processed_stops, overrides) + all_stops = apply_overrides(all_stops, overrides) # Filter out hidden stops - visible_stops = [stop for stop in processed_stops if not stop.get("hide")] - print(f"Removed {len(processed_stops) - len(visible_stops)} hidden stops") + visible_stops = [ + stop for stop in all_stops if not stop.get("hide")] + print( + f"Removed {len(all_stops) - len(visible_stops)} hidden stops") # Sort stops by ID ascending visible_stops.sort(key=lambda x: x["stopId"]) - output_file = os.path.join(script_dir, OUTPUT_FILE) + output_file = os.path.join(SCRIPT_DIR, OUTPUT_FILE) with open(output_file, 'w', encoding='utf-8') as f: json.dump(visible_stops, f, ensure_ascii=False, indent=2) @@ -181,7 +247,11 @@ def main(): except Exception as e: print(f"Error processing stops data: {e}", file=sys.stderr) + # Print full exception traceback + import traceback + traceback.print_exc() return 1 + if __name__ == "__main__": sys.exit(main()) diff --git a/src/stop_downloader/vigo/overrides/amenities.yaml b/src/stop_downloader/vigo/overrides/amenities.yaml index fa2067a..014b235 100644 --- a/src/stop_downloader/vigo/overrides/amenities.yaml +++ b/src/stop_downloader/vigo/overrides/amenities.yaml @@ -1,23 +1,23 @@ -5520: # García Barbón, 7 +vitrasa:5520: # García Barbón, 7 amenities: - shelter - display -5530: # García Barbón, 18 +vitrasa:5530: # García Barbón, 18 amenities: - shelter - display -6620: #Policarpo Sanz, 40 +vitrasa:6620: #Policarpo Sanz, 40 amenities: - shelter - display -14264: # Urzáiz - Príncipe +vitrasa:14264: # Urzáiz - Príncipe amenities: - shelter - display -20193: # Policarpo Sanz, 25 +vitrasa:20193: # Policarpo Sanz, 25 amenities: - shelter - display -20198: # Policarpo Sanz, 26 +vitrasa:20198: # Policarpo Sanz, 26 amenities: - shelter diff --git a/src/stop_downloader/vigo/overrides/fix-gregorio-espino.yaml b/src/stop_downloader/vigo/overrides/fix-gregorio-espino.yaml index 2e035a2..849eea1 100644 --- a/src/stop_downloader/vigo/overrides/fix-gregorio-espino.yaml +++ b/src/stop_downloader/vigo/overrides/fix-gregorio-espino.yaml @@ -1,20 +1,20 @@ # Fix the position of the stops in Gregorio Espino, which are "opposite" to the actual location of the bus stops. -5720: # Gregorio Espino, 33 +vitrasa:5720: # Gregorio Espino, 33 location: latitude: 42.23004933454558 longitude: -8.706947409683313 -5710: # Gregorio Espino, 22 +vitrasa:5710: # Gregorio Espino, 22 location: latitude: 42.23003666347398 longitude: -8.707266671978003 -5730: # Gregorio Espino, 44 +vitrasa:5730: # Gregorio Espino, 44 location: latitude: 42.227850036119314 longitude: -8.708105429626789 -5740: # Gregorio Espino, 57 +vitrasa:5740: # Gregorio Espino, 57 location: latitude: 42.22783722597372 - longitude: -8.707849091551859
\ No newline at end of file + longitude: -8.707849091551859 diff --git a/src/stop_downloader/vigo/overrides/hide-virtual-stops.yaml b/src/stop_downloader/vigo/overrides/hide-virtual-stops.yaml index a2bf0b1..5978a35 100644 --- a/src/stop_downloader/vigo/overrides/hide-virtual-stops.yaml +++ b/src/stop_downloader/vigo/overrides/hide-virtual-stops.yaml @@ -1,17 +1,17 @@ # The Vitrasa network has several virtual stops created for internal purposes, like # end of certain lines with a "nice" name. -20223: # Castrelos (Pavillón) - Final U1 +vitrasa:20223: # Castrelos (Pavillón) - Final U1 hide: true -20146: # García Barbón 7 - final líneas A y 18A +vitrasa:20146: # García Barbón 7 - final líneas A y 18A hide: true -20220: # (Samil) COIA-SAMIL - Final L15A +vitrasa:20220: # (Samil) COIA-SAMIL - Final L15A hide: true -20001: # (Samil) Samil por Beiramar - Final L15B +vitrasa:20001: # (Samil) Samil por Beiramar - Final L15B hide: true -20002: # (Samil) Samil por Torrecedeira - Final L15C +vitrasa:20002: # (Samil) Samil por Torrecedeira - Final L15C hide: true -20144: # (Samil) Samil por Coia - Final C3D+C3i +vitrasa:20144: # (Samil) Samil por Coia - Final C3D+C3i + hide: true +vitrasa:20145: # (Samil) Samil por Bouzas - Final C3D+C3i hide: true -20145: # (Samil) Samil por Bouzas - Final C3D+C3i - hide: true
\ No newline at end of file diff --git a/src/stop_downloader/vigo/overrides/improve-coordinates-misc.yaml b/src/stop_downloader/vigo/overrides/improve-coordinates-misc.yaml index 922f103..a96c84b 100644 --- a/src/stop_downloader/vigo/overrides/improve-coordinates-misc.yaml +++ b/src/stop_downloader/vigo/overrides/improve-coordinates-misc.yaml @@ -1,35 +1,40 @@ # Improves coordinates for some locations in the dataset to be more accurate, and avoid clustering -6620: # Policarpo Sanz, 40 +vitrasa:6620: # Policarpo Sanz, 40 location: latitude: 42.23757846151978 longitude: -8.721031378896738 -20193: # Policarpo Sanz, 25 +vitrasa:20193: # Policarpo Sanz, 25 location: latitude: 42.23767601188501 longitude: -8.721582630122455 -3130: #Avda. de Cesáreo Vázquez 169 +vitrasa:3130: #Avda. de Cesáreo Vázquez 169 location: latitude: 42.191024803868736 longitude: -8.799397387002196 -3090: # Avda. de Cesáreo Vázquez 182 +vitrasa:3090: # Avda. de Cesáreo Vázquez 182 location: latitude: 42.191019711713736 longitude: -8.799628565094565 -14294: # Avda. de Ricardo Mella 406 +vitrasa:14294: # Avda. de Ricardo Mella 406 location: latitude: 42.190684424876565 longitude: -8.799308812770041 -3120: # Cesáreo Vázquez 141 +vitrasa:3120: # Cesáreo Vázquez 141 location: latitude: 42.187488521491225 longitude: -8.801226626055183 -3080: # Cesáreo Vázquez 136 +vitrasa:3080: # Cesáreo Vázquez 136 location: latitude: 42.1873653089623 longitude: -8.800886236766305 + +renfe:22308: # Vigo Guixar + location: + latitude: 42.2394426820947 + longitude: -8.712087821668435 |
