aboutsummaryrefslogtreecommitdiff
path: root/src/stop_downloader/vigo
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2025-12-07 23:33:10 +0100
committerAriel Costas Guerrero <ariel@costas.dev>2025-12-07 23:37:38 +0100
commita1d589c1a0d5a5010e5fe4e8a1ec403ffafb289f (patch)
tree870366d9ce178530b836086e432331f78ec4a07e /src/stop_downloader/vigo
parent5fa8d1ffeb4a3a0c5c6846de3986ec779a4fe564 (diff)
Implement Renfe data source
Diffstat (limited to 'src/stop_downloader/vigo')
-rw-r--r--src/stop_downloader/vigo/download-stops.py92
-rw-r--r--src/stop_downloader/vigo/overrides/amenities.yaml12
-rw-r--r--src/stop_downloader/vigo/overrides/fix-gregorio-espino.yaml10
-rw-r--r--src/stop_downloader/vigo/overrides/hide-virtual-stops.yaml16
-rw-r--r--src/stop_downloader/vigo/overrides/improve-coordinates-misc.yaml19
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