aboutsummaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
Diffstat (limited to 'data')
-rw-r--r--data/README.md83
-rw-r--r--data/santiago/download-stops.py66
-rw-r--r--data/vigo/download-stops.py66
-rw-r--r--data/vigo/overrides/example-new-stops.yaml31
4 files changed, 236 insertions, 10 deletions
diff --git a/data/README.md b/data/README.md
index 6aa2e10..2cf8151 100644
--- a/data/README.md
+++ b/data/README.md
@@ -1,8 +1,10 @@
-# Bus Stop Overrides
+# Bus Stop Overrides and Manual Stops
-This file defines custom overrides for specific bus stops in YAML format.
+This directory contains YAML files for overriding properties of existing bus stops and manually adding new stops.
-## Format
+## Overrides Format
+
+Overrides modify or extend properties of existing stops from the transit API.
```yaml
stopId: # Numeric ID of the stop to override
@@ -16,20 +18,56 @@ stopId: # Numeric ID of the stop to override
amenities: # List of amenities available at this stop (list)
- shelter
- display
+ cancelled: # Mark stop as cancelled/out of service (boolean)
+ title: # Alert title shown to users (string)
+ message: # Alert message shown to users (string)
+ alternateCodes: # Alternative stop codes (list of strings)
+ - "ALT-123"
+```
+
+## Adding New Stops
+
+New stops that don't exist in the transit API can be added directly in override files using the `new: true` parameter. The `new` parameter is automatically removed after the stop is added to the list.
+
+```yaml
+stopId: # Numeric ID for the new stop (must not conflict with existing stops)
+ new: true # Mark this as a new stop (required, will be removed after processing)
+ name: # Name of the stop (string)
+ location: # Location coordinates (required for new stops)
+ latitude: # Latitude coordinate (float)
+ longitude: # Longitude coordinate (float)
+ lines: # List of lines serving this stop (list of strings)
+ - "1"
+ - "2"
+ amenities: # Optional: List of amenities (list)
+ - shelter
+ title: # Optional: Alert title (string)
+ message: # Optional: Alert message (string)
+ cancelled: # Optional: Mark as cancelled (boolean)
+ alternateCodes: # Optional: Alternative stop codes (list)
```
## Field Descriptions
- **stopId** (integer): Unique identifier of the bus stop.
+- **new** (boolean): Set to `true` to add a new stop that doesn't exist in the API. This parameter is removed after processing.
+- **name** (string): Override or set the stop name.
- **alternateNames** (object): Other names used in different contexts.
- **key** (string): Name used in a specific context, such as `metro`.
- **location** (object):
- - **latitude** (float): Override latitude coordinate.
- - **longitude** (float): Override longitude coordinate.
+ - **latitude** (float): Override/set latitude coordinate.
+ - **longitude** (float): Override/set longitude coordinate.
+- **lines** (array of strings): List of line numbers serving this stop (required for new stops).
- **hide** (boolean): Set to `true` to exclude the stop from maps and listings.
-- **amenities** (array of strings): Amenities available at this stop, such as `shelter` or `display`. For now, only those two will be supported in the app.
+- **cancelled** (boolean): Set to `true` to mark the stop as cancelled or out of service.
+- **title** (string): Alert title displayed to users (e.g., "Stop Temporarily Closed").
+- **message** (string): Detailed message about the stop status or alert.
+- **alternateCodes** (array of strings): Alternative stop codes or identifiers.
+- **amenities** (array of strings): Amenities available at this stop, such as `shelter` or `display`.
+
+## Examples
-## Example
+### Override Example
```yaml
12345:
@@ -42,5 +80,34 @@ stopId: # Numeric ID of the stop to override
hide: false
amenities:
- shelter
- - real-time display
+ - display
+ title: "Stop Relocated"
+ message: "This stop has been temporarily moved 50 meters north."
+```
+
+### New Stop Example
+
+```yaml
+99999:
+ new: true
+ name: "New Development Stop"
+ location:
+ latitude: 42.229188
+ longitude: -8.722469
+ lines:
+ - "5"
+ - "12"
+ amenities:
+ - shelter
+```
+
+### Cancelled Stop Example
+
+```yaml
+54321:
+ cancelled: true
+ title: "Stop Out of Service"
+ message: "This stop is temporarily closed for construction. Use stop 54322 (100m south) instead."
+ alternateCodes:
+ - "54322"
```
diff --git a/data/santiago/download-stops.py b/data/santiago/download-stops.py
index f673be5..4900c41 100644
--- a/data/santiago/download-stops.py
+++ b/data/santiago/download-stops.py
@@ -29,12 +29,20 @@ def load_stop_overrides(file_path):
return {}
def apply_overrides(stops, overrides):
- """Apply overrides to the stop data"""
+ """Apply overrides to the stop data and add new stops"""
+ # Track existing stop IDs
+ existing_stop_ids = {stop.get("stopId") for stop in stops}
+
+ # Apply overrides to existing stops
for stop in stops:
stop_id = stop.get("stopId")
if stop_id in overrides:
override = overrides[stop_id]
+ # Override name if provided
+ if "name" in override:
+ stop["name"]["original"] = override["name"]
+
# Apply or add alternate names
if "alternateNames" in override:
for key, value in override["alternateNames"].items():
@@ -55,6 +63,62 @@ def apply_overrides(stops, overrides):
if "hide" in override:
stop["hide"] = override["hide"]
+ # Mark stop as cancelled
+ if "cancelled" in override:
+ stop["cancelled"] = override["cancelled"]
+
+ # Add alert title
+ if "title" in override:
+ stop["title"] = override["title"]
+
+ # Add alert message
+ if "message" in override:
+ stop["message"] = override["message"]
+
+ # Add alternate codes
+ if "alternateCodes" in override:
+ stop["alternateCodes"] = override["alternateCodes"]
+
+ # Add new stops (those with "new: true" parameter)
+ new_stops_added = 0
+ for stop_id, override in overrides.items():
+ # Check if this is a new stop
+ if override.get("new") and stop_id not in existing_stop_ids:
+ # Ensure stop_id is an integer for consistency
+ stop_id_int = int(stop_id) if isinstance(stop_id, str) else stop_id
+
+ # Create the new stop
+ new_stop = {
+ "stopId": stop_id_int,
+ "name": {
+ "original": override.get("name", f"Stop {stop_id_int}")
+ },
+ "latitude": override.get("location", {}).get("latitude"),
+ "longitude": override.get("location", {}).get("longitude"),
+ "lines": override.get("lines", [])
+ }
+
+ # Add optional fields (excluding the 'new' parameter)
+ if "alternateNames" in override:
+ for key, value in override["alternateNames"].items():
+ new_stop["name"][key] = value
+ if "amenities" in override:
+ new_stop["amenities"] = override["amenities"]
+ if "cancelled" in override:
+ new_stop["cancelled"] = override["cancelled"]
+ if "title" in override:
+ new_stop["title"] = override["title"]
+ if "message" in override:
+ new_stop["message"] = override["message"]
+ if "alternateCodes" in override:
+ new_stop["alternateCodes"] = override["alternateCodes"]
+
+ stops.append(new_stop)
+ new_stops_added += 1
+
+ if new_stops_added > 0:
+ print(f"Added {new_stops_added} new stops from overrides")
+
return stops
def main():
diff --git a/data/vigo/download-stops.py b/data/vigo/download-stops.py
index a57d30f..f332f5b 100644
--- a/data/vigo/download-stops.py
+++ b/data/vigo/download-stops.py
@@ -29,12 +29,20 @@ def load_stop_overrides(file_path):
return {}
def apply_overrides(stops, overrides):
- """Apply overrides to the stop data"""
+ """Apply overrides to the stop data and add new stops"""
+ # Track existing stop IDs
+ existing_stop_ids = {stop.get("stopId") for stop in stops}
+
+ # Apply overrides to existing stops
for stop in stops:
stop_id = stop.get("stopId")
if stop_id in overrides:
override = overrides[stop_id]
+ # Override name if provided
+ if "name" in override:
+ stop["name"]["original"] = override["name"]
+
# Apply or add alternate names
if "alternateNames" in override:
for key, value in override["alternateNames"].items():
@@ -55,6 +63,62 @@ def apply_overrides(stops, overrides):
if "hide" in override:
stop["hide"] = override["hide"]
+ # Mark stop as cancelled
+ if "cancelled" in override:
+ stop["cancelled"] = override["cancelled"]
+
+ # Add alert title
+ if "title" in override:
+ stop["title"] = override["title"]
+
+ # Add alert message
+ if "message" in override:
+ stop["message"] = override["message"]
+
+ # Add alternate codes
+ if "alternateCodes" in override:
+ stop["alternateCodes"] = override["alternateCodes"]
+
+ # Add new stops (those with "new: true" parameter)
+ new_stops_added = 0
+ for stop_id, override in overrides.items():
+ # Check if this is a new stop
+ if override.get("new") and stop_id not in existing_stop_ids:
+ # Ensure stop_id is an integer for consistency
+ stop_id_int = int(stop_id) if isinstance(stop_id, str) else stop_id
+
+ # Create the new stop
+ new_stop = {
+ "stopId": stop_id_int,
+ "name": {
+ "original": override.get("name", f"Stop {stop_id_int}")
+ },
+ "latitude": override.get("location", {}).get("latitude"),
+ "longitude": override.get("location", {}).get("longitude"),
+ "lines": override.get("lines", [])
+ }
+
+ # Add optional fields (excluding the 'new' parameter)
+ if "alternateNames" in override:
+ for key, value in override["alternateNames"].items():
+ new_stop["name"][key] = value
+ if "amenities" in override:
+ new_stop["amenities"] = override["amenities"]
+ if "cancelled" in override:
+ new_stop["cancelled"] = override["cancelled"]
+ if "title" in override:
+ new_stop["title"] = override["title"]
+ if "message" in override:
+ new_stop["message"] = override["message"]
+ if "alternateCodes" in override:
+ new_stop["alternateCodes"] = override["alternateCodes"]
+
+ stops.append(new_stop)
+ new_stops_added += 1
+
+ if new_stops_added > 0:
+ print(f"Added {new_stops_added} new stops from overrides")
+
return stops
def main():
diff --git a/data/vigo/overrides/example-new-stops.yaml b/data/vigo/overrides/example-new-stops.yaml
new file mode 100644
index 0000000..6937471
--- /dev/null
+++ b/data/vigo/overrides/example-new-stops.yaml
@@ -0,0 +1,31 @@
+# Example: Adding a new stop using the 'new' parameter
+# New stops are added directly in override files with new: true
+
+# Example 1: New stop with basic information (commented out to avoid affecting production)
+# 99001:
+# new: true
+# name: "New Development Stop"
+# location:
+# latitude: 42.229188
+# longitude: -8.722469
+# lines:
+# - "5"
+# - "12"
+# amenities:
+# - shelter
+
+# Example 2: New stop with alert information
+# 99002:
+# new: true
+# name: "Temporary Event Stop"
+# location:
+# latitude: 42.230000
+# longitude: -8.723000
+# lines:
+# - "EVENT"
+# title: "Special Event Stop"
+# message: "This stop is active during special events only."
+
+# Note: The 'new: true' parameter tells the system to create a new stop.
+# This parameter is automatically removed after the stop is added to the dataset.
+# Choose stop IDs in the 90000+ range to avoid conflicts with existing stops.