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 | |
| parent | 5fa8d1ffeb4a3a0c5c6846de3986ec779a4fe564 (diff) | |
Implement Renfe data source
Diffstat (limited to 'src')
25 files changed, 7408 insertions, 6849 deletions
diff --git a/src/Costasdev.Busurbano.Backend/Configuration/AppConfiguration.cs b/src/Costasdev.Busurbano.Backend/Configuration/AppConfiguration.cs index 9fa5e75..49c001f 100644 --- a/src/Costasdev.Busurbano.Backend/Configuration/AppConfiguration.cs +++ b/src/Costasdev.Busurbano.Backend/Configuration/AppConfiguration.cs @@ -2,5 +2,6 @@ namespace Costasdev.Busurbano.Backend.Configuration; public class AppConfiguration { - public required string ScheduleBasePath { get; set; } + public required string VitrasaScheduleBasePath { get; set; } + public required string RenfeScheduleBasePath { get; set; } } diff --git a/src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs b/src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs index 3bb9930..d006e38 100644 --- a/src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs +++ b/src/Costasdev.Busurbano.Backend/Controllers/VigoController.Legacy.cs @@ -53,7 +53,7 @@ public partial class VigoController : ControllerBase try { - var file = Path.Combine(_configuration.ScheduleBasePath, effectiveDate, stopId + ".json"); + var file = Path.Combine(_configuration.VitrasaScheduleBasePath, effectiveDate, stopId + ".json"); if (!SysFile.Exists(file)) { throw new FileNotFoundException(); diff --git a/src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs b/src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs index 288cc98..642cccb 100644 --- a/src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs +++ b/src/Costasdev.Busurbano.Backend/Controllers/VigoController.cs @@ -1,13 +1,9 @@ -using System.Globalization; -using System.Text; using Costasdev.Busurbano.Backend.Configuration; using Costasdev.Busurbano.Backend.Services; -using Costasdev.Busurbano.Backend.Types; +using Costasdev.Busurbano.Backend.Services.Providers; using Costasdev.VigoTransitApi; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; -using static Costasdev.Busurbano.Backend.Types.StopArrivals.Types; -using SysFile = System.IO.File; namespace Costasdev.Busurbano.Backend.Controllers; @@ -19,13 +15,23 @@ public partial class VigoController : ControllerBase private readonly VigoTransitApiClient _api; private readonly AppConfiguration _configuration; private readonly ShapeTraversalService _shapeService; + private readonly VitrasaTransitProvider _vitrasaProvider; + private readonly RenfeTransitProvider _renfeProvider; - public VigoController(HttpClient http, IOptions<AppConfiguration> options, ILogger<VigoController> logger, ShapeTraversalService shapeService) + public VigoController( + HttpClient http, + IOptions<AppConfiguration> options, + ILogger<VigoController> logger, + ShapeTraversalService shapeService, + VitrasaTransitProvider vitrasaProvider, + RenfeTransitProvider renfeProvider) { _logger = logger; _api = new VigoTransitApiClient(http); _configuration = options.Value; _shapeService = shapeService; + _vitrasaProvider = vitrasaProvider; + _renfeProvider = renfeProvider; } [HttpGet("GetShape")] @@ -108,355 +114,34 @@ public partial class VigoController : ControllerBase [HttpGet("GetConsolidatedCirculations")] public async Task<IActionResult> GetConsolidatedCirculations( - [FromQuery] int stopId + [FromQuery] string stopId ) { // Use Europe/Madrid timezone consistently to avoid UTC/local skew var tz = TimeZoneInfo.FindSystemTimeZoneById("Europe/Madrid"); var nowLocal = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz); - var realtimeTask = _api.GetStopEstimates(stopId); - var todayDate = nowLocal.Date.ToString("yyyy-MM-dd"); + ITransitProvider provider; + string effectiveStopId; - // Load both today's and tomorrow's schedules to handle night services - var timetableTask = LoadStopArrivalsProto(stopId.ToString(), todayDate); - - // Wait for real-time data and today's schedule (required) - await Task.WhenAll(realtimeTask, timetableTask); - - var realTimeEstimates = realtimeTask.Result.Estimates; - - // Handle case where schedule file doesn't exist - return realtime-only data - if (timetableTask.Result == null) - { - _logger.LogWarning("No schedule data available for stop {StopId} on {Date}, returning realtime-only data", stopId, todayDate); - - var realtimeOnlyCirculations = realTimeEstimates.Select(estimate => new ConsolidatedCirculation - { - Line = estimate.Line, - Route = estimate.Route, - Schedule = null, - RealTime = new RealTimeData - { - Minutes = estimate.Minutes, - Distance = estimate.Meters - } - }).OrderBy(c => c.RealTime!.Minutes).ToList(); - - return Ok(realtimeOnlyCirculations); - } - - var timetable = timetableTask.Result.Arrivals - .Where(c => c.StartingDateTime(nowLocal.Date) != null && c.CallingDateTime(nowLocal.Date) != null) - .ToList(); - - var stopLocation = timetableTask.Result.Location; - - var now = nowLocal.AddSeconds(60 - nowLocal.Second); - // Define the scope end as the time of the last realtime arrival (no extra buffer) - var scopeEnd = realTimeEstimates.Count > 0 - ? now.AddMinutes(Math.Min(realTimeEstimates.Max(e => e.Minutes) + 5, 75)) - : now.AddMinutes(60); // If no estimates, show next hour of scheduled only - - List<ConsolidatedCirculation> consolidatedCirculations = []; - var usedTripIds = new HashSet<string>(); - - foreach (var estimate in realTimeEstimates) - { - var estimatedArrivalTime = now.AddMinutes(estimate.Minutes); - - var possibleCirculations = timetable - .Where(c => - { - // Match by line number - if (c.Line.Trim() != estimate.Line.Trim()) - return false; - - // Match by route (destination) - compare with both Route field and Terminus stop name - // Normalize both sides: remove non-ASCII-alnum characters and lowercase - var estimateRoute = NormalizeRouteName(estimate.Route); - var scheduleRoute = NormalizeRouteName(c.Route); - var scheduleTerminus = NormalizeRouteName(c.TerminusName); - - return scheduleRoute == estimateRoute || scheduleTerminus == estimateRoute; - }) - .OrderBy(c => c.CallingDateTime(nowLocal.Date)!.Value) - .ToArray(); - - ScheduledArrival? closestCirculation = null; - - // Matching strategy: - // 1) Filter trips that are not "too early" (TimeDiff <= 7). - // TimeDiff = Schedule - Realtime. - // If TimeDiff > 7, bus is > 7 mins early. Reject. - // 2) From the valid trips, pick the one with smallest Abs(TimeDiff). - // This handles "as late as it gets" (large negative TimeDiff) by preferring smaller delays if available, - // but accepting large delays if that's the only option (and better than an invalid early trip). - const int maxEarlyArrivalMinutes = 7; - - var bestMatch = possibleCirculations - .Select(c => new - { - Circulation = c, - TimeDiff = (c.CallingDateTime(nowLocal.Date)!.Value - estimatedArrivalTime).TotalMinutes - }) - .Where(x => x.TimeDiff <= maxEarlyArrivalMinutes) - .OrderBy(x => Math.Abs(x.TimeDiff)) - .FirstOrDefault(); - - if (bestMatch != null) - { - closestCirculation = bestMatch.Circulation; - } - - if (closestCirculation == null) - { - // No scheduled match: include realtime-only entry - _logger.LogWarning("No schedule match for realtime line {Line} towards {Route} in {Minutes} minutes (tried matching {NormalizedRoute})", estimate.Line, estimate.Route, estimate.Minutes, NormalizeRouteName(estimate.Route)); - consolidatedCirculations.Add(new ConsolidatedCirculation - { - Line = estimate.Line, - Route = estimate.Route, - Schedule = null, - RealTime = new RealTimeData - { - Minutes = estimate.Minutes, - Distance = estimate.Meters - } - }); - - continue; - } - - // Ensure each scheduled trip is only matched once to a realtime estimate - if (usedTripIds.Contains(closestCirculation.TripId)) - { - _logger.LogInformation("Skipping duplicate realtime match for TripId {TripId}", closestCirculation.TripId); - continue; - } - - var isRunning = closestCirculation.StartingDateTime(nowLocal.Date)!.Value <= now; - Position? currentPosition = null; - int? stopShapeIndex = null; - bool usePreviousShape = false; - - // Calculate bus position for realtime trips - if (!string.IsNullOrEmpty(closestCirculation.ShapeId)) - { - // Check if we are likely on the previous trip - // If the bus is further away than the distance from the start of the trip to the stop, - // it implies the bus is on the previous trip (or earlier). - double distOnPrevTrip = estimate.Meters - closestCirculation.ShapeDistTraveled; - usePreviousShape = !isRunning && - !string.IsNullOrEmpty(closestCirculation.PreviousTripShapeId) && - distOnPrevTrip > 0; - - if (usePreviousShape) - { - var prevShape = await _shapeService.LoadShapeAsync(closestCirculation.PreviousTripShapeId); - if (prevShape != null && prevShape.Points.Count > 0) - { - // The bus is on the previous trip. - // We treat the end of the previous shape as the "stop" for the purpose of calculation. - // The distance to traverse backwards from the end of the previous shape is 'distOnPrevTrip'. - var lastPoint = prevShape.Points[prevShape.Points.Count - 1]; - var result = _shapeService.GetBusPosition(prevShape, lastPoint, (int)distOnPrevTrip); - currentPosition = result.BusPosition; - stopShapeIndex = result.StopIndex; - } - } - else - { - // Normal case: bus is on the current trip shape - var shape = await _shapeService.LoadShapeAsync(closestCirculation.ShapeId); - if (shape != null && stopLocation != null) - { - var result = _shapeService.GetBusPosition(shape, stopLocation, estimate.Meters); - currentPosition = result.BusPosition; - stopShapeIndex = result.StopIndex; - } - } - } - - consolidatedCirculations.Add(new ConsolidatedCirculation - { - Line = estimate.Line, - Route = estimate.Route == closestCirculation.TerminusName ? closestCirculation.Route : estimate.Route, - NextStreets = [.. closestCirculation.NextStreets], - Schedule = new ScheduleData - { - Running = isRunning, - Minutes = (int)(closestCirculation.CallingDateTime(nowLocal.Date)!.Value - now).TotalMinutes, - TripId = closestCirculation.TripId, - ServiceId = closestCirculation.ServiceId, - ShapeId = closestCirculation.ShapeId, - }, - RealTime = new RealTimeData - { - Minutes = estimate.Minutes, - Distance = estimate.Meters - }, - CurrentPosition = currentPosition, - StopShapeIndex = stopShapeIndex, - IsPreviousTrip = usePreviousShape, - PreviousTripShapeId = usePreviousShape ? closestCirculation.PreviousTripShapeId : null - }); - - usedTripIds.Add(closestCirculation.TripId); - } - - // Add scheduled-only circulations between now and the last realtime arrival - if (scopeEnd > now) - { - var matchedTripIds = new HashSet<string>(usedTripIds); - - var scheduledWindow = timetable - .Where(c => c.CallingDateTime(nowLocal.Date)!.Value >= now && c.CallingDateTime(nowLocal.Date)!.Value <= scopeEnd) - .OrderBy(c => c.CallingDateTime(nowLocal.Date)!.Value); - - foreach (var sched in scheduledWindow) - { - if (matchedTripIds.Contains(sched.TripId)) - { - continue; // already represented via a matched realtime - } - - var minutes = (int)(sched.CallingDateTime(nowLocal.Date)!.Value - now).TotalMinutes; - if (minutes == 0) - { - continue; - } - - consolidatedCirculations.Add(new ConsolidatedCirculation - { - Line = sched.Line, - Route = sched.Route, - Schedule = new ScheduleData - { - Running = sched.StartingDateTime(nowLocal.Date)!.Value <= now, - Minutes = minutes, - TripId = sched.TripId, - ServiceId = sched.ServiceId, - ShapeId = sched.ShapeId, - }, - RealTime = null - }); - } - } - - // Sort by ETA (RealTime minutes if present; otherwise Schedule minutes) - var sorted = consolidatedCirculations - .OrderBy(c => c.RealTime?.Minutes ?? c.Schedule!.Minutes) - .Select(LineFormatterService.Format) - .ToList(); - - return Ok(sorted); - } - - private async Task<StopArrivals?> LoadStopArrivalsProto(string stopId, string dateString) - { - var file = Path.Combine(_configuration.ScheduleBasePath, dateString, stopId + ".pb"); - if (!SysFile.Exists(file)) - { - _logger.LogWarning("Stop arrivals proto file not found: {File}", file); - return null; - } - - var contents = await SysFile.ReadAllBytesAsync(file); - var stopArrivals = StopArrivals.Parser.ParseFrom(contents); - return stopArrivals; - } - - private async Task<Shape> LoadShapeProto(string shapeId) - { - var file = Path.Combine(_configuration.ScheduleBasePath, shapeId + ".pb"); - if (!SysFile.Exists(file)) - { - throw new FileNotFoundException(); - } - - var contents = await SysFile.ReadAllBytesAsync(file); - var shape = Shape.Parser.ParseFrom(contents); - return shape; - } - - private static string NormalizeRouteName(string route) - { - var normalized = route.Trim().ToLowerInvariant(); - // Remove diacritics/accents first, then filter to alphanumeric - normalized = RemoveDiacritics(normalized); - return new string(normalized.Where(char.IsLetterOrDigit).ToArray()); - } - - private static string RemoveDiacritics(string text) - { - var normalizedString = text.Normalize(NormalizationForm.FormD); - var stringBuilder = new StringBuilder(); - - foreach (var c in normalizedString) + if (stopId.StartsWith("renfe:")) { - var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); - if (unicodeCategory != UnicodeCategory.NonSpacingMark) - { - stringBuilder.Append(c); - } + provider = _renfeProvider; + effectiveStopId = stopId.Substring("renfe:".Length); } - - return stringBuilder.ToString().Normalize(NormalizationForm.FormC); - } -} - -public static class StopScheduleExtensions -{ - public static DateTime? StartingDateTime(this ScheduledArrival stop, DateTime baseDate) - { - return ParseGtfsTime(stop.StartingTime, baseDate); - } - - public static DateTime? CallingDateTime(this ScheduledArrival stop, DateTime baseDate) - { - return ParseGtfsTime(stop.CallingTime, baseDate); - } - - /// <summary> - /// Parse GTFS time format (HH:MM:SS) which can have hours >= 24 for services past midnight - /// </summary> - private static DateTime? ParseGtfsTime(string timeStr, DateTime baseDate) - { - if (string.IsNullOrWhiteSpace(timeStr)) - { - return null; - } - - var parts = timeStr.Split(':'); - if (parts.Length != 3) + else if (stopId.StartsWith("vitrasa:")) { - return null; + provider = _vitrasaProvider; + effectiveStopId = stopId.Substring("vitrasa:".Length); } - - if (!int.TryParse(parts[0], out var hours) || - !int.TryParse(parts[1], out var minutes) || - !int.TryParse(parts[2], out var seconds)) + else { - return null; + // Legacy/Default + provider = _vitrasaProvider; + effectiveStopId = stopId; } - // Handle GTFS times that exceed 24 hours (e.g., 25:30:00 for 1:30 AM next day) - var days = hours / 24; - var normalizedHours = hours % 24; - - try - { - var dt = baseDate - .AddDays(days) - .AddHours(normalizedHours) - .AddMinutes(minutes) - .AddSeconds(seconds); - return dt.AddSeconds(60 - dt.Second); - } - catch - { - return null; - } + var result = await provider.GetCirculationsAsync(effectiveStopId, nowLocal); + return Ok(result); } } diff --git a/src/Costasdev.Busurbano.Backend/Extensions/StopScheduleExtensions.cs b/src/Costasdev.Busurbano.Backend/Extensions/StopScheduleExtensions.cs new file mode 100644 index 0000000..b435158 --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Extensions/StopScheduleExtensions.cs @@ -0,0 +1,58 @@ +using static Costasdev.Busurbano.Backend.Types.StopArrivals.Types; + +namespace Costasdev.Busurbano.Backend.Extensions; + +public static class StopScheduleExtensions +{ + public static DateTime? StartingDateTime(this ScheduledArrival stop, DateTime baseDate) + { + return ParseGtfsTime(stop.StartingTime, baseDate); + } + + public static DateTime? CallingDateTime(this ScheduledArrival stop, DateTime baseDate) + { + return ParseGtfsTime(stop.CallingTime, baseDate); + } + + /// <summary> + /// Parse GTFS time format (HH:MM:SS) which can have hours >= 24 for services past midnight + /// </summary> + private static DateTime? ParseGtfsTime(string timeStr, DateTime baseDate) + { + if (string.IsNullOrWhiteSpace(timeStr)) + { + return null; + } + + var parts = timeStr.Split(':'); + if (parts.Length != 3) + { + return null; + } + + if (!int.TryParse(parts[0], out var hours) || + !int.TryParse(parts[1], out var minutes) || + !int.TryParse(parts[2], out var seconds)) + { + return null; + } + + // Handle GTFS times that exceed 24 hours (e.g., 25:30:00 for 1:30 AM next day) + var days = hours / 24; + var normalizedHours = hours % 24; + + try + { + var dt = baseDate + .AddDays(days) + .AddHours(normalizedHours) + .AddMinutes(minutes) + .AddSeconds(seconds); + return dt.AddSeconds(60 - dt.Second); + } + catch + { + return null; + } + } +} diff --git a/src/Costasdev.Busurbano.Backend/Program.cs b/src/Costasdev.Busurbano.Backend/Program.cs index 46f2595..959e114 100644 --- a/src/Costasdev.Busurbano.Backend/Program.cs +++ b/src/Costasdev.Busurbano.Backend/Program.cs @@ -1,5 +1,6 @@ using Costasdev.Busurbano.Backend.Configuration; using Costasdev.Busurbano.Backend.Services; +using Costasdev.Busurbano.Backend.Services.Providers; var builder = WebApplication.CreateBuilder(args); @@ -10,6 +11,9 @@ builder.Services.AddHttpClient(); builder.Services.AddMemoryCache(); builder.Services.AddSingleton<ShapeTraversalService>(); +builder.Services.AddScoped<VitrasaTransitProvider>(); +builder.Services.AddScoped<RenfeTransitProvider>(); + var app = builder.Build(); app.MapControllers(); diff --git a/src/Costasdev.Busurbano.Backend/Services/Providers/ITransitProvider.cs b/src/Costasdev.Busurbano.Backend/Services/Providers/ITransitProvider.cs new file mode 100644 index 0000000..f0440e4 --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Services/Providers/ITransitProvider.cs @@ -0,0 +1,8 @@ +using Costasdev.Busurbano.Backend.Types; + +namespace Costasdev.Busurbano.Backend.Services.Providers; + +public interface ITransitProvider +{ + Task<List<ConsolidatedCirculation>> GetCirculationsAsync(string stopId, DateTime now); +} diff --git a/src/Costasdev.Busurbano.Backend/Services/Providers/RenfeTransitProvider.cs b/src/Costasdev.Busurbano.Backend/Services/Providers/RenfeTransitProvider.cs new file mode 100644 index 0000000..55e880f --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Services/Providers/RenfeTransitProvider.cs @@ -0,0 +1,76 @@ +using Costasdev.Busurbano.Backend.Configuration; +using Costasdev.Busurbano.Backend.Extensions; +using Costasdev.Busurbano.Backend.Types; +using Microsoft.Extensions.Options; +using SysFile = System.IO.File; + +namespace Costasdev.Busurbano.Backend.Services.Providers; + +public class RenfeTransitProvider : ITransitProvider +{ + private readonly AppConfiguration _configuration; + private readonly ILogger<RenfeTransitProvider> _logger; + + public RenfeTransitProvider(IOptions<AppConfiguration> options, ILogger<RenfeTransitProvider> logger) + { + _configuration = options.Value; + _logger = logger; + } + + public async Task<List<ConsolidatedCirculation>> GetCirculationsAsync(string stopId, DateTime nowLocal) + { + var todayDate = nowLocal.Date.ToString("yyyy-MM-dd"); + var stopArrivals = await LoadStopArrivalsProto(stopId, todayDate); + + if (stopArrivals == null) + { + return []; + } + + var now = nowLocal.AddSeconds(60 - nowLocal.Second); + var scopeEnd = now.AddMinutes(300); + + var scheduledWindow = stopArrivals.Arrivals + .Where(c => c.CallingDateTime(nowLocal.Date) != null) + .Where(c => c.CallingDateTime(nowLocal.Date)!.Value >= now && c.CallingDateTime(nowLocal.Date)!.Value <= scopeEnd) + .OrderBy(c => c.CallingDateTime(nowLocal.Date)!.Value); + + var consolidatedCirculations = new List<ConsolidatedCirculation>(); + + foreach (var sched in scheduledWindow) + { + var minutes = (int)(sched.CallingDateTime(nowLocal.Date)!.Value - now).TotalMinutes; + + consolidatedCirculations.Add(new ConsolidatedCirculation + { + Line = sched.Line, + Route = sched.Route, + Schedule = new ScheduleData + { + Running = sched.StartingDateTime(nowLocal.Date)!.Value <= now, + Minutes = minutes, + TripId = sched.TripId, + ServiceId = sched.ServiceId, + ShapeId = sched.ShapeId, + }, + RealTime = null + }); + } + + return consolidatedCirculations; + } + + private async Task<StopArrivals?> LoadStopArrivalsProto(string stopId, string dateString) + { + var file = Path.Combine(_configuration.RenfeScheduleBasePath, dateString, stopId + ".pb"); + if (!SysFile.Exists(file)) + { + _logger.LogWarning("Stop arrivals proto file not found: {File}", file); + return null; + } + + var contents = await SysFile.ReadAllBytesAsync(file); + var stopArrivals = StopArrivals.Parser.ParseFrom(contents); + return stopArrivals; + } +} diff --git a/src/Costasdev.Busurbano.Backend/Services/Providers/VitrasaTransitProvider.cs b/src/Costasdev.Busurbano.Backend/Services/Providers/VitrasaTransitProvider.cs new file mode 100644 index 0000000..079d510 --- /dev/null +++ b/src/Costasdev.Busurbano.Backend/Services/Providers/VitrasaTransitProvider.cs @@ -0,0 +1,304 @@ +using System.Globalization; +using System.Text; +using Costasdev.Busurbano.Backend.Configuration; +using Costasdev.Busurbano.Backend.Extensions; +using Costasdev.Busurbano.Backend.Types; +using Costasdev.VigoTransitApi; +using Microsoft.Extensions.Options; +using static Costasdev.Busurbano.Backend.Types.StopArrivals.Types; +using SysFile = System.IO.File; + +namespace Costasdev.Busurbano.Backend.Services.Providers; + +public class VitrasaTransitProvider : ITransitProvider +{ + private readonly VigoTransitApiClient _api; + private readonly AppConfiguration _configuration; + private readonly ShapeTraversalService _shapeService; + private readonly ILogger<VitrasaTransitProvider> _logger; + + public VitrasaTransitProvider(HttpClient http, IOptions<AppConfiguration> options, ShapeTraversalService shapeService, ILogger<VitrasaTransitProvider> logger) + { + _api = new VigoTransitApiClient(http); + _configuration = options.Value; + _shapeService = shapeService; + _logger = logger; + } + + public async Task<List<ConsolidatedCirculation>> GetCirculationsAsync(string stopId, DateTime nowLocal) + { + // Vitrasa stop IDs are integers, but we receive string "vitrasa:1234" or just "1234" if legacy + // The caller (Controller) should probably strip the prefix, but let's handle it here just in case or assume it's stripped. + // The user said: "Routing the request to one or tthe other will just work with the prefix. For example calling `/api/GetConsolidatedCirculations?stopId=vitrasa:1400` will call the vitrasa driver with stop 1400." + // So I should expect the ID part only here? Or the full ID? + // Usually providers take the ID they understand. I'll assume the controller strips the prefix. + + if (!int.TryParse(stopId, out var numericStopId)) + { + _logger.LogError("Invalid Vitrasa stop ID: {StopId}", stopId); + return []; + } + + var realtimeTask = _api.GetStopEstimates(numericStopId); + var todayDate = nowLocal.Date.ToString("yyyy-MM-dd"); + + // Load both today's and tomorrow's schedules to handle night services + var timetableTask = LoadStopArrivalsProto(stopId, todayDate); + + // Wait for real-time data and today's schedule (required) + await Task.WhenAll(realtimeTask, timetableTask); + + var realTimeEstimates = realtimeTask.Result.Estimates; + + // Handle case where schedule file doesn't exist - return realtime-only data + if (timetableTask.Result == null) + { + _logger.LogWarning("No schedule data available for stop {StopId} on {Date}, returning realtime-only data", stopId, todayDate); + + var realtimeOnlyCirculations = realTimeEstimates.Select(estimate => new ConsolidatedCirculation + { + Line = estimate.Line, + Route = estimate.Route, + Schedule = null, + RealTime = new RealTimeData + { + Minutes = estimate.Minutes, + Distance = estimate.Meters + } + }).OrderBy(c => c.RealTime!.Minutes).ToList(); + + return realtimeOnlyCirculations; + } + + var timetable = timetableTask.Result.Arrivals + .Where(c => c.StartingDateTime(nowLocal.Date) != null && c.CallingDateTime(nowLocal.Date) != null) + .ToList(); + + var stopLocation = timetableTask.Result.Location; + + var now = nowLocal.AddSeconds(60 - nowLocal.Second); + // Define the scope end as the time of the last realtime arrival (no extra buffer) + var scopeEnd = realTimeEstimates.Count > 0 + ? now.AddMinutes(Math.Min(realTimeEstimates.Max(e => e.Minutes) + 5, 75)) + : now.AddMinutes(60); // If no estimates, show next hour of scheduled only + + List<ConsolidatedCirculation> consolidatedCirculations = []; + var usedTripIds = new HashSet<string>(); + + foreach (var estimate in realTimeEstimates) + { + var estimatedArrivalTime = now.AddMinutes(estimate.Minutes); + + var possibleCirculations = timetable + .Where(c => + { + // Match by line number + if (c.Line.Trim() != estimate.Line.Trim()) + return false; + + // Match by route (destination) - compare with both Route field and Terminus stop name + // Normalize both sides: remove non-ASCII-alnum characters and lowercase + var estimateRoute = NormalizeRouteName(estimate.Route); + var scheduleRoute = NormalizeRouteName(c.Route); + var scheduleTerminus = NormalizeRouteName(c.TerminusName); + + return scheduleRoute == estimateRoute || scheduleTerminus == estimateRoute; + }) + .OrderBy(c => c.CallingDateTime(nowLocal.Date)!.Value) + .ToArray(); + + ScheduledArrival? closestCirculation = null; + + const int maxEarlyArrivalMinutes = 7; + + var bestMatch = possibleCirculations + .Select(c => new + { + Circulation = c, + TimeDiff = (c.CallingDateTime(nowLocal.Date)!.Value - estimatedArrivalTime).TotalMinutes + }) + .Where(x => x.TimeDiff <= maxEarlyArrivalMinutes) + .OrderBy(x => Math.Abs(x.TimeDiff)) + .FirstOrDefault(); + + if (bestMatch != null) + { + closestCirculation = bestMatch.Circulation; + } + + if (closestCirculation == null) + { + // No scheduled match: include realtime-only entry + _logger.LogWarning("No schedule match for realtime line {Line} towards {Route} in {Minutes} minutes (tried matching {NormalizedRoute})", estimate.Line, estimate.Route, estimate.Minutes, NormalizeRouteName(estimate.Route)); + consolidatedCirculations.Add(new ConsolidatedCirculation + { + Line = estimate.Line, + Route = estimate.Route, + Schedule = null, + RealTime = new RealTimeData + { + Minutes = estimate.Minutes, + Distance = estimate.Meters + } + }); + + continue; + } + + // Ensure each scheduled trip is only matched once to a realtime estimate + if (usedTripIds.Contains(closestCirculation.TripId)) + { + _logger.LogInformation("Skipping duplicate realtime match for TripId {TripId}", closestCirculation.TripId); + continue; + } + + var isRunning = closestCirculation.StartingDateTime(nowLocal.Date)!.Value <= now; + Position? currentPosition = null; + int? stopShapeIndex = null; + bool usePreviousShape = false; + + // Calculate bus position for realtime trips + if (!string.IsNullOrEmpty(closestCirculation.ShapeId)) + { + double distOnPrevTrip = estimate.Meters - closestCirculation.ShapeDistTraveled; + usePreviousShape = !isRunning && + !string.IsNullOrEmpty(closestCirculation.PreviousTripShapeId) && + distOnPrevTrip > 0; + + if (usePreviousShape) + { + var prevShape = await _shapeService.LoadShapeAsync(closestCirculation.PreviousTripShapeId); + if (prevShape != null && prevShape.Points.Count > 0) + { + var lastPoint = prevShape.Points[prevShape.Points.Count - 1]; + var result = _shapeService.GetBusPosition(prevShape, lastPoint, (int)distOnPrevTrip); + currentPosition = result.BusPosition; + stopShapeIndex = result.StopIndex; + } + } + else + { + var shape = await _shapeService.LoadShapeAsync(closestCirculation.ShapeId); + if (shape != null && stopLocation != null) + { + var result = _shapeService.GetBusPosition(shape, stopLocation, estimate.Meters); + currentPosition = result.BusPosition; + stopShapeIndex = result.StopIndex; + } + } + } + + consolidatedCirculations.Add(new ConsolidatedCirculation + { + Line = estimate.Line, + Route = estimate.Route == closestCirculation.TerminusName ? closestCirculation.Route : estimate.Route, + NextStreets = [.. closestCirculation.NextStreets], + Schedule = new ScheduleData + { + Running = isRunning, + Minutes = (int)(closestCirculation.CallingDateTime(nowLocal.Date)!.Value - now).TotalMinutes, + TripId = closestCirculation.TripId, + ServiceId = closestCirculation.ServiceId, + ShapeId = closestCirculation.ShapeId, + }, + RealTime = new RealTimeData + { + Minutes = estimate.Minutes, + Distance = estimate.Meters + }, + CurrentPosition = currentPosition, + StopShapeIndex = stopShapeIndex, + IsPreviousTrip = usePreviousShape, + PreviousTripShapeId = usePreviousShape ? closestCirculation.PreviousTripShapeId : null + }); + + usedTripIds.Add(closestCirculation.TripId); + } + + // Add scheduled-only circulations between now and the last realtime arrival + if (scopeEnd > now) + { + var matchedTripIds = new HashSet<string>(usedTripIds); + + var scheduledWindow = timetable + .Where(c => c.CallingDateTime(nowLocal.Date)!.Value >= now && c.CallingDateTime(nowLocal.Date)!.Value <= scopeEnd) + .OrderBy(c => c.CallingDateTime(nowLocal.Date)!.Value); + + foreach (var sched in scheduledWindow) + { + if (matchedTripIds.Contains(sched.TripId)) + { + continue; // already represented via a matched realtime + } + + var minutes = (int)(sched.CallingDateTime(nowLocal.Date)!.Value - now).TotalMinutes; + if (minutes == 0) + { + continue; + } + + consolidatedCirculations.Add(new ConsolidatedCirculation + { + Line = sched.Line, + Route = sched.Route, + Schedule = new ScheduleData + { + Running = sched.StartingDateTime(nowLocal.Date)!.Value <= now, + Minutes = minutes, + TripId = sched.TripId, + ServiceId = sched.ServiceId, + ShapeId = sched.ShapeId, + }, + RealTime = null + }); + } + } + + // Sort by ETA (RealTime minutes if present; otherwise Schedule minutes) + var sorted = consolidatedCirculations + .OrderBy(c => c.RealTime?.Minutes ?? c.Schedule!.Minutes) + .Select(LineFormatterService.Format) + .ToList(); + + return sorted; + } + + private async Task<StopArrivals?> LoadStopArrivalsProto(string stopId, string dateString) + { + var file = Path.Combine(_configuration.VitrasaScheduleBasePath, dateString, stopId + ".pb"); + if (!SysFile.Exists(file)) + { + _logger.LogWarning("Stop arrivals proto file not found: {File}", file); + return null; + } + + var contents = await SysFile.ReadAllBytesAsync(file); + var stopArrivals = StopArrivals.Parser.ParseFrom(contents); + return stopArrivals; + } + + private static string NormalizeRouteName(string route) + { + var normalized = route.Trim().ToLowerInvariant(); + // Remove diacritics/accents first, then filter to alphanumeric + normalized = RemoveDiacritics(normalized); + return new string(normalized.Where(char.IsLetterOrDigit).ToArray()); + } + + private static string RemoveDiacritics(string text) + { + var normalizedString = text.Normalize(NormalizationForm.FormD); + var stringBuilder = new StringBuilder(); + + foreach (var c in normalizedString) + { + var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); + if (unicodeCategory != UnicodeCategory.NonSpacingMark) + { + stringBuilder.Append(c); + } + } + + return stringBuilder.ToString().Normalize(NormalizationForm.FormC); + } +} diff --git a/src/Costasdev.Busurbano.Backend/Services/ShapeTraversalService.cs b/src/Costasdev.Busurbano.Backend/Services/ShapeTraversalService.cs index 928c173..63f4a2e 100644 --- a/src/Costasdev.Busurbano.Backend/Services/ShapeTraversalService.cs +++ b/src/Costasdev.Busurbano.Backend/Services/ShapeTraversalService.cs @@ -40,7 +40,7 @@ public class ShapeTraversalService /// </summary> public async Task<Shape?> LoadShapeAsync(string shapeId) { - var file = Path.Combine(_configuration.ScheduleBasePath, "shapes", shapeId + ".pb"); + var file = Path.Combine(_configuration.VitrasaScheduleBasePath, "shapes", shapeId + ".pb"); if (!SysFile.Exists(file)) { _logger.LogWarning("Shape file not found: {ShapeId}", shapeId); diff --git a/src/frontend/app/components/StopItemSkeleton.tsx b/src/frontend/app/components/StopItemSkeleton.tsx index 68172fd..778b5e1 100644 --- a/src/frontend/app/components/StopItemSkeleton.tsx +++ b/src/frontend/app/components/StopItemSkeleton.tsx @@ -4,7 +4,7 @@ import "react-loading-skeleton/dist/skeleton.css"; interface StopItemSkeletonProps { showId?: boolean; - stopId?: number; + stopId?: string; } const StopItemSkeleton: React.FC<StopItemSkeletonProps> = ({ diff --git a/src/frontend/app/components/StopSummarySheet.tsx b/src/frontend/app/components/StopSummarySheet.tsx index 17c0afd..e85dda3 100644 --- a/src/frontend/app/components/StopSummarySheet.tsx +++ b/src/frontend/app/components/StopSummarySheet.tsx @@ -26,7 +26,7 @@ interface ErrorInfo { } const loadConsolidatedData = async ( - stopId: number + stopId: string ): Promise<ConsolidatedCirculation[]> => { const resp = await fetch( `${REGION_DATA.consolidatedCirculationsEndpoint}?stopId=${stopId}`, diff --git a/src/frontend/app/data/StopDataProvider.ts b/src/frontend/app/data/StopDataProvider.ts index abe7123..920c7e1 100644 --- a/src/frontend/app/data/StopDataProvider.ts +++ b/src/frontend/app/data/StopDataProvider.ts @@ -11,7 +11,8 @@ export type StopName = { }; export interface Stop { - stopId: number; + stopId: string; + type?: 'bus' | 'train'; name: StopName; latitude?: number; longitude?: number; @@ -27,29 +28,46 @@ export interface Stop { // In-memory cache and lookup map per region const cachedStopsByRegion: Record<string, Stop[] | null> = {}; -const stopsMapByRegion: Record<string, Record<number, Stop>> = {}; +const stopsMapByRegion: Record<string, Record<string, Stop>> = {}; // Custom names loaded from localStorage per region -const customNamesByRegion: Record<string, Record<number, string>> = {}; +const customNamesByRegion: Record<string, Record<string, string>> = {}; + +// Helper to normalize ID +function normalizeId(id: number | string): string { + const s = String(id); + if (s.includes(':')) return s; + return `vitrasa:${s}`; +} // Initialize cachedStops and customNames once per region async function initStops() { if (!cachedStopsByRegion[REGION_DATA.id]) { const response = await fetch(REGION_DATA.stopsEndpoint); - const stops = (await response.json()) as Stop[]; + const rawStops = (await response.json()) as any[]; + // build array and map stopsMapByRegion[REGION_DATA.id] = {}; - cachedStopsByRegion[REGION_DATA.id] = stops.map((stop) => { - const entry = { ...stop, favourite: false } as Stop; - stopsMapByRegion[REGION_DATA.id][stop.stopId] = entry; + cachedStopsByRegion[REGION_DATA.id] = rawStops.map((raw) => { + const id = normalizeId(raw.stopId); + const entry = { + ...raw, + stopId: id, + type: raw.type || (id.startsWith('renfe:') ? 'train' : 'bus'), + favourite: false + } as Stop; + stopsMapByRegion[REGION_DATA.id][id] = entry; return entry; }); + // load custom names const rawCustom = localStorage.getItem(`customStopNames_${REGION_DATA.id}`); if (rawCustom) { - customNamesByRegion[REGION_DATA.id] = JSON.parse(rawCustom) as Record< - number, - string - >; + const parsed = JSON.parse(rawCustom); + const normalized: Record<string, string> = {}; + for (const [key, value] of Object.entries(parsed)) { + normalized[normalizeId(key)] = value as string; + } + customNamesByRegion[REGION_DATA.id] = normalized; } else { customNamesByRegion[REGION_DATA.id] = {}; } @@ -60,7 +78,8 @@ async function getStops(): Promise<Stop[]> { await initStops(); // update favourites const rawFav = localStorage.getItem("favouriteStops_vigo"); - const favouriteStops = rawFav ? (JSON.parse(rawFav) as number[]) : []; + const favouriteStops = rawFav ? (JSON.parse(rawFav) as (number|string)[]).map(normalizeId) : []; + cachedStopsByRegion["vigo"]!.forEach( (stop) => (stop.favourite = favouriteStops.includes(stop.stopId)) ); @@ -69,14 +88,15 @@ async function getStops(): Promise<Stop[]> { // New: get single stop by id async function getStopById( - stopId: number + stopId: string | number ): Promise<Stop | undefined> { await initStops(); - const stop = stopsMapByRegion[REGION_DATA.id]?.[stopId]; + const id = normalizeId(stopId); + const stop = stopsMapByRegion[REGION_DATA.id]?.[id]; if (stop) { const rawFav = localStorage.getItem(`favouriteStops_${REGION_DATA.id}`); - const favouriteStops = rawFav ? (JSON.parse(rawFav) as number[]) : []; - stop.favourite = favouriteStops.includes(stopId); + const favouriteStops = rawFav ? (JSON.parse(rawFav) as (number|string)[]).map(normalizeId) : []; + stop.favourite = favouriteStops.includes(id); } return stop; } @@ -90,20 +110,22 @@ function getDisplayName(stop: Stop): string { } // New: set or remove custom names -function setCustomName(stopId: number, label: string) { +function setCustomName(stopId: string | number, label: string) { + const id = normalizeId(stopId); if (!customNamesByRegion[REGION_DATA.id]) { customNamesByRegion[REGION_DATA.id] = {}; } - customNamesByRegion[REGION_DATA.id][stopId] = label; + customNamesByRegion[REGION_DATA.id][id] = label; localStorage.setItem( `customStopNames_${REGION_DATA.id}`, JSON.stringify(customNamesByRegion[REGION_DATA.id]) ); } -function removeCustomName(stopId: number) { - if (customNamesByRegion[REGION_DATA.id]?.[stopId]) { - delete customNamesByRegion[REGION_DATA.id][stopId]; +function removeCustomName(stopId: string | number) { + const id = normalizeId(stopId); + if (customNamesByRegion[REGION_DATA.id]?.[id]) { + delete customNamesByRegion[REGION_DATA.id][id]; localStorage.setItem( `customStopNames_${REGION_DATA.id}`, JSON.stringify(customNamesByRegion[REGION_DATA.id]) @@ -112,19 +134,21 @@ function removeCustomName(stopId: number) { } // New: get custom label for a stop -function getCustomName(stopId: number): string | undefined { - return customNamesByRegion[REGION_DATA.id]?.[stopId]; +function getCustomName(stopId: string | number): string | undefined { + const id = normalizeId(stopId); + return customNamesByRegion[REGION_DATA.id]?.[id]; } -function addFavourite(stopId: number) { +function addFavourite(stopId: string | number) { + const id = normalizeId(stopId); const rawFavouriteStops = localStorage.getItem(`favouriteStops_vigo`); - let favouriteStops: number[] = []; + let favouriteStops: string[] = []; if (rawFavouriteStops) { - favouriteStops = JSON.parse(rawFavouriteStops) as number[]; + favouriteStops = (JSON.parse(rawFavouriteStops) as (number|string)[]).map(normalizeId); } - if (!favouriteStops.includes(stopId)) { - favouriteStops.push(stopId); + if (!favouriteStops.includes(id)) { + favouriteStops.push(id); localStorage.setItem( `favouriteStops_vigo`, JSON.stringify(favouriteStops) @@ -132,42 +156,45 @@ function addFavourite(stopId: number) { } } -function removeFavourite(stopId: number) { +function removeFavourite(stopId: string | number) { + const id = normalizeId(stopId); const rawFavouriteStops = localStorage.getItem(`favouriteStops_vigo`); - let favouriteStops: number[] = []; + let favouriteStops: string[] = []; if (rawFavouriteStops) { - favouriteStops = JSON.parse(rawFavouriteStops) as number[]; + favouriteStops = (JSON.parse(rawFavouriteStops) as (number|string)[]).map(normalizeId); } - const newFavouriteStops = favouriteStops.filter((id) => id !== stopId); + const newFavouriteStops = favouriteStops.filter((sid) => sid !== id); localStorage.setItem( `favouriteStops_vigo`, JSON.stringify(newFavouriteStops) ); } -function isFavourite(stopId: number): boolean { +function isFavourite(stopId: string | number): boolean { + const id = normalizeId(stopId); const rawFavouriteStops = localStorage.getItem(`favouriteStops_vigo`); if (rawFavouriteStops) { - const favouriteStops = JSON.parse(rawFavouriteStops) as number[]; - return favouriteStops.includes(stopId); + const favouriteStops = (JSON.parse(rawFavouriteStops) as (number|string)[]).map(normalizeId); + return favouriteStops.includes(id); } return false; } const RECENT_STOPS_LIMIT = 10; -function pushRecent(stopId: number) { +function pushRecent(stopId: string | number) { + const id = normalizeId(stopId); const rawRecentStops = localStorage.getItem(`recentStops_vigo`); - let recentStops: Set<number> = new Set(); + let recentStops: Set<string> = new Set(); if (rawRecentStops) { - recentStops = new Set(JSON.parse(rawRecentStops) as number[]); + recentStops = new Set((JSON.parse(rawRecentStops) as (number|string)[]).map(normalizeId)); } - recentStops.add(stopId); + recentStops.add(id); if (recentStops.size > RECENT_STOPS_LIMIT) { const iterator = recentStops.values(); - const val = iterator.next().value as number; + const val = iterator.next().value as string; recentStops.delete(val); } @@ -177,18 +204,18 @@ function pushRecent(stopId: number) { ); } -function getRecent(): number[] { +function getRecent(): string[] { const rawRecentStops = localStorage.getItem(`recentStops_vigo`); if (rawRecentStops) { - return JSON.parse(rawRecentStops) as number[]; + return (JSON.parse(rawRecentStops) as (number|string)[]).map(normalizeId); } return []; } -function getFavouriteIds(): number[] { +function getFavouriteIds(): string[] { const rawFavouriteStops = localStorage.getItem(`favouriteStops_vigo`); if (rawFavouriteStops) { - return JSON.parse(rawFavouriteStops) as number[]; + return (JSON.parse(rawFavouriteStops) as (number|string)[]).map(normalizeId); } return []; } @@ -196,8 +223,16 @@ function getFavouriteIds(): number[] { // New function to load stops from network async function loadStopsFromNetwork(): Promise<Stop[]> { const response = await fetch(REGION_DATA.stopsEndpoint); - const stops = (await response.json()) as Stop[]; - return stops.map((stop) => ({ ...stop, favourite: false }) as Stop); + const rawStops = (await response.json()) as any[]; + return rawStops.map((raw) => { + const id = normalizeId(raw.stopId); + return { + ...raw, + stopId: id, + type: raw.type || (id.startsWith('renfe:') ? 'train' : 'bus'), + favourite: false + } as Stop; + }); } export default { diff --git a/src/frontend/app/routes/map.tsx b/src/frontend/app/routes/map.tsx index 461e891..402bf60 100644 --- a/src/frontend/app/routes/map.tsx +++ b/src/frontend/app/routes/map.tsx @@ -35,7 +35,7 @@ export default function StopMap() { const [stops, setStops] = useState< GeoJsonFeature< Point, - { stopId: number; name: string; lines: string[]; cancelled?: boolean } + { stopId: string; name: string; lines: string[]; cancelled?: boolean, prefix: string } >[] >([]); const [selectedStop, setSelectedStop] = useState<Stop | null>(null); @@ -65,7 +65,7 @@ export default function StopMap() { StopDataProvider.getStops().then((data) => { const features: GeoJsonFeature< Point, - { stopId: number; name: string; lines: string[]; cancelled?: boolean } + { stopId: string; name: string; lines: string[]; cancelled?: boolean, prefix: string } >[] = data.map((s) => ({ type: "Feature", geometry: { @@ -77,6 +77,7 @@ export default function StopMap() { name: s.name.original, lines: s.lines, cancelled: s.cancelled ?? false, + prefix: s.stopId.startsWith("renfe:") ? "stop-renfe" : (s.cancelled ? "stop-vitrasa-cancelled" : "stop-vitrasa"), }, })); setStops(features); @@ -152,7 +153,7 @@ export default function StopMap() { return; } - const stopId = parseInt(props.stopId, 10); + const stopId = props.stopId; // fetch full stop to get lines array StopDataProvider.getStopById(stopId) @@ -200,25 +201,23 @@ export default function StopMap() { <Layer id="stops" type="symbol" - minzoom={13} + minzoom={11} source="stops-source" layout={{ "icon-image": [ - "case", - ["coalesce", ["get", "cancelled"], false], - `stop-vigo-cancelled`, - `stop-vigo`, + "get", + "prefix" ], "icon-size": [ "interpolate", ["linear"], ["zoom"], 13, - 0.4, - 14, 0.7, + 16, + 0.8, 18, - 1.0, + 1.2, ], "icon-allow-overlap": true, "icon-ignore-placement": true, @@ -239,7 +238,12 @@ export default function StopMap() { "text-size": ["interpolate", ["linear"], ["zoom"], 11, 8, 22, 16], }} paint={{ - "text-color": `${REGION_DATA.textColour}`, + "text-color": [ + "case", + ["==", ["get", "prefix"], "stop-renfe"], + "#870164", + "#e72b37" + ], "text-halo-color": "#FFF", "text-halo-width": 1, }} diff --git a/src/frontend/app/routes/stops-$id.tsx b/src/frontend/app/routes/stops-$id.tsx index 31cc75f..d836c12 100644 --- a/src/frontend/app/routes/stops-$id.tsx +++ b/src/frontend/app/routes/stops-$id.tsx @@ -72,10 +72,35 @@ const loadConsolidatedData = async ( return await resp.json(); }; +export interface ConsolidatedCirculation { + line: string; + route: string; + schedule?: { + running: boolean; + minutes: number; + serviceId: string; + tripId: string; + shapeId?: string; + }; + realTime?: { + minutes: number; + distance: number; + }; + currentPosition?: { + latitude: number; + longitude: number; + orientationDegrees: number; + shapeIndex?: number; + }; + isPreviousTrip?: boolean; + previousTripShapeId?: string; + nextStreets?: string[]; +} + export default function Estimates() { const { t } = useTranslation(); const params = useParams(); - const stopIdNum = parseInt(params.id ?? ""); + const stopId = params.id ?? ""; const [customName, setCustomName] = useState<string | undefined>(undefined); const [stopData, setStopData] = useState<Stop | undefined>(undefined); @@ -98,8 +123,8 @@ export default function Estimates() { if (customName) return customName; if (stopData?.name.intersect) return stopData.name.intersect; if (stopData?.name.original) return stopData.name.original; - return `Parada ${stopIdNum}`; - }, [customName, stopData, stopIdNum]); + return `Parada ${stopId}`; + }, [customName, stopData, stopId]); usePageTitle(getStopDisplayName()); @@ -128,21 +153,21 @@ export default function Estimates() { try { setDataError(null); - const body = await loadConsolidatedData(params.id!); + const body = await loadConsolidatedData(stopId); setData(body); setDataDate(new Date()); // Load stop data from StopDataProvider - const stop = await StopDataProvider.getStopById(stopIdNum); + const stop = await StopDataProvider.getStopById(stopId); setStopData(stop); - setCustomName(StopDataProvider.getCustomName(stopIdNum)); + setCustomName(StopDataProvider.getCustomName(stopId)); } catch (error) { console.error("Error loading consolidated data:", error); setDataError(parseError(error)); setData(null); setDataDate(null); } - }, [params.id, stopIdNum]); + }, [stopId]); const refreshData = useCallback(async () => { await Promise.all([loadData()]); @@ -170,19 +195,19 @@ export default function Estimates() { setDataLoading(true); loadData(); - StopDataProvider.pushRecent(parseInt(params.id ?? "")); + StopDataProvider.pushRecent(stopId); setFavourited( - StopDataProvider.isFavourite(parseInt(params.id ?? "")) + StopDataProvider.isFavourite(stopId) ); setDataLoading(false); - }, [params.id, loadData]); + }, [stopId, loadData]); const toggleFavourite = () => { if (favourited) { - StopDataProvider.removeFavourite(stopIdNum); + StopDataProvider.removeFavourite(stopId); setFavourited(false); } else { - StopDataProvider.addFavourite(stopIdNum); + StopDataProvider.addFavourite(stopId); setFavourited(true); } }; diff --git a/src/frontend/public/maps/spritesheet/sprite.json b/src/frontend/public/maps/spritesheet/sprite.json index 504ff07..46a525b 100644 --- a/src/frontend/public/maps/spritesheet/sprite.json +++ b/src/frontend/public/maps/spritesheet/sprite.json @@ -1,14 +1,22 @@ { - "stop-vigo": { - "id": "stop-vigo", + "stop-vitrasa": { + "id": "stop-vitrasa", "x": 0, "y": 0, "width": 32, "height": 32, "pixelRatio": 1 }, - "stop-vigo-cancelled": { - "id": "stop-vigo-cancelled", + "stop-vitrasa-cancelled": { + "id": "stop-vitrasa-cancelled", + "x": 32, + "y": 0, + "width": 32, + "height": 32, + "pixelRatio": 1 + }, + "stop-renfe": { + "id": "stop-renfe", "x": 64, "y": 0, "width": 32, diff --git a/src/frontend/public/maps/spritesheet/sprite.png b/src/frontend/public/maps/spritesheet/sprite.png Binary files differindex 5c46a13..272b490 100644 --- a/src/frontend/public/maps/spritesheet/sprite.png +++ b/src/frontend/public/maps/spritesheet/sprite.png diff --git a/src/frontend/public/maps/spritesheet/sprite@2x.json b/src/frontend/public/maps/spritesheet/sprite@2x.json index 0586f5b..02e05d5 100644 --- a/src/frontend/public/maps/spritesheet/sprite@2x.json +++ b/src/frontend/public/maps/spritesheet/sprite@2x.json @@ -1,14 +1,22 @@ { - "stop-vigo": { - "id": "stop-vigo", + "stop-vitrasa": { + "id": "stop-vitrasa", "x": 0, "y": 0, "width": 64, "height": 64, "pixelRatio": 2 }, - "stop-vigo-cancelled": { - "id": "stop-vigo-cancelled", + "stop-vitrasa-cancelled": { + "id": "stop-vitrasa-cancelled", + "x": 64, + "y": 0, + "width": 64, + "height": 64, + "pixelRatio": 2 + }, + "stop-renfe": { + "id": "stop-renfe", "x": 128, "y": 0, "width": 64, diff --git a/src/frontend/public/maps/spritesheet/sprite@2x.png b/src/frontend/public/maps/spritesheet/sprite@2x.png Binary files differindex 4101224..8979128 100644 --- a/src/frontend/public/maps/spritesheet/sprite@2x.png +++ b/src/frontend/public/maps/spritesheet/sprite@2x.png diff --git a/src/frontend/public/stops/vigo.json b/src/frontend/public/stops/vigo.json index 37b4876..1adc57b 100644 --- a/src/frontend/public/stops/vigo.json +++ b/src/frontend/public/stops/vigo.json @@ -1,85 +1,362 @@ [ { - "stopId": 20, + "stopId": "renfe:08223", "name": { - "original": "Rúa do Abade Juan de Bastos (fronte Asociación Veciños)" + "original": "VIGO URZAIZ" }, - "latitude": 42.187593499, - "longitude": -8.741246641, + "latitude": 42.2344784, + "longitude": -8.7130987, + "lines": [] + }, + { + "stopId": "renfe:08224", + "name": { + "original": "REDONDELA-AV" + }, + "latitude": 42.284533, + "longitude": -8.603713, + "lines": [] + }, + { + "stopId": "renfe:22103", + "name": { + "original": "FILGUEIRA" + }, + "latitude": 42.2199566, + "longitude": -8.1848025, + "lines": [] + }, + { + "stopId": "renfe:22104", + "name": { + "original": "FRIEIRA" + }, + "latitude": 42.154972, + "longitude": -8.2001702, + "lines": [] + }, + { + "stopId": "renfe:22105", + "name": { + "original": "POUSA-CRECENTE" + }, + "latitude": 42.1366863, + "longitude": -8.2348913, + "lines": [] + }, + { + "stopId": "renfe:22106", + "name": { + "original": "ARBO" + }, + "latitude": 42.1069927, + "longitude": -8.3002144, + "lines": [] + }, + { + "stopId": "renfe:22107", + "name": { + "original": "SELA" + }, + "latitude": 42.0920451, + "longitude": -8.3559662, + "lines": [] + }, + { + "stopId": "renfe:22108", + "name": { + "original": "AS NEVES" + }, + "latitude": 42.0754353, + "longitude": -8.4201118, + "lines": [] + }, + { + "stopId": "renfe:22109", + "name": { + "original": "SALVATERRA" + }, + "latitude": 42.0816074, + "longitude": -8.4952202, + "lines": [] + }, + { + "stopId": "renfe:22110", + "name": { + "original": "CALDELAS" + }, + "latitude": 42.0557889, + "longitude": -8.566391, + "lines": [] + }, + { + "stopId": "renfe:22200", + "name": { + "original": "GUILLAREI" + }, + "latitude": 42.0656748, + "longitude": -8.6225614, + "lines": [] + }, + { + "stopId": "renfe:22201", + "name": { + "original": "O PORRIÑO" + }, + "latitude": 42.1640956, + "longitude": -8.6220121, + "lines": [] + }, + { + "stopId": "renfe:22300", + "name": { + "original": "REDONDELA" + }, + "latitude": 42.2860395, + "longitude": -8.6194152, + "lines": [] + }, + { + "stopId": "renfe:22308", + "name": { + "original": "VIGO-GUIXAR" + }, + "latitude": 42.2394426820947, + "longitude": -8.712087821668435, + "lines": [] + }, + { + "stopId": "renfe:22401", + "name": { + "original": "TUI" + }, + "latitude": 42.0565541, + "longitude": -8.6430108, + "lines": [] + }, + { + "stopId": "renfe:23000", + "name": { + "original": "REDONDELA-PICOTA" + }, + "latitude": 42.2867756, + "longitude": -8.60741, + "lines": [] + }, + { + "stopId": "renfe:23001", + "name": { + "original": "CESANTES" + }, + "latitude": 42.3101953, + "longitude": -8.6164619, + "lines": [] + }, + { + "stopId": "renfe:23002", + "name": { + "original": "ARCADE" + }, + "latitude": 42.3404447, + "longitude": -8.6104633, + "lines": [] + }, + { + "stopId": "renfe:23004", + "name": { + "original": "PONTEVEDRA" + }, + "latitude": 42.42164, + "longitude": -8.63583, + "lines": [] + }, + { + "stopId": "renfe:23005", + "name": { + "original": "PORTELA" + }, + "latitude": 42.5177336, + "longitude": -8.6545656, + "lines": [] + }, + { + "stopId": "renfe:23008", + "name": { + "original": "VILAGARCIA DE AROUSA" + }, + "latitude": 42.6019751, + "longitude": -8.7622662, + "lines": [] + }, + { + "stopId": "renfe:23009", + "name": { + "original": "CATOIRA" + }, + "latitude": 42.6722202, + "longitude": -8.7253854, + "lines": [] + }, + { + "stopId": "renfe:23010", + "name": { + "original": "PONTECESURES" + }, + "latitude": 42.7229746, + "longitude": -8.6521346, + "lines": [] + }, + { + "stopId": "renfe:23018", + "name": { + "original": "PONTEVEDRA-UNIVERSIDAD" + }, + "latitude": 42.4388295, + "longitude": -8.6303782, + "lines": [] + }, + { + "stopId": "renfe:31308", + "name": { + "original": "LALIN" + }, + "latitude": 42.6325351, + "longitude": -8.1426426, + "lines": [] + }, + { + "stopId": "vitrasa:100", + "name": { + "original": "Avda. do Alcalde Lavadores, 125" + }, + "latitude": 42.219008975, + "longitude": -8.69606935, "lines": [ - "17" + "6" ] }, { - "stopId": 40, + "stopId": "vitrasa:1000", "name": { - "original": "Rúa do Abade Juan de Bastos (cruce Baixada da Moo)" + "original": "Avda. da Atlántida, 109" }, - "latitude": 42.192126677, - "longitude": -8.72901589, + "latitude": 42.221220508, + "longitude": -8.767194468, "lines": [ - "17" + "10", + "15B", + "15C" ] }, { - "stopId": 50, + "stopId": "vitrasa:10061", "name": { - "original": "Rúa do Abade Juan de Bastos, 24" + "original": "Estrada de San Xoán, 193" }, - "latitude": 42.19287042, - "longitude": -8.727513924, + "latitude": 42.185277472, + "longitude": -8.741558953, "lines": [ "17" ] }, { - "stopId": 70, + "stopId": "vitrasa:1010", "name": { - "original": "Rúa da Lagoa (cruce Camiño do Casmarcelo)" + "original": "Avda. da Atlántida, 136" }, - "latitude": 42.20020175, - "longitude": -8.700621608, + "latitude": 42.221479642, + "longitude": -8.767482698, "lines": [ - "18A", - "18B" + "10", + "15B", + "15C", + "N1" ] }, { - "stopId": 80, + "stopId": "vitrasa:1020", "name": { - "original": "Rúa da Lagoa, 46" + "original": "Avda. da Atlántida, 150" }, - "latitude": 42.200132216, - "longitude": -8.700535777, + "latitude": 42.222764778, + "longitude": -8.769405842, "lines": [ - "18A", - "18B" + "10", + "15B", + "15C", + "N1" ] }, { - "stopId": 90, + "stopId": "vitrasa:1030", "name": { - "original": "Aeroporto de Peinador" + "original": "Avda. da Atlántida, 25" }, - "latitude": 42.225956918, - "longitude": -8.63286469, + "latitude": 42.223219677, + "longitude": -8.754753277, "lines": [ - "A" + "10", + "15B", + "15C" ] }, { - "stopId": 100, + "stopId": "vitrasa:1040", "name": { - "original": "Avda. do Alcalde Lavadores, 125" + "original": "Avda. da Atlántida, 32" }, - "latitude": 42.219008975, - "longitude": -8.69606935, + "latitude": 42.223237503, + "longitude": -8.755707801, "lines": [ - "6" + "10", + "15B", + "15C", + "N1" + ] + }, + { + "stopId": "vitrasa:1050", + "name": { + "original": "Avda. da Atlántida, 71" + }, + "latitude": 42.221875354, + "longitude": -8.760935381, + "lines": [ + "10", + "15B", + "15C" + ] + }, + { + "stopId": "vitrasa:1060", + "name": { + "original": "Avda. da Atlántida, 84" + }, + "latitude": 42.221789505, + "longitude": -8.759905458, + "lines": [ + "10", + "15B", + "15C", + "N1" + ] + }, + { + "stopId": "vitrasa:1070", + "name": { + "original": "Avda. da Atlántida, 114" + }, + "latitude": 42.221148357, + "longitude": -8.764660969, + "lines": [ + "10", + "15B", + "15C", + "N1" ] }, { - "stopId": 110, + "stopId": "vitrasa:110", "name": { "original": "Avda. do Alcalde Lavadores, 171" }, @@ -90,7 +367,94 @@ ] }, { - "stopId": 120, + "stopId": "vitrasa:1110", + "name": { + "original": "Praza Ribeira do Berbés" + }, + "latitude": 42.237821273, + "longitude": -8.729666379, + "lines": [ + "A", + "5B", + "9B", + "11" + ] + }, + { + "stopId": "vitrasa:1120", + "name": { + "original": "Avda. de Beiramar (fronte Casa do Mar)" + }, + "latitude": 42.23416729, + "longitude": -8.733331094, + "lines": [ + "6", + "9B", + "15B", + "28" + ] + }, + { + "stopId": "vitrasa:1130", + "name": { + "original": "Avda. de Beiramar (Peiraos auxiliares)" + }, + "latitude": 42.231238831, + "longitude": -8.735255297, + "lines": [ + "6", + "9B", + "15B", + "28" + ] + }, + { + "stopId": "vitrasa:1140", + "name": { + "original": "Avda. de Beiramar (Freire)" + }, + "latitude": 42.225068475, + "longitude": -8.74774586, + "lines": [ + "6", + "9B" + ] + }, + { + "stopId": "vitrasa:1150", + "name": { + "original": "Rúa da Ribeira do Berbés" + }, + "latitude": 42.237384264, + "longitude": -8.729603006, + "lines": [ + "C1", + "C3d", + "A", + "5A", + "9B", + "10", + "15B", + "15C", + "28", + "N4", + "H1" + ] + }, + { + "stopId": "vitrasa:1160", + "name": { + "original": "Avda. de Beiramar (Sto. Domingo)" + }, + "latitude": 42.225759663, + "longitude": -8.743239749, + "lines": [ + "6", + "9B" + ] + }, + { + "stopId": "vitrasa:120", "name": { "original": "Avda. do Alcalde Lavadores, 8" }, @@ -101,7 +465,180 @@ ] }, { - "stopId": 130, + "stopId": "vitrasa:1200", + "name": { + "original": "Avda. de Beiramar, 51" + }, + "latitude": 42.234233798, + "longitude": -8.73312316, + "lines": [ + "10", + "15B" + ] + }, + { + "stopId": "vitrasa:1210", + "name": { + "original": "Avda. de Beiramar, 61" + }, + "latitude": 42.230811976, + "longitude": -8.735364934, + "lines": [ + "10", + "15B" + ] + }, + { + "stopId": "vitrasa:1220", + "name": { + "original": "Avda. de Buenos Aires, 46" + }, + "latitude": 42.247097055, + "longitude": -8.693109251, + "lines": [ + "5A", + "10", + "31", + "U2", + "H2", + "H3", + "PSA 1" + ] + }, + { + "stopId": "vitrasa:1230", + "name": { + "original": "Avda. de Buenos Aires, 49" + }, + "latitude": 42.247251925, + "longitude": -8.693122662, + "lines": [ + "5B", + "10", + "N1", + "H3", + "VTS" + ] + }, + { + "stopId": "vitrasa:1240", + "name": { + "original": "Avda. de Buenos Aires, 8" + }, + "latitude": 42.249128205, + "longitude": -8.69514773, + "lines": [ + "5A", + "10", + "31", + "U2", + "H2", + "H3", + "PSA 1" + ] + }, + { + "stopId": "vitrasa:1250", + "name": { + "original": "Avda. de Castelao, 16" + }, + "latitude": 42.219730396, + "longitude": -8.737456513, + "lines": [ + "C3d", + "4A", + "4C", + "5B", + "10", + "12A", + "13", + "15A", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:1260", + "name": { + "original": "Avda. de Castelao, 21" + }, + "latitude": 42.219775977, + "longitude": -8.736255523, + "lines": [ + "C3i", + "4A", + "4C", + "5B", + "10", + "11", + "12A", + "15A", + "N1", + "U1" + ] + }, + { + "stopId": "vitrasa:1270", + "name": { + "original": "Avda. de Castelao, 50" + }, + "latitude": 42.218704937, + "longitude": -8.74254446, + "lines": [ + "C3d", + "4A", + "4C", + "5B", + "10", + "12A", + "13", + "15A", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:1280", + "name": { + "original": "Avda. de Castelao, 41" + }, + "latitude": 42.218523315, + "longitude": -8.74223465, + "lines": [ + "C3i", + "4A", + "4C", + "10", + "11", + "12A", + "15A", + "N1", + "U1" + ] + }, + { + "stopId": "vitrasa:1290", + "name": { + "original": "Avda. de Castelao, 54" + }, + "latitude": 42.218158263, + "longitude": -8.745797727, + "lines": [ + "C3d", + "4A", + "4C", + "5B", + "10", + "12A", + "13", + "15A", + "N4", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:130", "name": { "original": "Avda. do Alcalde Lavadores, 102" }, @@ -112,7 +649,155 @@ ] }, { - "stopId": 140, + "stopId": "vitrasa:1300", + "name": { + "original": "Avda. de Castelao, 68" + }, + "latitude": 42.217466378, + "longitude": -8.751245499, + "lines": [ + "C3d", + "4A", + "4C", + "5B", + "10", + "12A", + "13", + "15A", + "N4", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:1310", + "name": { + "original": "Avda. de Castelao, 73" + }, + "latitude": 42.217705528, + "longitude": -8.747753325, + "lines": [ + "C3i", + "4A", + "4C", + "10", + "11", + "12A", + "15A", + "N1", + "N4", + "U1" + ] + }, + { + "stopId": "vitrasa:1320", + "name": { + "original": "Avda. de Castelao, 87" + }, + "latitude": 42.217302224, + "longitude": -8.751104752, + "lines": [ + "C3i", + "10", + "12A", + "N1", + "U1" + ] + }, + { + "stopId": "vitrasa:1330", + "name": { + "original": "Avda. de Castrelos (Pavillón)" + }, + "latitude": 42.219553947, + "longitude": -8.732509436, + "lines": [ + "A", + "16", + "23", + "27", + "H2" + ] + }, + { + "stopId": "vitrasa:1340", + "name": { + "original": "Avda. de Castrelos (Parque)" + }, + "latitude": 42.212870645, + "longitude": -8.732131792, + "lines": [ + "27", + "H2" + ] + }, + { + "stopId": "vitrasa:1350", + "name": { + "original": "Avda. de Castrelos, 121" + }, + "latitude": 42.208026488, + "longitude": -8.7312098, + "lines": [ + "7", + "12B", + "17", + "27" + ] + }, + { + "stopId": "vitrasa:1360", + "name": { + "original": "Avda. de Castrelos, 16" + }, + "latitude": 42.219613217, + "longitude": -8.732629194, + "lines": [ + "7", + "12B", + "17", + "27", + "H2", + "VTS", + "PTL" + ] + }, + { + "stopId": "vitrasa:1380", + "name": { + "original": "Avda. de Castrelos, 179" + }, + "latitude": 42.20533568, + "longitude": -8.730078621, + "lines": [ + "7", + "12B", + "17", + "U1" + ] + }, + { + "stopId": "vitrasa:1390", + "name": { + "original": "Avda. de Castrelos, 186" + }, + "latitude": 42.212735556, + "longitude": -8.732314182, + "lines": [ + "A", + "7", + "12B", + "17", + "27", + "U1", + "H2", + "H", + "VTS", + "PTL" + ] + }, + { + "stopId": "vitrasa:140", "name": { "original": "Avda. do Alcalde Lavadores, 29" }, @@ -123,734 +808,1615 @@ ] }, { - "stopId": 150, + "stopId": "vitrasa:1400", "name": { - "original": "Avda. do Alcalde Lavadores, 48" + "original": "Avda. de Castrelos, 202" }, - "latitude": 42.222636676, - "longitude": -8.697201413, + "latitude": 42.210706683, + "longitude": -8.732237372, "lines": [ - "6" + "A", + "7", + "12B", + "17", + "27", + "U1", + "H1", + "H2", + "H", + "PTL" ] }, { - "stopId": 160, + "stopId": "vitrasa:1410", "name": { - "original": "Avda. do Alcalde Lavadores, 67" + "original": "Avda. de Castrelos, 13" }, - "latitude": 42.222830286, - "longitude": -8.697231476, + "latitude": 42.218060161, + "longitude": -8.732450427, "lines": [ - "6" + "A", + "16", + "23", + "27", + "H2" ] }, { - "stopId": 170, + "stopId": "vitrasa:14101", "name": { - "original": "Avda. do Alcalde Lavadores, 152" + "original": "Estrada da Garrida, 165" }, - "latitude": 42.215084316, - "longitude": -8.696854931, + "latitude": 42.168008539, + "longitude": -8.710415438, "lines": [ - "6" + "7" ] }, { - "stopId": 180, + "stopId": "vitrasa:14102", "name": { - "original": "Estrada de Valadares, 451" + "original": "Estrada da Garrida, 108" }, - "latitude": 42.166144986, - "longitude": -8.720162371, + "latitude": 42.168282882, + "longitude": -8.710066751, "lines": [ "7" ] }, { - "stopId": 190, + "stopId": "vitrasa:14105", "name": { - "original": "Rúa de Ángel de Lema, 58" + "original": "Ciencias Xurídicas (CUVI)" }, - "latitude": 42.250539537, - "longitude": -8.685179363, + "latitude": 42.167237978, + "longitude": -8.681135704, "lines": [ - "C3i", - "10" + "A", + "15C", + "U1", + "U2" ] }, { - "stopId": 195, + "stopId": "vitrasa:14106", "name": { - "original": "Rúa de Ángel de Lema, 247" + "original": "Avda. do Aeroporto, 92" }, - "latitude": 42.256624708, - "longitude": -8.677490797, + "latitude": 42.234161582, + "longitude": -8.695074564, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:14107", + "name": { + "original": "Camiño Padín (Rotonda Autoestrada)" + }, + "latitude": 42.257847205, + "longitude": -8.677696507, "lines": [ - "C3d", "10" ] }, { - "stopId": 200, + "stopId": "vitrasa:14108", "name": { - "original": "Rúa de Ángel de Lema, 100" + "original": "Avda. da Ponte (antes desvío Autovía)" }, - "latitude": 42.252115803, - "longitude": -8.683374373, + "latitude": 42.21401741, + "longitude": -8.67133083, + "lines": [ + "15B", + "15C" + ] + }, + { + "stopId": "vitrasa:14111", + "name": { + "original": "Estrada de Bembrive (Centro Saúde)" + }, + "latitude": 42.204262657, + "longitude": -8.684801801, "lines": [ + "6", + "14" + ] + }, + { + "stopId": "vitrasa:14112", + "name": { + "original": "Estrada de Bembrive (Alameda)" + }, + "latitude": 42.204047198, + "longitude": -8.684697288, + "lines": [ + "6", + "14" + ] + }, + { + "stopId": "vitrasa:14113", + "name": { + "original": "Estrada da Coutada, 20" + }, + "latitude": 42.193458577, + "longitude": -8.702065856, + "lines": [ + "6", + "27" + ] + }, + { + "stopId": "vitrasa:14117", + "name": { + "original": "Rúa do Couto de San Honorato, 26" + }, + "latitude": 42.228574702, + "longitude": -8.712864548, + "lines": [ + "H2" + ] + }, + { + "stopId": "vitrasa:14119", + "name": { + "original": "Rúa do Couto de San Honorato, 80" + }, + "latitude": 42.229320789, + "longitude": -8.710390551, + "lines": [ + "H2" + ] + }, + { + "stopId": "vitrasa:14121", + "name": { + "original": "Rúa da Reconquista, 2" + }, + "latitude": 42.238625474, + "longitude": -8.723242095, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:14122", + "name": { + "original": "Avda. do Alcalde Gregorio Espino, 9" + }, + "latitude": 42.231584097, + "longitude": -8.706968521, + "lines": [ + "4C", + "23", + "31", + "H2", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:14123", + "name": { + "original": "Rúa do Porriño, 9" + }, + "latitude": 42.214127819, + "longitude": -8.752027594, + "lines": [ + "C3d", "C3i", - "10" + "4A", + "4C", + "5B", + "11", + "15A", + "15B", + "N4", + "U1" ] }, { - "stopId": 210, + "stopId": "vitrasa:14124", "name": { - "original": "Rúa de Ángel de Lema, 140" + "original": "Rúa de Eduardo Cabello (fronte Igrexa)" }, - "latitude": 42.255798748, - "longitude": -8.678507526, + "latitude": 42.226569499, + "longitude": -8.752773946, "lines": [ + "C3d", "C3i", - "10" + "6" ] }, { - "stopId": 220, + "stopId": "vitrasa:14125", "name": { - "original": "Rúa de Ángel de Lema, 163" + "original": "Rúa do Porriño (fronte 9)" }, - "latitude": 42.252694363, - "longitude": -8.68302903, + "latitude": 42.213869651, + "longitude": -8.751990789, "lines": [ "C3d", - "10" + "C3i", + "4A", + "4C", + "15A", + "PSA 1", + "PSA 4" ] }, { - "stopId": 230, + "stopId": "vitrasa:14126", "name": { - "original": "Rúa de Ángel de Lema, 14" + "original": "Rúa da Travesía de Vigo, 194" }, - "latitude": 42.248041601, - "longitude": -8.691024475, + "latitude": 42.242494425, + "longitude": -8.699249038, "lines": [ "C3i", - "10" + "5A", + "N1", + "VTS" ] }, { - "stopId": 240, + "stopId": "vitrasa:14127", "name": { - "original": "Rúa de Ángel de Lema, 19" + "original": "Avda. de Buenos Aires, 13" }, - "latitude": 42.247513476, - "longitude": -8.691874301, + "latitude": 42.249306896, + "longitude": -8.695179916, "lines": [ - "C3d", - "10" + "5B", + "10", + "N1", + "H3", + "VTS" ] }, { - "stopId": 250, + "stopId": "vitrasa:14128", "name": { - "original": "Rúa de Ángel de Lema, 221" + "original": "Camiño do Caramuxo (fronte 9)" }, - "latitude": 42.255252085, - "longitude": -8.679480662, + "latitude": 42.20733292, + "longitude": -8.752159103, "lines": [ - "C3d", - "10" + "5A" ] }, { - "stopId": 260, + "stopId": "vitrasa:14129", "name": { - "original": "Rúa de Ángel de Lema, 91" + "original": "Camiño do Caramuxo, 11" }, - "latitude": 42.250421216, - "longitude": -8.685464716, + "latitude": 42.20723039, + "longitude": -8.752592351, "lines": [ - "C3d", - "10" + "5A" ] }, { - "stopId": 270, + "stopId": "vitrasa:14131", "name": { - "original": "Rúa de Desiderio Pernas Arquitecto, 1" + "original": "Rúa de Tomás Paredes, 4" }, - "latitude": 42.18920151, - "longitude": -8.810340862, + "latitude": 42.221948768, + "longitude": -8.753171211, "lines": [ - "C3d", + "C3i", "10" ] }, { - "stopId": 280, + "stopId": "vitrasa:14132", "name": { - "original": "Rúa do Arquitecto Antonio Cominges, 38" + "original": "Rúa de Sanjurjo Badía, 252" }, - "latitude": 42.189490674, - "longitude": -8.808107114, + "latitude": 42.249307631, + "longitude": -8.696542008, "lines": [ "C3d", - "10" + "5A", + "5B", + "10", + "17", + "31", + "U2", + "H2", + "H3", + "PSA 1" ] }, { - "stopId": 290, + "stopId": "vitrasa:14133", "name": { - "original": "Rúa do Arquitecto Gómez Román, 37" + "original": "Avda. de Galicia, 37" }, - "latitude": 42.190149471, - "longitude": -8.803788225, + "latitude": 42.250977575, + "longitude": -8.694471881, "lines": [ - "C3d", - "10" + "C3i", + "17" ] }, { - "stopId": 310, + "stopId": "vitrasa:14134", "name": { - "original": "Rúa do Arquitecto Antonio Cominges, 4" + "original": "Avda. de Galicia, 182" }, - "latitude": 42.190850463, - "longitude": -8.80358845, + "latitude": 42.253208793, + "longitude": -8.686995591, "lines": [ - "C3d", - "10" + "C3d" ] }, { - "stopId": 320, + "stopId": "vitrasa:14135", "name": { - "original": "Rúa do Arquitecto Antonio Cominges, 70" + "original": "Rúa de Santo Amaro (Praza de España)" }, - "latitude": 42.189221331, - "longitude": -8.811730246, + "latitude": 42.229174145, + "longitude": -8.720143055, "lines": [ - "C3d", - "10" + "C1" ] }, { - "stopId": 330, + "stopId": "vitrasa:14136", "name": { - "original": "Rúa do Arquitecto Antonio Cominges, 90" + "original": "Avda. de Galicia, 18" }, - "latitude": 42.187213169, - "longitude": -8.813069201, + "latitude": 42.250484372, + "longitude": -8.694878804, "lines": [ "C3d", - "10" + "17" ] }, { - "stopId": 340, + "stopId": "vitrasa:14137", "name": { - "original": "Rúa de Aragón, 116" + "original": "Estrada Matamá Pazo (Igrexa)" }, - "latitude": 42.238036494, - "longitude": -8.700921187, + "latitude": 42.200003406, + "longitude": -8.753169, "lines": [ - "4A", - "H3" + "29" ] }, { - "stopId": 350, + "stopId": "vitrasa:14138", "name": { - "original": "Rúa de Aragón, 162" + "original": "Estrada de Madrid (Campo de Fútbol)" }, - "latitude": 42.240488915, - "longitude": -8.700357923, + "latitude": 42.216459201, + "longitude": -8.678591709, "lines": [ - "4A", - "H3" + "12B", + "15B", + "15C" ] }, { - "stopId": 360, + "stopId": "vitrasa:14139", "name": { - "original": "Rúa de Aragón, 193" + "original": "Avda. de E. Martínez Garrido, 27" }, - "latitude": 42.24013184, - "longitude": -8.700947033, + "latitude": 42.227492758, + "longitude": -8.700413366, "lines": [ - "4A", - "H3" + "6", + "25", + "31" ] }, { - "stopId": 370, + "stopId": "vitrasa:14140", "name": { - "original": "Rúa de Aragón, 212" + "original": "Avda. de E. Martínez Garrido, 30" }, - "latitude": 42.242101304, - "longitude": -8.698394546, + "latitude": 42.228210877, + "longitude": -8.699999354, "lines": [ - "4A", - "H3" + "4C", + "6", + "23", + "25", + "31", + "N4", + "PSA 4", + "VTS" ] }, { - "stopId": 380, + "stopId": "vitrasa:14141", "name": { - "original": "Rúa de Aragón, 221" + "original": "Rúa de Jenaro de la Fuente, 43" }, - "latitude": 42.242091376, - "longitude": -8.698668131, + "latitude": 42.231379202, + "longitude": -8.699876213, "lines": [ - "4A", + "11", + "15A", + "15B", + "15C", "H3" ] }, { - "stopId": 390, + "stopId": "vitrasa:14142", "name": { - "original": "Rúa de Aragón, 26" + "original": "Avda. da Hispanidade, 22" }, - "latitude": 42.233174046, - "longitude": -8.702380309, + "latitude": 42.231463434, + "longitude": -8.728844425, "lines": [ - "4A", - "H3" + "16" ] }, { - "stopId": 400, + "stopId": "vitrasa:14143", "name": { - "original": "Rúa de Aragón, 91" + "original": "Avda. da Hispanidade, 38" }, - "latitude": 42.235598195, - "longitude": -8.701426538, + "latitude": 42.229753483, + "longitude": -8.729002675, "lines": [ - "4A", - "H3" + "16" ] }, { - "stopId": 410, + "stopId": "vitrasa:14144", "name": { - "original": "Rúa de Aragón, 82" + "original": "Avda. da Hispanidade, 82" }, - "latitude": 42.235524387, - "longitude": -8.701248417, + "latitude": 42.226760436, + "longitude": -8.727385303, "lines": [ - "4A", - "H3" + "16" ] }, { - "stopId": 420, + "stopId": "vitrasa:14150", "name": { - "original": "Rúa de Aragón, 147" + "original": "Rúa do Padre Don Rúa, 1" }, - "latitude": 42.238092485, - "longitude": -8.701156245, + "latitude": 42.232076561, + "longitude": -8.719055236, "lines": [ - "4A", - "H3" + "14", + "18A" ] }, { - "stopId": 530, + "stopId": "vitrasa:14152", "name": { - "original": "Avda. de Ricardo Mella (Estación Coruxo)" + "original": "Rúa do Monte Calvario, 4" }, - "latitude": 42.193562859, - "longitude": -8.78173994, + "latitude": 42.204815402, + "longitude": -8.687168969, "lines": [ - "12A" + "14" ] }, { - "stopId": 540, + "stopId": "vitrasa:14153", "name": { - "original": "Avda. de Ricardo Mella (fronte 223)" + "original": "Estrada de Bembrive, 173" }, - "latitude": 42.189424424, - "longitude": -8.790733064, + "latitude": 42.205357233, + "longitude": -8.692495739, "lines": [ - "12A" + "6", + "14" ] }, { - "stopId": 560, + "stopId": "vitrasa:14154", "name": { - "original": "Avda. de Ricardo Mella, 518" + "original": "Rúa das Chans (fronte 56)" }, - "latitude": 42.181015915, - "longitude": -8.807696921, + "latitude": 42.19360258, + "longitude": -8.677258993, "lines": [ - "10" + "14" ] }, { - "stopId": 570, + "stopId": "vitrasa:14156", "name": { - "original": "Avda. de Ricardo Mella, 250" + "original": "Rúa de Xeme (cruce Camiño da Carballeira)" }, - "latitude": 42.195225102, - "longitude": -8.775226375, + "latitude": 42.203378431, + "longitude": -8.696666863, "lines": [ - "12A" + "14" ] }, { - "stopId": 572, + "stopId": "vitrasa:14157", "name": { - "original": "Estrada de Madrid, 210" + "original": "Rúa do Xeme (cruce Rúa de Eifonso)" }, - "latitude": 42.214058797, - "longitude": -8.672946954, + "latitude": 42.202979066, + "longitude": -8.694065121, "lines": [ - "12B", - "15B", - "15C", - "U2" + "14" ] }, { - "stopId": 580, + "stopId": "vitrasa:14161", "name": { - "original": "Avda. de Ricardo Mella, 135" + "original": "Rúa de López Mora, 62" }, - "latitude": 42.195766012, - "longitude": -8.773648966, + "latitude": 42.224130699, + "longitude": -8.732568248, "lines": [ - "12A" + "VTS" ] }, { - "stopId": 600, + "stopId": "vitrasa:14162", "name": { - "original": "Avda. de Ricardo Mella, 273" + "original": "Avda. da Florida, 82" }, - "latitude": 42.189927171, - "longitude": -8.800634184, + "latitude": 42.211371871, + "longitude": -8.746523782, "lines": [ - "C3d", - "10", - "12A" + "5A", + "11", + "29", + "VTS" ] }, { - "stopId": 620, + "stopId": "vitrasa:14163", "name": { - "original": "Avda. de Ricado Mella, 165" + "original": "Avda. da Florida (fronte 82)" }, - "latitude": 42.1935678, - "longitude": -8.781529566, + "latitude": 42.211442202, + "longitude": -8.746227469, "lines": [ - "12A" + "5A", + "11", + "29" ] }, { - "stopId": 630, + "stopId": "vitrasa:14164", "name": { - "original": "Avda. de Ricardo Mella, 223" + "original": "Rúa de Tomás A. Alonso, 136" }, - "latitude": 42.189304527, - "longitude": -8.79068363, + "latitude": 42.225172437, + "longitude": -8.744777354, "lines": [ - "12A" + "C3i", + "15B", + "15C", + "N1" ] }, { - "stopId": 650, + "stopId": "vitrasa:14165", "name": { - "original": "Avda. de Ricardo Mella, 289" + "original": "Rúa de Tomás A. Alonso, 193" }, - "latitude": 42.181065441, - "longitude": -8.807509871, + "latitude": 42.224905029, + "longitude": -8.745285775, "lines": [ "C3d", - "10", - "12A" + "13", + "15B", + "15C", + "U1", + "H" ] }, { - "stopId": 660, + "stopId": "vitrasa:14166", "name": { - "original": "Avda. do Alcalde Portanet, 34" + "original": "Avda. das Camelias, 114" }, - "latitude": 42.211494566, - "longitude": -8.736022397, + "latitude": 42.225142981, + "longitude": -8.729707944, "lines": [ + "4A", + "4C", + "5B", "7", + "12A", "12B", "17", - "H1", - "VTS" + "27", + "PSA 4" ] }, { - "stopId": 680, + "stopId": "vitrasa:14167", "name": { - "original": "Avda. do Aeroporto (Aeroclub)" + "original": "Beiramar - Pescadores" }, - "latitude": 42.229005723, - "longitude": -8.634356866, + "latitude": 42.225279021, + "longitude": -8.751908648, "lines": [ - "A" + "6", + "9B", + "28" ] }, { - "stopId": 690, + "stopId": "vitrasa:14168", "name": { - "original": "Avda. do Aeroporto, 656" + "original": "Avda. das Camelias, 113" }, - "latitude": 42.233064093, - "longitude": -8.642742935, + "latitude": 42.224928285, + "longitude": -8.729631509, "lines": [ - "A", - "25" + "4A", + "4C", + "11", + "12B", + "17", + "27", + "N1" ] }, { - "stopId": 700, + "stopId": "vitrasa:14169", "name": { - "original": "Avda. do Aeroporto (Colexio)" + "original": "Avda. das Camelias, 136" }, - "latitude": 42.228674047, - "longitude": -8.633340309, + "latitude": 42.22244224, + "longitude": -8.731271052, "lines": [ - "A" + "C1", + "4A", + "4C", + "5B", + "7", + "12A", + "12B", + "16", + "17", + "27", + "LZH", + "PSA 4" ] }, { - "stopId": 710, + "stopId": "vitrasa:14170", "name": { - "original": "Rúa de Aragón (Instituto)" + "original": "Avda. de Samil (Praia da Punta)" }, - "latitude": 42.232478958, - "longitude": -8.701988706, + "latitude": 42.218831744, + "longitude": -8.77571001, "lines": [ - "A", - "4A", - "9B", - "24", - "27", - "28" + "10", + "15B", + "15C", + "N1" ] }, { - "stopId": 720, + "stopId": "vitrasa:14171", "name": { - "original": "Avda. do Aeroporto, 215" + "original": "Avda. de Samil (fronte Praia da Punta)" }, - "latitude": 42.235739016, - "longitude": -8.684254232, + "latitude": 42.218844713, + "longitude": -8.775459221, "lines": [ - "A", - "9B", - "27" + "10", + "15B", + "15C" ] }, { - "stopId": 730, + "stopId": "vitrasa:14173", "name": { - "original": "Avda. do Aeroporto, 130" + "original": "Rúa do Gaiteiro de Ricardo Portela (fronte Pavillón)" }, - "latitude": 42.231109162, - "longitude": -8.690501398, + "latitude": 42.235900754, + "longitude": -8.731391435, "lines": [ + "C1", + "C3d", "A", + "5A", "9B", - "27" + "15C", + "N4", + "H1" ] }, { - "stopId": 740, + "stopId": "vitrasa:14174", "name": { - "original": "Avda. do Aeroporto, 181" + "original": "Rúa do Padre Seixas (Parque da Bouza)" }, - "latitude": 42.233560754, - "longitude": -8.686937524, + "latitude": 42.211844516, + "longitude": -8.749287921, "lines": [ - "A", - "9B", + "11", + "16" + ] + }, + { + "stopId": "vitrasa:14175", + "name": { + "original": "Rúa do Padre Seixas, 32" + }, + "latitude": 42.211792864, + "longitude": -8.749617832, + "lines": [ + "16" + ] + }, + { + "stopId": "vitrasa:14177", + "name": { + "original": "Rúa de Fernando Conde (cruce Avda. da Gran Vía)" + }, + "latitude": 42.22985125, + "longitude": -8.71972059, + "lines": [ + "7", + "12A", + "12B", + "14", + "18A", "27" ] }, { - "stopId": 750, + "stopId": "vitrasa:14178", "name": { - "original": "Avda. do Aeroporto, 184" + "original": "Rúa do Marqués de Alcedo (Parque)" }, - "latitude": 42.233103986, - "longitude": -8.68716283, + "latitude": 42.233009005, + "longitude": -8.724497604, "lines": [ - "A", - "9B", + "7", + "12A", + "12B", "27" ] }, { - "stopId": 760, + "stopId": "vitrasa:14179", "name": { - "original": "Avda. do Aeroporto, 240" + "original": "Rúa da Costa, 4" }, - "latitude": 42.236775611, - "longitude": -8.683736566, + "latitude": 42.213260612, + "longitude": -8.722562576, "lines": [ "A", - "9B", - "27" + "18B", + "18H" ] }, { - "stopId": 770, + "stopId": "vitrasa:14180", "name": { - "original": "Avda. do Aeroporto, 273" + "original": "Avda. de E. Martínez Garrido, 108" }, - "latitude": 42.238939528, - "longitude": -8.681422497, + "latitude": 42.224749197, + "longitude": -8.707320585, + "lines": [ + "4C", + "23", + "31", + "N4", + "PSA 4", + "VTS" + ] + }, + { + "stopId": "vitrasa:14181", + "name": { + "original": "Camiño da Corredoura (Igrexa)" + }, + "latitude": 42.210954716, + "longitude": -8.727776522, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:14182", + "name": { + "original": "Rúa da Costa, 39" + }, + "latitude": 42.211618245, + "longitude": -8.72147159, "lines": [ "A", - "9B", - "27" + "18B", + "18H" ] }, { - "stopId": 780, + "stopId": "vitrasa:14183", "name": { - "original": "Avda. do Aeroporto, 298" + "original": "Rúa do Xalón (Colexio)" }, - "latitude": 42.238554288, - "longitude": -8.680663432, + "latitude": 42.220622235, + "longitude": -8.654888024, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14184", + "name": { + "original": "Rúa do Xalón, 5" + }, + "latitude": 42.217384986, + "longitude": -8.657082399, "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14185", + "name": { + "original": "Rúa da Becerreira, 81" + }, + "latitude": 42.219667098, + "longitude": -8.659470523, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14186", + "name": { + "original": "Rúa da Becerreira (fronte 64)" + }, + "latitude": 42.218044517, + "longitude": -8.662618478, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14187", + "name": { + "original": "Rúa da Becerreira, 1" + }, + "latitude": 42.221588029, + "longitude": -8.662035851, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14188", + "name": { + "original": "Rúa da Becerreira, 41" + }, + "latitude": 42.217595578, + "longitude": -8.661414166, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14189", + "name": { + "original": "Rúa Molais, 84" + }, + "latitude": 42.226081487, + "longitude": -8.654133203, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14190", + "name": { + "original": "Rúa de Severino Cobas, 196" + }, + "latitude": 42.225080876, + "longitude": -8.683314171, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14191", + "name": { + "original": "Camiño da Bouciña, 76" + }, + "latitude": 42.223737557, + "longitude": -8.682141153, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14192", + "name": { + "original": "Rúa das Figueiras, 282" + }, + "latitude": 42.231625599, + "longitude": -8.652046516, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14193", + "name": { + "original": "Avda. de Santa Mariña, 443" + }, + "latitude": 42.230916628, + "longitude": -8.641628816, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14194", + "name": { + "original": "Avda. de Santa Mariña, 425" + }, + "latitude": 42.228639377, + "longitude": -8.640978361, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14195", + "name": { + "original": "Avda. de Santa Mariña, 249" + }, + "latitude": 42.226263256, + "longitude": -8.644091084, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14196", + "name": { + "original": "Avda. de Santa Mariña, 229" + }, + "latitude": 42.225296, + "longitude": -8.649527921, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14197", + "name": { + "original": "Rúa Molais (cruce Rúa das Carballas)" + }, + "latitude": 42.225912491, + "longitude": -8.653698801, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14198", + "name": { + "original": "Rúa do Riomao, 21" + }, + "latitude": 42.227231301, + "longitude": -8.659997969, + "lines": [ + "15A", + "25" + ] + }, + { + "stopId": "vitrasa:14199", + "name": { + "original": "Camiño da Bouciña, 79" + }, + "latitude": 42.223755464, + "longitude": -8.682041911, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:1420", + "name": { + "original": "Avda. de Castrelos, 297" + }, + "latitude": 42.201440099, + "longitude": -8.726409762, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14200", + "name": { + "original": "Rúa de Severino Cobas, 119" + }, + "latitude": 42.225112655, + "longitude": -8.683402684, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14201", + "name": { + "original": "Avda. de Santa Mariña (cruce Avda. do Tranvía)" + }, + "latitude": 42.226291056, + "longitude": -8.641647591, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14202", + "name": { + "original": "Rúa de Jenaro de la Fuente, 58" + }, + "latitude": 42.231273786, + "longitude": -8.700145645, + "lines": [ + "11", + "15A", + "15B", + "15C", + "H3" + ] + }, + { + "stopId": "vitrasa:14203", + "name": { + "original": "Avda. do Tranvía S/N (despois Camiño Lugar)" + }, + "latitude": 42.226524401, + "longitude": -8.661251786, + "lines": [ + "11", + "15A" + ] + }, + { + "stopId": "vitrasa:14204", + "name": { + "original": "Rúa de Manuel Álvarez, 151" + }, + "latitude": 42.22312688, + "longitude": -8.681864633, + "lines": [ + "25", + "31", + "H3" + ] + }, + { + "stopId": "vitrasa:14205", + "name": { + "original": "Estrada do Freixo (Cemiterio)" + }, + "latitude": 42.178408629, + "longitude": -8.733198549, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14206", + "name": { + "original": "Avda. da Gran Vía (Instituto)" + }, + "latitude": 42.220514043, + "longitude": -8.731700217, + "lines": [ + "C3i", + "7", + "11", + "13", + "15A", + "16", + "23", + "29", + "H2" + ] + }, + { + "stopId": "vitrasa:14207", + "name": { + "original": "Camiño do Pinal, 19" + }, + "latitude": 42.161212162, + "longitude": -8.716377433, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14208", + "name": { + "original": "Estrada de Valadares, 452" + }, + "latitude": 42.162237207, + "longitude": -8.71885531, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14209", + "name": { + "original": "Estrada da Garrida, 263" + }, + "latitude": 42.173333822, + "longitude": -8.705439803, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14210", + "name": { + "original": "Estrada da Garrida (frente 243)" + }, + "latitude": 42.173077394, + "longitude": -8.705659744, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14211", + "name": { + "original": "Estrada do Monte Alba, 32" + }, + "latitude": 42.165479162, + "longitude": -8.721775005, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14212", + "name": { + "original": "Estrada do Monte Alba, 54" + }, + "latitude": 42.164694101, + "longitude": -8.724472962, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14213", + "name": { + "original": "Estrada do Freixo (Campo Fútbol)" + }, + "latitude": 42.169153241, + "longitude": -8.729001464, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14214", + "name": { + "original": "Estrada do Freixo, 191" + }, + "latitude": 42.175760907, + "longitude": -8.734516924, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14215", + "name": { + "original": "Estrada do Freixo, 90" + }, + "latitude": 42.175592169, + "longitude": -8.734477788, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14216", + "name": { + "original": "Estrada do Freixo (fronte Campo Fútbol)" + }, + "latitude": 42.169143301, + "longitude": -8.729076566, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14217", + "name": { + "original": "Estrada do Monte Alba (frente 54)" + }, + "latitude": 42.164570839, + "longitude": -8.724561475, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14218", + "name": { + "original": "Estrada do Monte Alba, 21" + }, + "latitude": 42.165288305, + "longitude": -8.721367309, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14219", + "name": { + "original": "Camiño do Pinal, 59" + }, + "latitude": 42.159500512, + "longitude": -8.718247279, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14220", + "name": { + "original": "Camiño da Bouciña, 14" + }, + "latitude": 42.225657321, + "longitude": -8.681467666, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14221", + "name": { + "original": "Camiño da Bouciña, 3" + }, + "latitude": 42.225809218, + "longitude": -8.681652991, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14222", + "name": { + "original": "Camiño do Pinal, 5" + }, + "latitude": 42.162959525, + "longitude": -8.716541365, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14223", + "name": { + "original": "Avda. Beiramar Porto Pesqueiro Berbés" + }, + "latitude": 42.236685153, + "longitude": -8.731609303, + "lines": [ + "C3i", "A", - "9B", - "27" + "5A", + "5B", + "10", + "11", + "15C", + "N1", + "N4", + "H1", + "VTS" ] }, { - "stopId": 790, + "stopId": "vitrasa:14224", "name": { - "original": "Avda. do Aeroporto, 325" + "original": "Rúa do Conde de Torrecedeira, 16" }, - "latitude": 42.237426811, - "longitude": -8.675474476, + "latitude": 42.234285927, + "longitude": -8.731266507, "lines": [ + "C3i", "A", - "9B", - "27" + "5A", + "5B", + "10", + "11", + "15C", + "N1", + "N4", + "H1", + "VTS" ] }, { - "stopId": 800, + "stopId": "vitrasa:14225", "name": { - "original": "Avda. do Aeroporto, 328" + "original": "Rúa do Conde de Torrecedeira, 50" }, - "latitude": 42.237801674, - "longitude": -8.676524783, + "latitude": 42.231716574, + "longitude": -8.732308737, "lines": [ + "C3i", "A", - "9B", - "27" + "5A", + "5B", + "10", + "11", + "15C", + "N1", + "N4", + "H1", + "VTS" ] }, { - "stopId": 810, + "stopId": "vitrasa:14226", "name": { - "original": "Avda. do Aeroporto, 350" + "original": "Rúa do Conde de Torrecedeira, 70" }, - "latitude": 42.235521261, - "longitude": -8.67465521, + "latitude": 42.229574859, + "longitude": -8.733073973, "lines": [ + "C3i", "A", - "9B", - "27" + "5A", + "5B", + "10", + "11", + "15C", + "N1", + "N4", + "H1", + "VTS" ] }, { - "stopId": 820, + "stopId": "vitrasa:14227", "name": { - "original": "Avda. do Aeroporto, 377" + "original": "Rúa do Conde de Torrecedeira, 86" }, - "latitude": 42.234766626, - "longitude": -8.671305131, + "latitude": 42.22696657, + "longitude": -8.734559706, "lines": [ + "C3i", "A", + "5A", + "5B", + "10", + "11", + "15C", + "N1", + "N4", + "H1", + "VTS" + ] + }, + { + "stopId": "vitrasa:14228", + "name": { + "original": "Avda. de Peinador, 100" + }, + "latitude": 42.221696342, + "longitude": -8.632840997, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:14231", + "name": { + "original": "Rúa da Rabadeira, 39" + }, + "latitude": 42.235542066, + "longitude": -8.652196565, + "lines": [ "9B" ] }, { - "stopId": 830, + "stopId": "vitrasa:14232", "name": { - "original": "Avda. do Aeroporto, 378" + "original": "Rúa da Rabadeira (fronte 33)" }, - "latitude": 42.234673289, - "longitude": -8.671348046, + "latitude": 42.235317662, + "longitude": -8.652094641, "lines": [ - "A", "9B", "27" ] }, { - "stopId": 840, + "stopId": "vitrasa:14233", "name": { - "original": "Avda. do Aeroporto, 43" + "original": "Rúa San Cristobo, 90" }, - "latitude": 42.234904325, - "longitude": -8.699245802, + "latitude": 42.241037275, + "longitude": -8.668947597, "lines": [ - "A", - "4A", "9B", - "24", - "27", "28" ] }, { - "stopId": 850, + "stopId": "vitrasa:14236", "name": { - "original": "Avda. do Aeroporto, 423" + "original": "Rúa de Manuel Cominges (fronte 112)" }, - "latitude": 42.23630176, - "longitude": -8.665791599, + "latitude": 42.196308523, + "longitude": -8.723526935, "lines": [ - "A", - "9B" + "12B" ] }, { - "stopId": 860, + "stopId": "vitrasa:14237", "name": { - "original": "Avda. do Aeroporto, 446" + "original": "Rúa de Manuel Cominges, 134" }, - "latitude": 42.235612667, - "longitude": -8.666529207, + "latitude": 42.196119748, + "longitude": -8.723457198, "lines": [ - "A", - "9B", + "12B" + ] + }, + { + "stopId": "vitrasa:14238", + "name": { + "original": "Rúa da Saa do Monte, 5" + }, + "latitude": 42.20458802, + "longitude": -8.714617309, + "lines": [ + "18B" + ] + }, + { + "stopId": "vitrasa:14240", + "name": { + "original": "Rúa das Chabarras, 21" + }, + "latitude": 42.197985091, + "longitude": -8.714523201, + "lines": [ + "18B" + ] + }, + { + "stopId": "vitrasa:14241", + "name": { + "original": "Rúa das Chabarras, 60" + }, + "latitude": 42.197842023, + "longitude": -8.71471632, + "lines": [ + "18B" + ] + }, + { + "stopId": "vitrasa:14242", + "name": { + "original": "Rúa das Chabarras (cruce Camiño dos Pasais)" + }, + "latitude": 42.196378259, + "longitude": -8.716979043, + "lines": [ + "18B" + ] + }, + { + "stopId": "vitrasa:14243", + "name": { + "original": "Rúa das Chabarras, 24" + }, + "latitude": 42.196539214, + "longitude": -8.716874437, + "lines": [ + "18B" + ] + }, + { + "stopId": "vitrasa:14244", + "name": { + "original": "Rúa de Macal, 60" + }, + "latitude": 42.198216234, + "longitude": -8.721498041, + "lines": [ + "18B", + "18H", "27" ] }, { - "stopId": 870, + "stopId": "vitrasa:14245", "name": { - "original": "Avda. do Aeroporto, 447" + "original": "Avda. de García Barbón, 43" }, - "latitude": 42.23543058, - "longitude": -8.66197943, + "latitude": 42.23691728, + "longitude": -8.716743143, + "lines": [ + "C3i", + "A", + "5B", + "10", + "16", + "17", + "24", + "N1", + "VTS" + ] + }, + { + "stopId": "vitrasa:14247", + "name": { + "original": "Camiño dos Muíños, 69" + }, + "latitude": 42.200511179, + "longitude": -8.769110573, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:14248", + "name": { + "original": "Camiño dos Muíños, 74" + }, + "latitude": 42.200580723, + "longitude": -8.76911862, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:14249", + "name": { + "original": "Avda. de Cesáreo Vázquez, 5" + }, + "latitude": 42.177662554, + "longitude": -8.800157923, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:14250", + "name": { + "original": "Avda. do Aeroporto, 463" + }, + "latitude": 42.234914814, + "longitude": -8.658983411, "lines": [ "A", "9B" ] }, { - "stopId": 880, + "stopId": "vitrasa:14251", "name": { - "original": "Avda. do Aeroporto, 484" + "original": "Avda. do Aeroporto (fronte 463)" }, - "latitude": 42.23544051, - "longitude": -8.662354939, + "latitude": 42.234817602, + "longitude": -8.65882027, "lines": [ "A", "9B", @@ -858,132 +2424,168 @@ ] }, { - "stopId": 890, + "stopId": "vitrasa:14252", "name": { - "original": "Avda. do Aeroporto, 491" + "original": "Estrada Clara Campoamor (Instituto)" }, - "latitude": 42.232066419, - "longitude": -8.653842977, + "latitude": 42.165934208, + "longitude": -8.707243001, "lines": [ - "A" + "A", + "U1" ] }, { - "stopId": 900, + "stopId": "vitrasa:14253", "name": { - "original": "Avda. do Aeroporto, 531" + "original": "Estrada Clara Campoamor (cruce Rúa do Padrón do Couto)" }, - "latitude": 42.233527998, - "longitude": -8.648237616, + "latitude": 42.164455564, + "longitude": -8.707223843, "lines": [ - "A" + "A", + "U1" ] }, { - "stopId": 910, + "stopId": "vitrasa:14255", "name": { - "original": "Avda. do Aeroporto, 54" + "original": "Rúa do Pintor Colmeiro (Parque do Pintor Colmeiro)" }, - "latitude": 42.234679919, - "longitude": -8.699623994, + "latitude": 42.225111918, + "longitude": -8.726733526, "lines": [ - "A", - "4A", - "9B", - "24", - "27", - "28" + "16" ] }, { - "stopId": 920, + "stopId": "vitrasa:14256", "name": { - "original": "Avda. do Aeroporto (cruce Camiño das Cereixeiras)" + "original": "Rúa de Zamora, 89" }, - "latitude": 42.233499069, - "longitude": -8.643325214, + "latitude": 42.222198901, + "longitude": -8.728317834, "lines": [ - "A" + "16" ] }, { - "stopId": 930, + "stopId": "vitrasa:14257", "name": { - "original": "Avda. do Aeroporto, 570" + "original": "Rúa de Zamora, 71" }, - "latitude": 42.231979036, - "longitude": -8.65372496, + "latitude": 42.223448271, + "longitude": -8.725547112, "lines": [ - "A" + "16" ] }, { - "stopId": 940, + "stopId": "vitrasa:14258", "name": { - "original": "Avda. do Aeroporto, 605" + "original": "Rúa de Zamora, 51" }, - "latitude": 42.230493878, - "longitude": -8.638023273, + "latitude": 42.224870416, + "longitude": -8.723632015, "lines": [ - "A" + "16" ] }, { - "stopId": 950, + "stopId": "vitrasa:14259", "name": { - "original": "Avda. do Aeroporto, 614" + "original": "Rúa de Zamora, 31" }, - "latitude": 42.233626818, - "longitude": -8.647811163, + "latitude": 42.227088982, + "longitude": -8.721545256, + "lines": [ + "16" + ] + }, + { + "stopId": "vitrasa:14260", + "name": { + "original": "Avda. da Gran Vía (fronte Avda. de Madrid)" + }, + "latitude": 42.228741057, + "longitude": -8.71961914, "lines": [ "A", - "25" + "7", + "14", + "16", + "18A", + "18B", + "18H", + "H2" ] }, { - "stopId": 960, + "stopId": "vitrasa:14261", "name": { - "original": "Avda. do Aeroporto, 686" + "original": "Rúa de Zamora, 1" }, - "latitude": 42.230918888, - "longitude": -8.638532893, + "latitude": 42.228644118, + "longitude": -8.720692314, "lines": [ - "A" + "16" ] }, { - "stopId": 970, + "stopId": "vitrasa:14264", "name": { - "original": "Avda. do Aeroporto, 91" + "original": "Rúa de Urzáiz - Príncipe" }, - "latitude": 42.232787318, - "longitude": -8.693473285, + "latitude": 42.235873545, + "longitude": -8.720083317, "lines": [ + "C1", "A", + "4A", + "4C", + "5A", + "7", "9B", - "27" + "12B", + "14", + "15B", + "15C", + "16", + "17", + "18A", + "18B", + "18H", + "24", + "28", + "N1", + "N4" + ], + "amenities": [ + "shelter", + "display" ] }, { - "stopId": 980, + "stopId": "vitrasa:14267", "name": { - "original": "Avda. da Atlántida, 99" + "original": "Avda. da Atlántida, 64" }, - "latitude": 42.221170087, - "longitude": -8.763656977, + "latitude": 42.221892792, + "longitude": -8.758191526, "lines": [ "10", "15B", - "15C" + "15C", + "N1" ] }, { - "stopId": 990, + "stopId": "vitrasa:14268", "name": { - "original": "Avda. da Atlántida (fronte 148)" + "original": "Avda. da Atlántida, 49" }, - "latitude": 42.222451366, - "longitude": -8.769134894, + "latitude": 42.221731945, + "longitude": -8.758417175, "lines": [ "10", "15B", @@ -991,175 +2593,530 @@ ] }, { - "stopId": 1000, + "stopId": "vitrasa:14270", "name": { - "original": "Avda. da Atlántida, 109" + "original": "Estrada da Balsa, 67" }, - "latitude": 42.221220508, - "longitude": -8.767194468, + "latitude": 42.196619218, + "longitude": -8.743240048, "lines": [ - "10", - "15B", - "15C" + "17" ] }, { - "stopId": 1010, + "stopId": "vitrasa:14271", "name": { - "original": "Avda. da Atlántida, 136" + "original": "Estrada da Balsa, 103" }, - "latitude": 42.221479642, - "longitude": -8.767482698, + "latitude": 42.196050474, + "longitude": -8.745105715, "lines": [ - "10", - "15B", - "15C", - "N1" + "17" ] }, { - "stopId": 1020, + "stopId": "vitrasa:14273", "name": { - "original": "Avda. da Atlántida, 150" + "original": "Rúa do Xalón, 41" }, - "latitude": 42.222764778, - "longitude": -8.769405842, + "latitude": 42.219274062, + "longitude": -8.656419893, "lines": [ - "10", - "15B", - "15C", - "N1" + "11" ] }, { - "stopId": 1030, + "stopId": "vitrasa:14277", "name": { - "original": "Avda. da Atlántida, 25" + "original": "Avda. da Mariña Española, 8" }, - "latitude": 42.223219677, - "longitude": -8.754753277, + "latitude": 42.251776399, + "longitude": -8.69414009, "lines": [ - "10", - "15B", - "15C" + "17" ] }, { - "stopId": 1040, + "stopId": "vitrasa:14278", "name": { - "original": "Avda. da Atlántida, 32" + "original": "Avda. da Mariña Española, 44" }, - "latitude": 42.223237503, - "longitude": -8.755707801, + "latitude": 42.25430173, + "longitude": -8.692915616, "lines": [ - "10", + "17" + ] + }, + { + "stopId": "vitrasa:14279", + "name": { + "original": "Riós (Rotonda)" + }, + "latitude": 42.257069093, + "longitude": -8.690786611, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14280", + "name": { + "original": "Avda. da Mariña Española (ETEA)" + }, + "latitude": 42.254604716, + "longitude": -8.692539681, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14281", + "name": { + "original": "Avda. da Mariña Española (Praia de Ríos)" + }, + "latitude": 42.251596707, + "longitude": -8.69420171, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14287", + "name": { + "original": "Rúa Santa Tegra, 67" + }, + "latitude": 42.25020334, + "longitude": -8.701924083, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14288", + "name": { + "original": "Avda. de Guixar (fronte 28)" + }, + "latitude": 42.249218849, + "longitude": -8.704807605, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14289", + "name": { + "original": "Rúa de Xulián Estévez (fronte 58)" + }, + "latitude": 42.246484972, + "longitude": -8.705864005, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14290", + "name": { + "original": "Rúa de Xulián Estévez (fronte 18)" + }, + "latitude": 42.244107542, + "longitude": -8.706343638, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14291", + "name": { + "original": "Avda. da Ponte (Vigo Memorial)" + }, + "latitude": 42.209935219, + "longitude": -8.671464542, + "lines": [ + "12B", "15B", "15C", - "N1" + "U2" ] }, { - "stopId": 1050, + "stopId": "vitrasa:14294", "name": { - "original": "Avda. da Atlántida, 71" + "original": "Avda. de Ricardo Mella, 406" }, - "latitude": 42.221875354, - "longitude": -8.760935381, + "latitude": 42.190684424876565, + "longitude": -8.799308812770041, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:14295", + "name": { + "original": "Rúa de Pi i Margall, 121" + }, + "latitude": 42.230436358, + "longitude": -8.731437473, + "lines": [ + "5B", + "12A" + ] + }, + { + "stopId": "vitrasa:14296", + "name": { + "original": "Praza dos Leóns (Vigozoo)" + }, + "latitude": 42.248375604, + "longitude": -8.675578666, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14298", + "name": { + "original": "Avda. de Samil (fronte 15)" + }, + "latitude": 42.215865535, + "longitude": -8.774911658, "lines": [ - "10", - "15B", "15C" ] }, { - "stopId": 1060, + "stopId": "vitrasa:14299", "name": { - "original": "Avda. da Atlántida, 84" + "original": "Avda. de Samil (frente Verbum)" }, - "latitude": 42.221789505, - "longitude": -8.759905458, + "latitude": 42.213777217, + "longitude": -8.774600284, "lines": [ - "10", + "C3i", + "15A", "15B", "15C", "N1" ] }, { - "stopId": 1070, + "stopId": "vitrasa:1430", "name": { - "original": "Avda. da Atlántida, 114" + "original": "Avda. de Castrelos, 318" }, - "latitude": 42.221148357, - "longitude": -8.764660969, + "latitude": 42.203408408, + "longitude": -8.728817983, "lines": [ - "10", - "15B", - "15C", - "N1" + "7", + "U1" ] }, { - "stopId": 1110, + "stopId": "vitrasa:14300", "name": { - "original": "Praza Ribeira do Berbés" + "original": "Avda. da Florida, 30" }, - "latitude": 42.237821273, - "longitude": -8.729666379, + "latitude": 42.217907548, + "longitude": -8.73707436, "lines": [ - "A", - "5B", - "9B", - "11" + "5A", + "11", + "29", + "VTS" ] }, { - "stopId": 1120, + "stopId": "vitrasa:14301", "name": { - "original": "Avda. de Beiramar (fronte Casa do Mar)" + "original": "Avda. da Florida, 47" }, - "latitude": 42.23416729, - "longitude": -8.733331094, + "latitude": 42.218257459, + "longitude": -8.736328798, "lines": [ - "6", - "9B", - "15B", - "28" + "5A", + "11", + "29" ] }, { - "stopId": 1130, + "stopId": "vitrasa:14302", "name": { - "original": "Avda. de Beiramar (Peiraos auxiliares)" + "original": "Estrada Vella de Madrid, 7" }, - "latitude": 42.231238831, - "longitude": -8.735255297, + "latitude": 42.214542094, + "longitude": -8.696431619, "lines": [ - "6", - "9B", - "15B", - "28" + "12A", + "12B", + "13", + "H3" ] }, { - "stopId": 1140, + "stopId": "vitrasa:14304", "name": { - "original": "Avda. de Beiramar (Freire)" + "original": "Estrada Vella de Madrid, 145" }, - "latitude": 42.225068475, - "longitude": -8.74774586, + "latitude": 42.221313975, + "longitude": -8.681944471, "lines": [ - "6", - "9B" + "12A", + "12B", + "13", + "31" ] }, { - "stopId": 1150, + "stopId": "vitrasa:14307", "name": { - "original": "Rúa da Ribeira do Berbés" + "original": "Rúa do Pintor Colmeiro, 11" }, - "latitude": 42.237384264, - "longitude": -8.729603006, + "latitude": 42.224464416, + "longitude": -8.727967343, + "lines": [ + "16" + ] + }, + { + "stopId": "vitrasa:14308", + "name": { + "original": "Camiño do Pinal, 6" + }, + "latitude": 42.16328558, + "longitude": -8.716707662, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14309", + "name": { + "original": "Camiño do Pinal, 28" + }, + "latitude": 42.161067029, + "longitude": -8.716468628, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14310", + "name": { + "original": "Camiño do Pinal (fronte 57)" + }, + "latitude": 42.159564137, + "longitude": -8.718295559, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14311", + "name": { + "original": "Estrada de Valadares, 505" + }, + "latitude": 42.162720337, + "longitude": -8.718900908, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:14314", + "name": { + "original": "Rúa das Mantelas (cruce Avda. da Gran Vía)" + }, + "latitude": 42.227212568, + "longitude": -8.720183032, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14315", + "name": { + "original": "Rúa das Mantelas, 92" + }, + "latitude": 42.22393338, + "longitude": -8.716924148, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14317", + "name": { + "original": "Rúa da Salgueira Entrada (Igrexa)" + }, + "latitude": 42.222723933, + "longitude": -8.719150283, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14318", + "name": { + "original": "Rúa da Salguera Entrada (fronte 5)" + }, + "latitude": 42.222591256, + "longitude": -8.717753486, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14319", + "name": { + "original": "Rúa das Coutadas (Fonte)" + }, + "latitude": 42.221002214, + "longitude": -8.72027208, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14320", + "name": { + "original": "Rúa do Miradoiro (Rotonda Centro Comercial)" + }, + "latitude": 42.220799025, + "longitude": -8.723345356, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14321", + "name": { + "original": "Camiño do Freixeiro, 74" + }, + "latitude": 42.218131641, + "longitude": -8.723120057, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14322", + "name": { + "original": "Rúa da Fonte Santa, 4" + }, + "latitude": 42.217813814, + "longitude": -8.721352482, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14323", + "name": { + "original": "Rúa Finca dos Aires (cruce Rúa da Fonte Santa)" + }, + "latitude": 42.217059742, + "longitude": -8.720340235, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14324", + "name": { + "original": "Rúa Finca dos Aires (Urbanización)" + }, + "latitude": 42.217256401, + "longitude": -8.720101519, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14325", + "name": { + "original": "Rúa da Fonte Santa (fronte 4)" + }, + "latitude": 42.217848286, + "longitude": -8.7214811, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14326", + "name": { + "original": "Baixada á Ponte Nova, 61" + }, + "latitude": 42.218038279, + "longitude": -8.722489738, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14328", + "name": { + "original": "Citroën - PSA" + }, + "latitude": 42.208988415, + "longitude": -8.746151897, + "lines": [ + "LZH", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:14329", + "name": { + "original": "Citroën (Puerta Principal)" + }, + "latitude": 42.210124372, + "longitude": -8.741139991, + "lines": [ + "LZH", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:14330", + "name": { + "original": "Subida ás Chans (fronte cruce Rúa Senra)" + }, + "latitude": 42.198072667, + "longitude": -8.682624653, + "lines": [ + "14" + ] + }, + { + "stopId": "vitrasa:14331", + "name": { + "original": "Rúa de Álvaro Cunqueiro, 30" + }, + "latitude": 42.223769828, + "longitude": -8.728938728, + "lines": [ + "4A", + "4C", + "5A", + "5B", + "11", + "12A", + "12B", + "17", + "27", + "N1", + "LZH" + ] + }, + { + "stopId": "vitrasa:14333", + "name": { + "original": "Rúa de Cánovas del Castillo, 18" + }, + "latitude": 42.240189011, + "longitude": -8.726765331, "lines": [ "C1", "C3d", @@ -1175,409 +3132,775 @@ ] }, { - "stopId": 1160, + "stopId": "vitrasa:14335", "name": { - "original": "Avda. de Beiramar (Sto. Domingo)" + "original": "Camiño do Arieiro (Residencia de Maiores)" }, - "latitude": 42.225759663, - "longitude": -8.743239749, + "latitude": 42.212692269, + "longitude": -8.675661599, "lines": [ - "6", - "9B" + "31" ] }, { - "stopId": 1200, + "stopId": "vitrasa:14336", "name": { - "original": "Avda. de Beiramar, 51" + "original": "Rúa das Teixugueiras, 8" }, - "latitude": 42.234233798, - "longitude": -8.73312316, + "latitude": 42.21447626, + "longitude": -8.75600551, "lines": [ - "10", - "15B" + "13", + "15A" ] }, { - "stopId": 1210, + "stopId": "vitrasa:14337", "name": { - "original": "Avda. de Beiramar, 61" + "original": "Rúa do Limpiño (Rotonda Rúa Teixugueiras)" }, - "latitude": 42.230811976, - "longitude": -8.735364934, + "latitude": 42.213080218, + "longitude": -8.754660224, "lines": [ - "10", - "15B" + "5A", + "5B", + "13", + "15A", + "15B", + "N4", + "U1", + "H", + "PSA 1", + "PSA 4" ] }, { - "stopId": 1220, + "stopId": "vitrasa:14345", "name": { - "original": "Avda. de Buenos Aires, 46" + "original": "Rúa do Areiro, 49" }, - "latitude": 42.247097055, - "longitude": -8.693109251, + "latitude": 42.237269816, + "longitude": -8.685138009, "lines": [ - "5A", - "10", + "28" + ] + }, + { + "stopId": "vitrasa:14346", + "name": { + "original": "Rúa do Areiro, 52" + }, + "latitude": 42.237287688, + "longitude": -8.685019992, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14347", + "name": { + "original": "Rúa do Areiro (cruce Salcides)" + }, + "latitude": 42.23913765, + "longitude": -8.683873934, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14348", + "name": { + "original": "Rúa do Areiro, 76" + }, + "latitude": 42.238950988, + "longitude": -8.683793467, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14349", + "name": { + "original": "Rúa do Areiro (Campo de Fútbol)" + }, + "latitude": 42.244717312, + "longitude": -8.678473607, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14350", + "name": { + "original": "Rúa do Areiro (fronte Campo de Fútbol)" + }, + "latitude": 42.244849353, + "longitude": -8.678366319, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14353", + "name": { + "original": "Praza dos Leóns (fronte Vigozoo)" + }, + "latitude": 42.248151648, + "longitude": -8.675976097, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14354", + "name": { + "original": "Avda. de Ramón Nieto (fronte Igrexa)" + }, + "latitude": 42.225911433, + "longitude": -8.675526243, + "lines": [ + "11", + "15A", + "15B", + "15C", "31", - "U2", - "H2", - "H3", - "PSA 1" + "H3" ] }, { - "stopId": 1230, + "stopId": "vitrasa:14355", "name": { - "original": "Avda. de Buenos Aires, 49" + "original": "Avda. de Ramón Nieto, 409" }, - "latitude": 42.247251925, - "longitude": -8.693122662, + "latitude": 42.226638363, + "longitude": -8.676135104, "lines": [ - "5B", - "10", - "N1", + "11", + "15A", + "15B", + "15C", + "31", "H3", "VTS" ] }, { - "stopId": 1240, + "stopId": "vitrasa:14356", "name": { - "original": "Avda. de Buenos Aires, 8" + "original": "Avda. de Ricardo Mella, 314" }, - "latitude": 42.249128205, - "longitude": -8.69514773, + "latitude": 42.192009114, + "longitude": -8.783993123, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:14357", + "name": { + "original": "Avda. de Ricardo Mella (cruce Camiño do Río)" + }, + "latitude": 42.191796473, + "longitude": -8.784014088, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:14358", + "name": { + "original": "Rúa das Teixugueiras, 28" + }, + "latitude": 42.209054557, + "longitude": -8.75715865, "lines": [ "5A", - "10", - "31", - "U2", - "H2", - "H3", - "PSA 1" + "5B", + "13", + "N4" ] }, { - "stopId": 1250, + "stopId": "vitrasa:14359", "name": { - "original": "Avda. de Castelao, 16" + "original": "Rúa das Teixugueiras, 16-Portal 2" }, - "latitude": 42.219730396, - "longitude": -8.737456513, + "latitude": 42.212235738, + "longitude": -8.755011746, "lines": [ - "C3d", - "4A", - "4C", + "5A", "5B", - "10", - "12A", "13", - "15A", - "PSA 1", - "PSA 4" + "N4" ] }, { - "stopId": 1260, + "stopId": "vitrasa:14360", "name": { - "original": "Avda. de Castelao, 21" + "original": "Rúa das Teixugueiras, 19-Portal 5" }, - "latitude": 42.219775977, - "longitude": -8.736255523, + "latitude": 42.208965857, + "longitude": -8.757020567, "lines": [ - "C3i", - "4A", - "4C", + "5A", "5B", - "10", - "11", - "12A", - "15A", - "N1", - "U1" + "13", + "N4", + "U1", + "H", + "PSA 1", + "PSA 4" ] }, { - "stopId": 1270, + "stopId": "vitrasa:14361", "name": { - "original": "Avda. de Castelao, 50" + "original": "Rúa das Teixugueiras, 17" }, - "latitude": 42.218704937, - "longitude": -8.74254446, + "latitude": 42.209770472, + "longitude": -8.755295907, "lines": [ - "C3d", - "4A", - "4C", + "5A", "5B", - "10", - "12A", "13", "15A", + "N4", + "U1", + "H", "PSA 1", "PSA 4" ] }, { - "stopId": 1280, + "stopId": "vitrasa:14362", "name": { - "original": "Avda. de Castelao, 41" + "original": "Avda. de Samil, 101" }, - "latitude": 42.218523315, - "longitude": -8.74223465, + "latitude": 42.202937872, + "longitude": -8.776830486, "lines": [ - "C3i", - "4A", + "C3d", "4C", - "10", - "11", - "12A", - "15A", - "N1", + "10" + ] + }, + { + "stopId": "vitrasa:14364", + "name": { + "original": "Estrada das Plantas (fronte Cidade Deportiva)" + }, + "latitude": 42.175757186, + "longitude": -8.671074371, + "lines": [ + "15C" + ] + }, + { + "stopId": "vitrasa:14365", + "name": { + "original": "Estrada das Plantas (Viveiros)" + }, + "latitude": 42.181650197, + "longitude": -8.667515723, + "lines": [ + "15C" + ] + }, + { + "stopId": "vitrasa:14372", + "name": { + "original": "Barrio da Salgueira, 22" + }, + "latitude": 42.221887526, + "longitude": -8.720011371, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:14376", + "name": { + "original": "Rúa da Pateira, 20" + }, + "latitude": 42.226612651, + "longitude": -8.699658408, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14377", + "name": { + "original": "Rúa da Pateira, 5" + }, + "latitude": 42.226582661, + "longitude": -8.700385762, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14378", + "name": { + "original": "Rúa Molais, 83" + }, + "latitude": 42.22396201, + "longitude": -8.653340726, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14381", + "name": { + "original": "Rúa do Abade Juan de Bastos, 6" + }, + "latitude": 42.195647685, + "longitude": -8.728974153, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14383", + "name": { + "original": "Estrada Clara Campoamor (cruce Estrada do Portal)" + }, + "latitude": 42.174718265, + "longitude": -8.713684656, + "lines": [ + "A", "U1" ] }, { - "stopId": 1290, + "stopId": "vitrasa:14384", "name": { - "original": "Avda. de Castelao, 54" + "original": "Estrada Clara Campoamor (Parque Tecnolóxico)" }, - "latitude": 42.218158263, - "longitude": -8.745797727, + "latitude": 42.175073486, + "longitude": -8.713494654, + "lines": [ + "A", + "U1" + ] + }, + { + "stopId": "vitrasa:14385", + "name": { + "original": "Rúa da Vista do Mar, 45" + }, + "latitude": 42.240712912, + "longitude": -8.6919418, "lines": [ - "C3d", "4A", - "4C", - "5B", - "10", - "12A", - "13", - "15A", - "N4", - "PSA 1", - "PSA 4" + "24" ] }, { - "stopId": 1300, + "stopId": "vitrasa:14386", "name": { - "original": "Avda. de Castelao, 68" + "original": "Rúa da Vista do Mar (Embalse)" }, - "latitude": 42.217466378, - "longitude": -8.751245499, + "latitude": 42.238020208, + "longitude": -8.691543884, "lines": [ - "C3d", "4A", - "4C", + "24" + ] + }, + { + "stopId": "vitrasa:14387", + "name": { + "original": "Rúa da Vista do Mar, 1" + }, + "latitude": 42.237167043, + "longitude": -8.693243792, + "lines": [ + "4A", + "24" + ] + }, + { + "stopId": "vitrasa:14388", + "name": { + "original": "Rúa das Teixugueiras, 11" + }, + "latitude": 42.211610124, + "longitude": -8.754550253, + "lines": [ + "5A", "5B", - "10", - "12A", "13", "15A", "N4", + "U1", + "H", "PSA 1", "PSA 4" ] }, { - "stopId": 1310, + "stopId": "vitrasa:14389", "name": { - "original": "Avda. de Castelao, 73" + "original": "Rúa das Teixugueiras, 22" }, - "latitude": 42.217705528, - "longitude": -8.747753325, + "latitude": 42.210212603, + "longitude": -8.755079989, "lines": [ - "C3i", - "4A", - "4C", - "10", - "11", - "12A", - "15A", - "N1", - "N4", - "U1" + "5A", + "5B", + "13", + "N4" ] }, { - "stopId": 1320, + "stopId": "vitrasa:14390", "name": { - "original": "Avda. de Castelao, 87" + "original": "Rúa do Salgueiro (cruce Camiño Sanatorio)" }, - "latitude": 42.217302224, - "longitude": -8.751104752, + "latitude": 42.241570883, + "longitude": -8.655380719, "lines": [ - "C3i", - "10", - "12A", - "N1", - "U1" + "9B", + "28" ] }, { - "stopId": 1330, + "stopId": "vitrasa:14391", "name": { - "original": "Avda. de Castrelos (Pavillón)" + "original": "Rúa do Salgueiro (fronte 38)" }, - "latitude": 42.219553947, - "longitude": -8.732509436, + "latitude": 42.241652296, + "longitude": -8.655302935, "lines": [ - "A", - "16", - "23", + "9B", "27", - "H2" + "28" ] }, { - "stopId": 1340, + "stopId": "vitrasa:14392", "name": { - "original": "Avda. de Castrelos (Parque)" + "original": "Rúa da Pedra Seixa (Colexio)" }, - "latitude": 42.212870645, - "longitude": -8.732131792, + "latitude": 42.209458591, + "longitude": -8.760561083, "lines": [ - "27", - "H2" + "5A" ] }, { - "stopId": 1350, + "stopId": "vitrasa:14393", "name": { - "original": "Avda. de Castrelos, 121" + "original": "Rúa da Pedra Seixa (fronte Colexio)" }, - "latitude": 42.208026488, - "longitude": -8.7312098, + "latitude": 42.209568936, + "longitude": -8.760777001, "lines": [ - "7", - "12B", - "17", - "27" + "5A" ] }, { - "stopId": 1360, + "stopId": "vitrasa:14395", "name": { - "original": "Avda. de Castrelos, 16" + "original": "Estrada de Madrid, 217" }, - "latitude": 42.219613217, - "longitude": -8.732629194, + "latitude": 42.215601037, + "longitude": -8.675477665, "lines": [ - "7", "12B", + "15B", + "15C" + ] + }, + { + "stopId": "vitrasa:14396", + "name": { + "original": "Avda. de García Barbón, 106" + }, + "latitude": 42.239965365, + "longitude": -8.708024282, + "lines": [ + "C3d", + "5B", + "10", "17", - "27", + "31", "H2", - "VTS", - "PTL" + "H3", + "PSA 1" ] }, { - "stopId": 1380, + "stopId": "vitrasa:14397", "name": { - "original": "Avda. de Castrelos, 179" + "original": "Avda. de García Barbón (fronte 104)" }, - "latitude": 42.20533568, - "longitude": -8.730078621, + "latitude": 42.23973713, + "longitude": -8.708397682, "lines": [ - "7", - "12B", + "C3i", + "5B", + "10", "17", - "U1" + "N1", + "H3", + "VTS" ] }, { - "stopId": 1390, + "stopId": "vitrasa:14398", "name": { - "original": "Avda. de Castrelos, 186" + "original": "Avda. da Gran Vía, 116" }, - "latitude": 42.212735556, - "longitude": -8.732314182, + "latitude": 42.22406594, + "longitude": -8.723691036, "lines": [ - "A", - "7", - "12B", - "17", - "27", - "U1", + "C3d", + "13", + "15A", + "23", + "29", "H2", - "H", - "VTS", - "PTL" + "PSA 1" ] }, { - "stopId": 1400, + "stopId": "vitrasa:1440", "name": { - "original": "Avda. de Castrelos, 202" + "original": "Avda. de Castrelos, 339" }, - "latitude": 42.210706683, - "longitude": -8.732237372, + "latitude": 42.198480135, + "longitude": -8.723827649, "lines": [ - "A", - "7", - "12B", - "17", - "27", - "U1", - "H1", - "H2", - "H", - "PTL" + "7" ] }, { - "stopId": 1410, + "stopId": "vitrasa:14401", "name": { - "original": "Avda. de Castrelos, 13" + "original": "Rúa de San Paio (cruce Camiño Barroca)" }, - "latitude": 42.218060161, - "longitude": -8.732450427, + "latitude": 42.21072167, + "longitude": -8.76212542, "lines": [ - "A", - "16", - "23", - "27", - "H2" + "4A", + "12A" ] }, { - "stopId": 1420, + "stopId": "vitrasa:14402", "name": { - "original": "Avda. de Castrelos, 297" + "original": "Rúa de San Paio, 111" }, - "latitude": 42.201440099, - "longitude": -8.726409762, + "latitude": 42.210791203, + "longitude": -8.761940347, "lines": [ - "7" + "12A" ] }, { - "stopId": 1430, + "stopId": "vitrasa:14403", "name": { - "original": "Avda. de Castrelos, 318" + "original": "Rúa de Pedro Alvarado (cruce Camiño das Maceiras)" }, - "latitude": 42.203408408, - "longitude": -8.728817983, + "latitude": 42.25049654, + "longitude": -8.698390035, "lines": [ - "7", - "U1" + "17" ] }, { - "stopId": 1440, + "stopId": "vitrasa:14404", "name": { - "original": "Avda. de Castrelos, 339" + "original": "Rúa do Doutor Corbal, 58" }, - "latitude": 42.198480135, - "longitude": -8.723827649, + "latitude": 42.251785642, + "longitude": -8.696871994, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14406", + "name": { + "original": "Rúa de Enrique Lorenzo, 32" + }, + "latitude": 42.249462772, + "longitude": -8.699772952, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14408", + "name": { + "original": "Rúa de Pedro Alvarado, 5" + }, + "latitude": 42.248885006, + "longitude": -8.698128758, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:14409", + "name": { + "original": "Estrada das Plantas (fronte cruce Avda. do Rebullón)" + }, + "latitude": 42.204188441, + "longitude": -8.670257126, + "lines": [ + "15B", + "15C" + ] + }, + { + "stopId": "vitrasa:14410", + "name": { + "original": "Estrada das Plantas (cruce Avda. do Rebullón)" + }, + "latitude": 42.204639457, + "longitude": -8.670329545, + "lines": [ + "15C" + ] + }, + { + "stopId": "vitrasa:14411", + "name": { + "original": "Rúa de Xeme, 1" + }, + "latitude": 42.205174543, + "longitude": -8.698209134, + "lines": [ + "14" + ] + }, + { + "stopId": "vitrasa:14412", + "name": { + "original": "Rúa de Xeme, 6" + }, + "latitude": 42.20497586, + "longitude": -8.697957006, + "lines": [ + "14" + ] + }, + { + "stopId": "vitrasa:14413", + "name": { + "original": "Estrada da Garrida (cruce Camiño Fabas)" + }, + "latitude": 42.173955568, + "longitude": -8.703050076, "lines": [ "7" ] }, { - "stopId": 1450, + "stopId": "vitrasa:14414", + "name": { + "original": "Avda. de Santa Mariña, 40" + }, + "latitude": 42.221587211, + "longitude": -8.665078444, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14415", + "name": { + "original": "Avda. de Santa Mariña (antes 49)" + }, + "latitude": 42.221557416, + "longitude": -8.665381534, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:14416", + "name": { + "original": "Rúa de Severino Cobas, 118" + }, + "latitude": 42.225468623, + "longitude": -8.691491081, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:14419", + "name": { + "original": "Estrada de Bembrive (cruce Camiño dos Rapadouros)" + }, + "latitude": 42.201138734, + "longitude": -8.688585073, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:14420", + "name": { + "original": "Estrada de Bembrive, 318" + }, + "latitude": 42.201419233, + "longitude": -8.688526069, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:14421", + "name": { + "original": "Estrada das Prantas (fronte Campo de Béisbol)" + }, + "latitude": 42.186683264, + "longitude": -8.669320703, + "lines": [ + "15C" + ] + }, + { + "stopId": "vitrasa:14422", + "name": { + "original": "Estrada das Plantas (Campo de Béisbol)" + }, + "latitude": 42.18695315, + "longitude": -8.669514066, + "lines": [ + "15C" + ] + }, + { + "stopId": "vitrasa:14425", + "name": { + "original": "Avda. do Alcalde Gregorio Espino, 2" + }, + "latitude": 42.232253792, + "longitude": -8.707208575, + "lines": [ + "31" + ] + }, + { + "stopId": "vitrasa:14475", + "name": { + "original": "Rúa de Barcelona, 78" + }, + "latitude": 42.222992354, + "longitude": -8.728300382, + "lines": [ + "C1" + ] + }, + { + "stopId": "vitrasa:1450", "name": { "original": "Avda. de Castrelos, 366" }, @@ -1589,7 +3912,7 @@ ] }, { - "stopId": 1460, + "stopId": "vitrasa:1460", "name": { "original": "Avda. de Castrelos, 396" }, @@ -1601,7 +3924,7 @@ ] }, { - "stopId": 1470, + "stopId": "vitrasa:1470", "name": { "original": "Avda. de Castrelos, 399" }, @@ -1612,7 +3935,7 @@ ] }, { - "stopId": 1480, + "stopId": "vitrasa:1480", "name": { "original": "Avda. de Castrelos, 526" }, @@ -1624,7 +3947,126 @@ ] }, { - "stopId": 1490, + "stopId": "vitrasa:14890", + "name": { + "original": "Rúa das Teixugueiras, 25" + }, + "latitude": 42.207545331, + "longitude": -8.758718406, + "lines": [ + "5B", + "13", + "N4", + "U1", + "H", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:14892", + "name": { + "original": "Rúa do Conde de Torrecedeira, 123" + }, + "latitude": 42.224929414, + "longitude": -8.735414067, + "lines": [ + "C1", + "C3d", + "A", + "9B", + "15C", + "N4", + "H1" + ] + }, + { + "stopId": "vitrasa:14893", + "name": { + "original": "Rúa de Manuel Costas Bastos, 26" + }, + "latitude": 42.243157956, + "longitude": -8.666962176, + "lines": [ + "9B", + "27", + "28" + ] + }, + { + "stopId": "vitrasa:14894", + "name": { + "original": "Avda. do Alcalde Portanet, 8" + }, + "latitude": 42.211736934, + "longitude": -8.733337505, + "lines": [ + "7", + "12B", + "17", + "H1", + "VTS" + ] + }, + { + "stopId": "vitrasa:14895", + "name": { + "original": "Rúa do Areiro (cruce Camiño das Laxes)" + }, + "latitude": 42.241392275, + "longitude": -8.681203235, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14896", + "name": { + "original": "Rúa do Areiro, 93" + }, + "latitude": 42.241385532, + "longitude": -8.681400937, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:14897", + "name": { + "original": "Camiño do Arieiro (fronte 13)" + }, + "latitude": 42.213239161, + "longitude": -8.67854147, + "lines": [ + "31" + ] + }, + { + "stopId": "vitrasa:14898", + "name": { + "original": "Camiño do Arieiro, 13" + }, + "latitude": 42.213239161, + "longitude": -8.678369808, + "lines": [ + "31" + ] + }, + { + "stopId": "vitrasa:14899", + "name": { + "original": "Rúa de López Mora, 33" + }, + "latitude": 42.225485719, + "longitude": -8.730501434, + "lines": [ + "5A", + "5B", + "12A" + ] + }, + { + "stopId": "vitrasa:1490", "name": { "original": "Avda. de Castrelos, 67" }, @@ -1640,7 +4082,135 @@ ] }, { - "stopId": 1500, + "stopId": "vitrasa:14900", + "name": { + "original": "Rúa de Martín Echegaray, 24" + }, + "latitude": 42.217196117, + "longitude": -8.743726669, + "lines": [ + "23", + "N4" + ] + }, + { + "stopId": "vitrasa:14901", + "name": { + "original": "Avda. de Castelao, 1" + }, + "latitude": 42.220211003, + "longitude": -8.734183023, + "lines": [ + "C3i", + "10", + "11", + "15A", + "U1" + ] + }, + { + "stopId": "vitrasa:14903", + "name": { + "original": "Rúa de Pi i Margall, 66" + }, + "latitude": 42.23174719, + "longitude": -8.731081308, + "lines": [ + "VTS" + ] + }, + { + "stopId": "vitrasa:14905", + "name": { + "original": "Camiño da Devesa (Cemiterio)" + }, + "latitude": 42.249981353, + "longitude": -8.667186504, + "lines": [ + "9B" + ] + }, + { + "stopId": "vitrasa:14906", + "name": { + "original": "Rúa da Rabadeira, 6" + }, + "latitude": 42.232479787, + "longitude": -8.654890792, + "lines": [ + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:14907", + "name": { + "original": "Rúa da Rabadeira, 24" + }, + "latitude": 42.233655479, + "longitude": -8.653300242, + "lines": [ + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:14908", + "name": { + "original": "Rúa da Rabadeira, 17" + }, + "latitude": 42.233829075, + "longitude": -8.653458259, + "lines": [ + "9B" + ] + }, + { + "stopId": "vitrasa:14909", + "name": { + "original": "Rúa da Rabadeira, 11" + }, + "latitude": 42.232663198, + "longitude": -8.655097059, + "lines": [ + "9B" + ] + }, + { + "stopId": "vitrasa:14910", + "name": { + "original": "Estrada do Marco, 4" + }, + "latitude": 42.21025095, + "longitude": -8.704036986, + "lines": [ + "H3" + ] + }, + { + "stopId": "vitrasa:14911", + "name": { + "original": "Estrada do Marco, 16" + }, + "latitude": 42.208830737, + "longitude": -8.706971174, + "lines": [ + "H3" + ] + }, + { + "stopId": "vitrasa:150", + "name": { + "original": "Avda. do Alcalde Lavadores, 48" + }, + "latitude": 42.222636676, + "longitude": -8.697201413, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:1500", "name": { "original": "Avda. de Castrelos, 58" }, @@ -1657,7 +4227,51 @@ ] }, { - "stopId": 1510, + "stopId": "vitrasa:15001", + "name": { + "original": "Rúa Regueiro do Forno (Vial C) Centro de Servicios" + }, + "latitude": 42.176036704, + "longitude": -8.709480986, + "lines": [ + "PTL" + ] + }, + { + "stopId": "vitrasa:15002", + "name": { + "original": "PTL 2" + }, + "latitude": 42.177194637, + "longitude": -8.707850807, + "lines": [ + "PTL" + ] + }, + { + "stopId": "vitrasa:15003", + "name": { + "original": "PTL 3" + }, + "latitude": 42.178231278, + "longitude": -8.706474418, + "lines": [ + "PTL" + ] + }, + { + "stopId": "vitrasa:15004", + "name": { + "original": "PTL 4" + }, + "latitude": 42.176503017, + "longitude": -8.710007303, + "lines": [ + "PTL" + ] + }, + { + "stopId": "vitrasa:1510", "name": { "original": "Avda. da Ponte, 80" }, @@ -1669,7 +4283,7 @@ ] }, { - "stopId": 1520, + "stopId": "vitrasa:1520", "name": { "original": "Avda. da Ponte, 83" }, @@ -1681,7 +4295,7 @@ ] }, { - "stopId": 1530, + "stopId": "vitrasa:1530", "name": { "original": "Avda. da Ponte (fronte Grupo S. Gorxal)" }, @@ -1693,7 +4307,7 @@ ] }, { - "stopId": 1540, + "stopId": "vitrasa:1540", "name": { "original": "Avda. da Ponte, 15" }, @@ -1708,7 +4322,7 @@ ] }, { - "stopId": 1550, + "stopId": "vitrasa:1550", "name": { "original": "Avda. da Ponte, 18" }, @@ -1722,7 +4336,7 @@ ] }, { - "stopId": 1560, + "stopId": "vitrasa:1560", "name": { "original": "Avda. da Ponte, 31" }, @@ -1735,7 +4349,7 @@ ] }, { - "stopId": 1570, + "stopId": "vitrasa:1570", "name": { "original": "Avda. da Ponte, 47" }, @@ -1747,7 +4361,7 @@ ] }, { - "stopId": 1580, + "stopId": "vitrasa:1580", "name": { "original": "Avda. da Ponte, 54" }, @@ -1759,7 +4373,7 @@ ] }, { - "stopId": 1590, + "stopId": "vitrasa:1590", "name": { "original": "Avda. de Galicia (Parque Riouxa)" }, @@ -1770,7 +4384,18 @@ ] }, { - "stopId": 1600, + "stopId": "vitrasa:160", + "name": { + "original": "Avda. do Alcalde Lavadores, 67" + }, + "latitude": 42.222830286, + "longitude": -8.697231476, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:1600", "name": { "original": "Avda. de Galicia, 103" }, @@ -1781,7 +4406,7 @@ ] }, { - "stopId": 1610, + "stopId": "vitrasa:1610", "name": { "original": "Avda. de Galicia, 146" }, @@ -1792,7 +4417,7 @@ ] }, { - "stopId": 1620, + "stopId": "vitrasa:1620", "name": { "original": "Avda. de Galicia, 139" }, @@ -1803,7 +4428,7 @@ ] }, { - "stopId": 1630, + "stopId": "vitrasa:1630", "name": { "original": "Avda. de Galicia, 165" }, @@ -1814,7 +4439,7 @@ ] }, { - "stopId": 1640, + "stopId": "vitrasa:1640", "name": { "original": "Avda. de Galicia, 200" }, @@ -1825,7 +4450,7 @@ ] }, { - "stopId": 1650, + "stopId": "vitrasa:1650", "name": { "original": "Avda. de Galicia, 238" }, @@ -1836,7 +4461,7 @@ ] }, { - "stopId": 1660, + "stopId": "vitrasa:1660", "name": { "original": "Avda. de Galicia, 280" }, @@ -1847,7 +4472,7 @@ ] }, { - "stopId": 1670, + "stopId": "vitrasa:1670", "name": { "original": "Avda. de Galicia, 285" }, @@ -1858,7 +4483,7 @@ ] }, { - "stopId": 1680, + "stopId": "vitrasa:1680", "name": { "original": "Avda. de Galicia (Parque Cruce Balbarda)" }, @@ -1869,7 +4494,7 @@ ] }, { - "stopId": 1690, + "stopId": "vitrasa:1690", "name": { "original": "Avda. de Galicia, 71" }, @@ -1880,7 +4505,18 @@ ] }, { - "stopId": 1710, + "stopId": "vitrasa:170", + "name": { + "original": "Avda. do Alcalde Lavadores, 152" + }, + "latitude": 42.215084316, + "longitude": -8.696854931, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:1710", "name": { "original": "Avda. de Vigo, 6" }, @@ -1891,7 +4527,7 @@ ] }, { - "stopId": 1720, + "stopId": "vitrasa:1720", "name": { "original": "Avda. de Vigo, 95" }, @@ -1902,7 +4538,7 @@ ] }, { - "stopId": 1730, + "stopId": "vitrasa:1730", "name": { "original": "Avda. de Vigo, 129" }, @@ -1913,7 +4549,7 @@ ] }, { - "stopId": 1740, + "stopId": "vitrasa:1740", "name": { "original": "Avda. de Vigo, 120" }, @@ -1924,7 +4560,7 @@ ] }, { - "stopId": 1750, + "stopId": "vitrasa:1750", "name": { "original": "Avda. de Vigo, 161" }, @@ -1935,7 +4571,7 @@ ] }, { - "stopId": 1760, + "stopId": "vitrasa:1760", "name": { "original": "Avda. de Vigo, 201" }, @@ -1946,7 +4582,7 @@ ] }, { - "stopId": 1770, + "stopId": "vitrasa:1770", "name": { "original": "Avda. de Vigo (Alameda de Rosalía de Castro)" }, @@ -1957,7 +4593,7 @@ ] }, { - "stopId": 1780, + "stopId": "vitrasa:1780", "name": { "original": "Avda. de Vigo, 230" }, @@ -1968,7 +4604,7 @@ ] }, { - "stopId": 1790, + "stopId": "vitrasa:1790", "name": { "original": "Avda. de Vigo, 261 (Cuatro Puentes)" }, @@ -1979,7 +4615,18 @@ ] }, { - "stopId": 1800, + "stopId": "vitrasa:180", + "name": { + "original": "Estrada de Valadares, 451" + }, + "latitude": 42.166144986, + "longitude": -8.720162371, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:1800", "name": { "original": "Avda. de Vigo, 266" }, @@ -1990,7 +4637,7 @@ ] }, { - "stopId": 1810, + "stopId": "vitrasa:1810", "name": { "original": "Avda. de Vigo, 320" }, @@ -2001,7 +4648,7 @@ ] }, { - "stopId": 1820, + "stopId": "vitrasa:1820", "name": { "original": "Avda. de Vigo, 49" }, @@ -2012,7 +4659,7 @@ ] }, { - "stopId": 1830, + "stopId": "vitrasa:1830", "name": { "original": "Avda. de Vigo, 11" }, @@ -2023,7 +4670,7 @@ ] }, { - "stopId": 1840, + "stopId": "vitrasa:1840", "name": { "original": "Avda. de Vigo, 72" }, @@ -2034,7 +4681,7 @@ ] }, { - "stopId": 1850, + "stopId": "vitrasa:1850", "name": { "original": "Avda. de Europa (antes Camiño Freixeiro)" }, @@ -2049,7 +4696,7 @@ ] }, { - "stopId": 1860, + "stopId": "vitrasa:1860", "name": { "original": "Avda. de Europa (cruce Rúa da Pardaíña)" }, @@ -2064,7 +4711,7 @@ ] }, { - "stopId": 1870, + "stopId": "vitrasa:1870", "name": { "original": "Avda. de Europa, 102" }, @@ -2077,7 +4724,7 @@ ] }, { - "stopId": 1880, + "stopId": "vitrasa:1880", "name": { "original": "Avda. de Europa (cruce Rúa das Teixugueiras)" }, @@ -2086,7 +4733,6 @@ "lines": [ "C3d", "C3i", - "4A", "4C", "12A", "15A", @@ -2094,7 +4740,7 @@ ] }, { - "stopId": 1890, + "stopId": "vitrasa:1890", "name": { "original": "Avda. de Europa, 23" }, @@ -2103,7 +4749,6 @@ "lines": [ "C3d", "C3i", - "4A", "4C", "12A", "15A", @@ -2111,7 +4756,19 @@ ] }, { - "stopId": 1900, + "stopId": "vitrasa:190", + "name": { + "original": "Rúa de Ángel de Lema, 58" + }, + "latitude": 42.250539537, + "longitude": -8.685179363, + "lines": [ + "C3i", + "10" + ] + }, + { + "stopId": "vitrasa:1900", "name": { "original": "Avda. de Europa (cruce Rúa do Bravo)" }, @@ -2126,7 +4783,7 @@ ] }, { - "stopId": 1910, + "stopId": "vitrasa:1910", "name": { "original": "Avda. de Europa (fronte cruce Rúa do Bravo)" }, @@ -2139,7 +4796,7 @@ ] }, { - "stopId": 1920, + "stopId": "vitrasa:1920", "name": { "original": "Avda. de Europa, 101" }, @@ -2154,7 +4811,7 @@ ] }, { - "stopId": 1930, + "stopId": "vitrasa:1930", "name": { "original": "Estrada de Madrid (fronte Seminario)" }, @@ -2168,7 +4825,7 @@ ] }, { - "stopId": 1940, + "stopId": "vitrasa:1940", "name": { "original": "Avda. de Madrid, 136" }, @@ -2181,7 +4838,19 @@ ] }, { - "stopId": 1950, + "stopId": "vitrasa:195", + "name": { + "original": "Rúa de Ángel de Lema, 247" + }, + "latitude": 42.256624708, + "longitude": -8.677490797, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:1950", "name": { "original": "Avda. de Madrid, 124" }, @@ -2194,7 +4863,7 @@ ] }, { - "stopId": 1960, + "stopId": "vitrasa:1960", "name": { "original": "Avda. de Madrid, 62" }, @@ -2209,7 +4878,7 @@ ] }, { - "stopId": 1970, + "stopId": "vitrasa:1970", "name": { "original": "Avda. de Madrid, 57" }, @@ -2222,7 +4891,7 @@ ] }, { - "stopId": 1980, + "stopId": "vitrasa:1980", "name": { "original": "Estrada de Madrid (Seminario)" }, @@ -2236,7 +4905,7 @@ ] }, { - "stopId": 1990, + "stopId": "vitrasa:1990", "name": { "original": "Avda. de Madrid, 110" }, @@ -2250,7 +4919,30 @@ ] }, { - "stopId": 2000, + "stopId": "vitrasa:20", + "name": { + "original": "Rúa do Abade Juan de Bastos (fronte Asociación Veciños)" + }, + "latitude": 42.187593499, + "longitude": -8.741246641, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:200", + "name": { + "original": "Rúa de Ángel de Lema, 100" + }, + "latitude": 42.252115803, + "longitude": -8.683374373, + "lines": [ + "C3i", + "10" + ] + }, + { + "stopId": "vitrasa:2000", "name": { "original": "Avda. de Madrid, 133" }, @@ -2263,7 +4955,754 @@ ] }, { - "stopId": 2010, + "stopId": "vitrasa:20009", + "name": { + "original": "Estrada Herville, 16" + }, + "latitude": 42.154843231, + "longitude": -8.67357438, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20010", + "name": { + "original": "Avda. de Balaídos, 69" + }, + "latitude": 42.212824845, + "longitude": -8.737161077, + "lines": [ + "A", + "16", + "23", + "H" + ] + }, + { + "stopId": "vitrasa:20011", + "name": { + "original": "Avda. de Balaídos, 11" + }, + "latitude": 42.213089061, + "longitude": -8.733392573, + "lines": [ + "A", + "16", + "23", + "H" + ] + }, + { + "stopId": "vitrasa:20012", + "name": { + "original": "Avda. de Castrelos, 33" + }, + "latitude": 42.215888032, + "longitude": -8.732331627, + "lines": [ + "A", + "16", + "23", + "27", + "H2" + ] + }, + { + "stopId": "vitrasa:20013", + "name": { + "original": "Avda. de Castrelos, 116" + }, + "latitude": 42.215905917, + "longitude": -8.732471102, + "lines": [ + "7", + "12B", + "17", + "27", + "H2", + "VTS", + "PTL" + ] + }, + { + "stopId": "vitrasa:20018", + "name": { + "original": "Estrada Herville, 70" + }, + "latitude": 42.151451604, + "longitude": -8.673803367, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20019", + "name": { + "original": "Subida aos Padróns, 165" + }, + "latitude": 42.149222193, + "longitude": -8.679363987, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20020", + "name": { + "original": "Subida aos Padróns (cruce Parque Forestal)" + }, + "latitude": 42.151606055, + "longitude": -8.679299082, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20021", + "name": { + "original": "Subida aos Padróns (fronte 34)" + }, + "latitude": 42.152770176, + "longitude": -8.686251828, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20022", + "name": { + "original": "Rúa da Vía Norte (Hospital)" + }, + "latitude": 42.234622237, + "longitude": -8.707758443, + "lines": [ + "24" + ] + }, + { + "stopId": "vitrasa:20023", + "name": { + "original": "Rúa da Vía Norte - Est. Intermodal - C.C." + }, + "latitude": 42.234062973, + "longitude": -8.712195759, + "lines": [ + "24" + ] + }, + { + "stopId": "vitrasa:20024", + "name": { + "original": "Rúa das Teixugueiras, 34" + }, + "latitude": 42.207634066, + "longitude": -8.758920861, + "lines": [ + "5B", + "13", + "N4" + ] + }, + { + "stopId": "vitrasa:20025", + "name": { + "original": "Rúa das Teixugueiras, 38" + }, + "latitude": 42.206553268, + "longitude": -8.760122491, + "lines": [ + "5B", + "13", + "N4" + ] + }, + { + "stopId": "vitrasa:20026", + "name": { + "original": "Rúa das Teixugueiras, 29" + }, + "latitude": 42.206488366, + "longitude": -8.759906624, + "lines": [ + "5B", + "13", + "N4", + "U1", + "H", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:20027", + "name": { + "original": "Avda. de Castelao, 64" + }, + "latitude": 42.217691983, + "longitude": -8.749585877, + "lines": [ + "C3d", + "4A", + "4C", + "5B", + "10", + "12A", + "13", + "15A", + "N4", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:20029", + "name": { + "original": "Subida á Madroa (fronte Campo Fútbol)" + }, + "latitude": 42.245921506, + "longitude": -8.673014474, + "lines": [ + "9B", + "28" + ] + }, + { + "stopId": "vitrasa:20030", + "name": { + "original": "Subida á Madroa (Campo Fútbol)" + }, + "latitude": 42.247859379, + "longitude": -8.674363625, + "lines": [ + "9B", + "28" + ] + }, + { + "stopId": "vitrasa:20041", + "name": { + "original": "Rúa da Cabalaría, 91" + }, + "latitude": 42.233622103, + "longitude": -8.689209566, + "lines": [ + "27", + "28" + ] + }, + { + "stopId": "vitrasa:20042", + "name": { + "original": "Rúa da Cabalaría, 148" + }, + "latitude": 42.233723398, + "longitude": -8.689094231, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:20043", + "name": { + "original": "Rúa do Areiro, 20" + }, + "latitude": 42.236036786, + "longitude": -8.686656768, + "lines": [ + "28" + ] + }, + { + "stopId": "vitrasa:20044", + "name": { + "original": "Rúa de Martín Echegaray, 7" + }, + "latitude": 42.215220874, + "longitude": -8.742680967, + "lines": [ + "23", + "N4" + ] + }, + { + "stopId": "vitrasa:20045", + "name": { + "original": "Rúa de Xestoso, 4" + }, + "latitude": 42.200532989, + "longitude": -8.674075447, + "lines": [ + "15B" + ] + }, + { + "stopId": "vitrasa:20046", + "name": { + "original": "Rúa de Xestoso, 12" + }, + "latitude": 42.201968444, + "longitude": -8.67477879, + "lines": [ + "15B" + ] + }, + { + "stopId": "vitrasa:20047", + "name": { + "original": "Rúa do Xestoso, 72" + }, + "latitude": 42.204330306, + "longitude": -8.674670483, + "lines": [ + "15B" + ] + }, + { + "stopId": "vitrasa:20048", + "name": { + "original": "Avda. de Cesáreo Vázquez (cruce Camiño Amariz Lourenzo)" + }, + "latitude": 42.182684406, + "longitude": -8.802402364, + "lines": [ + "11", + "12A" + ] + }, + { + "stopId": "vitrasa:20049", + "name": { + "original": "Avda. de Cesáreo Vázquez, 62" + }, + "latitude": 42.18238342, + "longitude": -8.802126069, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:20050", + "name": { + "original": "Rúa de Severino Cobas, 186" + }, + "latitude": 42.225550059, + "longitude": -8.686684563, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:20051", + "name": { + "original": "Rúa de Severino Cobas, 89" + }, + "latitude": 42.225652904, + "longitude": -8.686624017, + "lines": [ + "25" + ] + }, + { + "stopId": "vitrasa:20052", + "name": { + "original": "Rúa de Aragón, 21" + }, + "latitude": 42.232748414, + "longitude": -8.702539655, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:20053", + "name": { + "original": "Rúa de Ángel de Lema (cruce Paraixal)" + }, + "latitude": 42.248962858, + "longitude": -8.688272303, + "lines": [ + "C3i", + "10" + ] + }, + { + "stopId": "vitrasa:20054", + "name": { + "original": "Rúa de Ángel de Lema, 33" + }, + "latitude": 42.248897377, + "longitude": -8.689150714, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:20057", + "name": { + "original": "Estación Ferrocarril Guixar" + }, + "latitude": 42.238843911, + "longitude": -8.713008504, + "lines": [ + "A", + "5B", + "16", + "24" + ] + }, + { + "stopId": "vitrasa:20058", + "name": { + "original": "Rúa do Canceleiro, 6" + }, + "latitude": 42.238435471, + "longitude": -8.714413687, + "lines": [ + "A", + "5B", + "16", + "24" + ] + }, + { + "stopId": "vitrasa:20059", + "name": { + "original": "Rúa de Manuel Álvarez (fronte 10)" + }, + "latitude": 42.222745522, + "longitude": -8.677932515, + "lines": [ + "25", + "31", + "H3" + ] + }, + { + "stopId": "vitrasa:20060", + "name": { + "original": "Rúa de Manuel Álvarez, 10" + }, + "latitude": 42.22282586, + "longitude": -8.678077606, + "lines": [ + "25", + "31", + "H3" + ] + }, + { + "stopId": "vitrasa:20061", + "name": { + "original": "Rúa de Martín Echegaray (Colexio)" + }, + "latitude": 42.217568173, + "longitude": -8.744018511, + "lines": [ + "23", + "N4" + ] + }, + { + "stopId": "vitrasa:20062", + "name": { + "original": "Avda. de Beiramar, 1" + }, + "latitude": 42.236143706, + "longitude": -8.73180718, + "lines": [ + "10", + "15B" + ] + }, + { + "stopId": "vitrasa:20071", + "name": { + "original": "Rúa de Xestoso (fronte 105)" + }, + "latitude": 42.205511653, + "longitude": -8.672824803, + "lines": [ + "15B" + ] + }, + { + "stopId": "vitrasa:20072", + "name": { + "original": "Camiño do Pouso" + }, + "latitude": 42.196643694, + "longitude": -8.671663218, + "lines": [ + "15B" + ] + }, + { + "stopId": "vitrasa:20075", + "name": { + "original": "Avda. de Castelao, 65" + }, + "latitude": 42.218011215, + "longitude": -8.745369728, + "lines": [ + "C3i", + "4A", + "4C", + "10", + "11", + "12A", + "15A", + "N1", + "N4", + "U1" + ] + }, + { + "stopId": "vitrasa:20076", + "name": { + "original": "Avda. de Castelao, 25" + }, + "latitude": 42.21901679, + "longitude": -8.739919147, + "lines": [ + "C3i", + "4A", + "4C", + "10", + "11", + "12A", + "15A", + "N1", + "U1" + ] + }, + { + "stopId": "vitrasa:20077", + "name": { + "original": "Avda. de Castelao, 40" + }, + "latitude": 42.219259727, + "longitude": -8.739809435, + "lines": [ + "C3d", + "4A", + "4C", + "5B", + "10", + "12A", + "13", + "15A", + "PSA 1", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:20078", + "name": { + "original": "Avda. das Camelias, 3" + }, + "latitude": 42.233341329, + "longitude": -8.728967219, + "lines": [ + "4A", + "4C", + "11", + "12B", + "17", + "27", + "N1" + ] + }, + { + "stopId": "vitrasa:20079", + "name": { + "original": "Avda. das Camelias, 8" + }, + "latitude": 42.23341294, + "longitude": -8.729045156, + "lines": [ + "4A", + "4C", + "5B", + "7", + "12A", + "12B", + "17", + "27", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:20080", + "name": { + "original": "Avda. de Santa Mariña, 68" + }, + "latitude": 42.221674556, + "longitude": -8.660937347, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:20081", + "name": { + "original": "Subida aos Padróns (cruce Camiño da Chan da Rabicha)" + }, + "latitude": 42.151852858, + "longitude": -8.684956786, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20082", + "name": { + "original": "Avda. de Santa Mariña (fronte 66)" + }, + "latitude": 42.221758032, + "longitude": -8.661135597, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:20083", + "name": { + "original": "Rúa Castañal, 6" + }, + "latitude": 42.188074669, + "longitude": -8.701928367, + "lines": [ + "27" + ] + }, + { + "stopId": "vitrasa:20084", + "name": { + "original": "Rúa Castañal, 26" + }, + "latitude": 42.18711079, + "longitude": -8.699519743, + "lines": [ + "27" + ] + }, + { + "stopId": "vitrasa:20085", + "name": { + "original": "Rúa Castañal (cruce Camiño das Presas)" + }, + "latitude": 42.185852445, + "longitude": -8.696410892, + "lines": [ + "27" + ] + }, + { + "stopId": "vitrasa:20086", + "name": { + "original": "Estrada dos Seixiños, 67" + }, + "latitude": 42.190645281, + "longitude": -8.696150583, + "lines": [ + "27" + ] + }, + { + "stopId": "vitrasa:20087", + "name": { + "original": "Estrada dos Seixiños, 23" + }, + "latitude": 42.194639373, + "longitude": -8.696795357, + "lines": [ + "27" + ] + }, + { + "stopId": "vitrasa:20089", + "name": { + "original": "Porriño - Padre Seixas ©" + }, + "latitude": 42.213044566, + "longitude": -8.751396835, + "lines": [ + "16" + ] + }, + { + "stopId": "vitrasa:20091", + "name": { + "original": "Camiño da Miragaia, 11-13" + }, + "latitude": 42.238164803, + "longitude": -8.711212761, + "lines": [ + "A", + "5B", + "16", + "24" + ] + }, + { + "stopId": "vitrasa:20094", + "name": { + "original": "Rúa das Mantelas (fronte 63)" + }, + "latitude": 42.22518736, + "longitude": -8.717399288, + "lines": [ + "18A" + ] + }, + { + "stopId": "vitrasa:20095", + "name": { + "original": "Estrada Vella de Madrid, 107A" + }, + "latitude": 42.219212419, + "longitude": -8.685836356, + "lines": [ + "12A", + "12B", + "13", + "H3" + ] + }, + { + "stopId": "vitrasa:20096", + "name": { + "original": "Estrada Vella de Madrid (fronte 107A)" + }, + "latitude": 42.219128991, + "longitude": -8.685753208, + "lines": [ + "12A", + "12B", + "13", + "U2", + "H3" + ] + }, + { + "stopId": "vitrasa:20099", + "name": { + "original": "Rúa de Camilo Veiga, 48" + }, + "latitude": 42.222390674, + "longitude": -8.752507356, + "lines": [ + "C3i", + "15B", + "15C", + "N1" + ] + }, + { + "stopId": "vitrasa:2010", "name": { "original": "Avda. de Madrid, 195" }, @@ -2276,7 +5715,816 @@ ] }, { - "stopId": 2020, + "stopId": "vitrasa:20100", + "name": { + "original": "Rúa de Camilo Veiga, 6" + }, + "latitude": 42.223195763, + "longitude": -8.749650702, + "lines": [ + "C3i", + "15B", + "15C", + "N1" + ] + }, + { + "stopId": "vitrasa:20102", + "name": { + "original": "H. A. Cunqueiro (Porta Principal)" + }, + "latitude": 42.191034002, + "longitude": -8.714303116, + "lines": [ + "6", + "12B", + "18H", + "27", + "H1", + "H2", + "H3", + "H" + ] + }, + { + "stopId": "vitrasa:20103", + "name": { + "original": "Avda. do Fragoso, 21" + }, + "latitude": 42.218946899, + "longitude": -8.733670293, + "lines": [ + "7", + "12B", + "17", + "N4", + "H1" + ] + }, + { + "stopId": "vitrasa:20104", + "name": { + "original": "Rúa de Emilia Pardo Bazán, 134" + }, + "latitude": 42.220938435, + "longitude": -8.709621883, + "lines": [ + "14" + ] + }, + { + "stopId": "vitrasa:20105", + "name": { + "original": "Rúa de Emilia Pardo Bazán, 121" + }, + "latitude": 42.221232035, + "longitude": -8.709808647, + "lines": [ + "14" + ] + }, + { + "stopId": "vitrasa:20107", + "name": { + "original": "Estrada do Porto (Lavadero)" + }, + "latitude": 42.188244696, + "longitude": -8.703164368, + "lines": [ + "6", + "27" + ] + }, + { + "stopId": "vitrasa:20110", + "name": { + "original": "Rúa de Manuel Castro, 10" + }, + "latitude": 42.213797254, + "longitude": -8.741472696, + "lines": [ + "23", + "N4" + ] + }, + { + "stopId": "vitrasa:20111", + "name": { + "original": "H. A. Cunqueiro (Hospital de Día)" + }, + "latitude": 42.187585838, + "longitude": -8.716278919, + "lines": [ + "A", + "6", + "12B", + "18H", + "27", + "H1", + "H2", + "H3", + "H" + ] + }, + { + "stopId": "vitrasa:20112", + "name": { + "original": "H. A. Cunqueiro (Urxencias)" + }, + "latitude": 42.188578188, + "longitude": -8.713087125, + "lines": [ + "6", + "12B", + "18H", + "H1", + "H3", + "H" + ] + }, + { + "stopId": "vitrasa:20113", + "name": { + "original": "Praza de América, 3 (Dirección Hospital)" + }, + "latitude": 42.220876566, + "longitude": -8.733367644, + "lines": [ + "12B", + "N4", + "H1", + "H2", + "PTL" + ] + }, + { + "stopId": "vitrasa:20114", + "name": { + "original": "Estrada do Porto (fronte Lavadero)" + }, + "latitude": 42.18846205, + "longitude": -8.703352711, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:20115", + "name": { + "original": "Estrada do Porto (fronte cruce Rúa das Sueiras)" + }, + "latitude": 42.190100441, + "longitude": -8.705453204, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:20116", + "name": { + "original": "Estrada da Coutada-Beade, 2" + }, + "latitude": 42.192037327, + "longitude": -8.70573732, + "lines": [ + "6", + "27" + ] + }, + { + "stopId": "vitrasa:20117", + "name": { + "original": "Estrada do Porto (cruce Camiño do Frascuelo)" + }, + "latitude": 42.191616209, + "longitude": -8.706277831, + "lines": [ + "6", + "27" + ] + }, + { + "stopId": "vitrasa:20118", + "name": { + "original": "Rúa Conde de Gondomar" + }, + "latitude": 42.228358488, + "longitude": -8.719490904, + "lines": [ + "H2" + ] + }, + { + "stopId": "vitrasa:20119", + "name": { + "original": "H. A. Cunqueiro (chegada)" + }, + "latitude": 42.190930878, + "longitude": -8.71409354, + "lines": [ + "6", + "12B", + "H1", + "H3" + ] + }, + { + "stopId": "vitrasa:20124", + "name": { + "original": "Estrada Clara Campoamor, 6" + }, + "latitude": 42.208989468, + "longitude": -8.729330619, + "lines": [ + "A", + "12B", + "U1", + "H1", + "H2", + "H", + "PTL" + ] + }, + { + "stopId": "vitrasa:20125", + "name": { + "original": "Estrada Clara Campoamor (fronte 6)" + }, + "latitude": 42.209126911, + "longitude": -8.729344197, + "lines": [ + "12B", + "H1", + "H2" + ] + }, + { + "stopId": "vitrasa:20126", + "name": { + "original": "Estrada Clara Campoamor (Rotonda HAC)" + }, + "latitude": 42.190252452, + "longitude": -8.717998617, + "lines": [ + "12B", + "18H", + "H1", + "H2" + ] + }, + { + "stopId": "vitrasa:20127", + "name": { + "original": "Estrada Clara Campoamor (fronte Rotonda HAC)" + }, + "latitude": 42.19007538, + "longitude": -8.718125045, + "lines": [ + "A", + "12B", + "18H", + "27", + "U1", + "H1", + "H2", + "H", + "PTL" + ] + }, + { + "stopId": "vitrasa:20130", + "name": { + "original": "Parque Forestal de Zamáns (Proba Andaina)" + }, + "latitude": 42.152788309, + "longitude": -8.681902684, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20132", + "name": { + "original": "Avda. de Galicia, 341" + }, + "latitude": 42.260473187, + "longitude": -8.67881466, + "lines": [ + "C3i" + ] + }, + { + "stopId": "vitrasa:20136", + "name": { + "original": "Avda. de E. Martínez Garrido, 98" + }, + "latitude": 42.225764699, + "longitude": -8.704499864, + "lines": [ + "4C", + "23", + "31", + "N4", + "PSA 4", + "VTS" + ] + }, + { + "stopId": "vitrasa:20137", + "name": { + "original": "Camiño da Devesa (Asociación Veciños)" + }, + "latitude": 42.246563041, + "longitude": -8.669395817, + "lines": [ + "9B" + ] + }, + { + "stopId": "vitrasa:20139", + "name": { + "original": "Estrada Matamá Pazo (fronte 162)" + }, + "latitude": 42.199144892, + "longitude": -8.758506717, + "lines": [ + "29" + ] + }, + { + "stopId": "vitrasa:20141", + "name": { + "original": "Avda. da Ponte (fronte Vigo Memorial)" + }, + "latitude": 42.21057897, + "longitude": -8.671171189, + "lines": [ + "12B", + "15B", + "15C" + ] + }, + { + "stopId": "vitrasa:20142", + "name": { + "original": "Camiño do Outeiro, 3" + }, + "latitude": 42.200738188, + "longitude": -8.714882876, + "lines": [ + "18B" + ] + }, + { + "stopId": "vitrasa:20143", + "name": { + "original": "Rúa das Teixugueiras (fronte 1)" + }, + "latitude": 42.215448094, + "longitude": -8.756474306, + "lines": [ + "15A" + ] + }, + { + "stopId": "vitrasa:20154", + "name": { + "original": "Rúa de Ramiro Pascual (fronte 127)" + }, + "latitude": 42.192089689, + "longitude": -8.709245389, + "lines": [ + "27" + ] + }, + { + "stopId": "vitrasa:20155", + "name": { + "original": "Rúa de Ramiro Pascual, 131" + }, + "latitude": 42.19217626, + "longitude": -8.708899009, + "lines": [ + "27" + ] + }, + { + "stopId": "vitrasa:20156", + "name": { + "original": "Económicas e Empresariais (CUVI 2)" + }, + "latitude": 42.169627618, + "longitude": -8.67984145, + "lines": [ + "A", + "15C" + ] + }, + { + "stopId": "vitrasa:20157", + "name": { + "original": "Estrada do Porto, 88" + }, + "latitude": 42.185615419, + "longitude": -8.702424678, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:20158", + "name": { + "original": "Estrada do Porto, 81" + }, + "latitude": 42.185593055, + "longitude": -8.702377974, + "lines": [ + "6" + ] + }, + { + "stopId": "vitrasa:20159", + "name": { + "original": "Estrada de Valadares, 571" + }, + "latitude": 42.160348044, + "longitude": -8.718706355, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20160", + "name": { + "original": "Estrada de Valadares, 522" + }, + "latitude": 42.160066796, + "longitude": -8.718938239, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20166", + "name": { + "original": "Camiño da Brea, 2" + }, + "latitude": 42.202134841, + "longitude": -8.70572793, + "lines": [ + "18A", + "18B" + ] + }, + { + "stopId": "vitrasa:20167", + "name": { + "original": "Camiño da Brea, 3" + }, + "latitude": 42.202095058, + "longitude": -8.705814233, + "lines": [ + "18A", + "18B" + ] + }, + { + "stopId": "vitrasa:20168", + "name": { + "original": "Estrada do Freixo (despois 118)" + }, + "latitude": 42.173596087, + "longitude": -8.730918928, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20169", + "name": { + "original": "Estrada do Freixo (despois 235)" + }, + "latitude": 42.173616782, + "longitude": -8.730810863, + "lines": [ + "7" + ] + }, + { + "stopId": "vitrasa:20170", + "name": { + "original": "Rúa de Álvaro Cunqueiro, 4" + }, + "latitude": 42.224544805, + "longitude": -8.730413561, + "lines": [ + "5A", + "5B", + "12A" + ] + }, + { + "stopId": "vitrasa:20171", + "name": { + "original": "Estrada Clara Campoamor (cruce Camiño da Pousa)" + }, + "latitude": 42.204380762, + "longitude": -8.726688445, + "lines": [ + "12B", + "H1", + "H2" + ] + }, + { + "stopId": "vitrasa:20172", + "name": { + "original": "Estrada Clara Campoamor (cruce Camiño da Nogueira)" + }, + "latitude": 42.203736336, + "longitude": -8.726617869, + "lines": [ + "A", + "12B", + "U1", + "H1", + "H2", + "H", + "PTL" + ] + }, + { + "stopId": "vitrasa:20173", + "name": { + "original": "Avda. de Castrelos, 502" + }, + "latitude": 42.192504056, + "longitude": -8.721215121, + "lines": [ + "7", + "U1" + ] + }, + { + "stopId": "vitrasa:20174", + "name": { + "original": "Baixada ao Pontillón S/N" + }, + "latitude": 42.21519917, + "longitude": -8.726793773, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:20177", + "name": { + "original": "Rúa de Pizarro, 16" + }, + "latitude": 42.230767817, + "longitude": -8.715105964, + "lines": [ + "C3i", + "6", + "11", + "15A", + "23", + "25", + "28" + ] + }, + { + "stopId": "vitrasa:20178", + "name": { + "original": "Estrada de Camposancos (cruce Camiño da Estea)" + }, + "latitude": 42.172412443, + "longitude": -8.799591567, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:20180", + "name": { + "original": "Rúa do Reiseñor, 10" + }, + "latitude": 42.229527407, + "longitude": -8.70843784, + "lines": [ + "H2" + ] + }, + { + "stopId": "vitrasa:20186", + "name": { + "original": "Rúa da Rabadeira, 71" + }, + "latitude": 42.23755404, + "longitude": -8.651558138, + "lines": [ + "9B" + ] + }, + { + "stopId": "vitrasa:20187", + "name": { + "original": "Rúa da Rabadeira, 46" + }, + "latitude": 42.237422128, + "longitude": -8.65153195, + "lines": [ + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:20188", + "name": { + "original": "Rúa da Saa (fronte 43)" + }, + "latitude": 42.201670402, + "longitude": -8.708928464, + "lines": [ + "18B", + "H3" + ] + }, + { + "stopId": "vitrasa:20189", + "name": { + "original": "Rúa da Saa, 10" + }, + "latitude": 42.201625853, + "longitude": -8.712945043, + "lines": [ + "18B", + "H3" + ] + }, + { + "stopId": "vitrasa:20190", + "name": { + "original": "Avda. das Camelias (fronte Praza do Rei)" + }, + "latitude": 42.234906013, + "longitude": -8.72662052, + "lines": [ + "4A", + "4C", + "11", + "12B", + "17", + "27", + "N1" + ] + }, + { + "stopId": "vitrasa:20191", + "name": { + "original": "Rúa das Figueiras, 200" + }, + "latitude": 42.229676205, + "longitude": -8.657383392, + "lines": [ + "15A", + "25" + ] + }, + { + "stopId": "vitrasa:20192", + "name": { + "original": "Rúa de Colón, 26" + }, + "latitude": 42.237168511, + "longitude": -8.720373767, + "lines": [ + "4A", + "4C", + "5B", + "7", + "12B", + "16", + "17", + "24", + "PSA 4" + ] + }, + { + "stopId": "vitrasa:20193", + "name": { + "original": "Rúa de Policarpo Sanz, 25" + }, + "latitude": 42.23767601188501, + "longitude": -8.721582630122455, + "lines": [ + "C3i", + "A", + "5A", + "5B", + "6", + "9B", + "10", + "11", + "15B", + "15C", + "28", + "N1", + "N4", + "H1", + "VTS" + ], + "amenities": [ + "shelter", + "display" + ] + }, + { + "stopId": "vitrasa:20194", + "name": { + "original": "Rúa de Cánovas del Castillo, 28" + }, + "latitude": 42.240364985, + "longitude": -8.724530974, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:20195", + "name": { + "original": "Praza de Compostela (fronte 35)" + }, + "latitude": 42.2393606, + "longitude": -8.724131464, + "lines": [ + "C3i", + "A", + "5A", + "5B", + "6", + "9B", + "10", + "11", + "15B", + "15C", + "28", + "N1", + "N4", + "H1", + "VTS" + ] + }, + { + "stopId": "vitrasa:20196", + "name": { + "original": "Estrada de Camposancos, 498" + }, + "latitude": 42.175325155, + "longitude": -8.799594139, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:20197", + "name": { + "original": "Rúa de Pi i Margall, 3-5" + }, + "latitude": 42.23558703, + "longitude": -8.728830897, + "lines": [ + "5B", + "12A" + ] + }, + { + "stopId": "vitrasa:20198", + "name": { + "original": "Rúa de Policarpo Sanz, 26" + }, + "latitude": 42.237533428, + "longitude": -8.722195046, + "lines": [ + "A" + ], + "amenities": [ + "shelter" + ] + }, + { + "stopId": "vitrasa:20199", + "name": { + "original": "Rúa de Puerto Rico, 12" + }, + "latitude": 42.228802205, + "longitude": -8.718136653, + "lines": [ + "H2" + ] + }, + { + "stopId": "vitrasa:2020", "name": { "original": "Avda. de Madrid, 2" }, @@ -2290,7 +6538,209 @@ ] }, { - "stopId": 2030, + "stopId": "vitrasa:20202", + "name": { + "original": "Estación Marítima" + }, + "latitude": 42.2404374, + "longitude": -8.726048008, + "lines": [ + "TUR" + ] + }, + { + "stopId": "vitrasa:20203", + "name": { + "original": "Avda. da Gran Vía, 47" + }, + "latitude": 42.230881062, + "longitude": -8.718397577, + "lines": [ + "7", + "12B", + "14", + "16", + "18A", + "18B", + "18H" + ] + }, + { + "stopId": "vitrasa:20206", + "name": { + "original": "Rúa do Marqués de Valladares (fronte 19)" + }, + "latitude": 42.238271922, + "longitude": -8.723353532, + "lines": [ + "C1", + "C3d", + "A", + "5A", + "9B", + "10", + "15B", + "15C", + "28", + "N4", + "H1" + ] + }, + { + "stopId": "vitrasa:20208", + "name": { + "original": "Rúa de Colón, 12" + }, + "latitude": 42.238028627, + "longitude": -8.720556548, + "lines": [ + "C1", + "A", + "5A", + "9B", + "15B", + "15C", + "28", + "N4", + "H1" + ] + }, + { + "stopId": "vitrasa:20209", + "name": { + "original": "Avda. do Alcalde Portanet, 23" + }, + "latitude": 42.211481651, + "longitude": -8.734440746, + "lines": [ + "H1" + ] + }, + { + "stopId": "vitrasa:20210", + "name": { + "original": "Estrada de Camposancos, 108" + }, + "latitude": 42.19824056, + "longitude": -8.763182189, + "lines": [ + "11", + "29" + ] + }, + { + "stopId": "vitrasa:20211", + "name": { + "original": "Estrada de Camposancos, 109" + }, + "latitude": 42.198422825, + "longitude": -8.762538026, + "lines": [ + "11", + "29" + ] + }, + { + "stopId": "vitrasa:20212", + "name": { + "original": "Rúa do Canabido, 18" + }, + "latitude": 42.188388732, + "longitude": -8.805956864, + "lines": [ + "10" + ] + }, + { + "stopId": "vitrasa:20214", + "name": { + "original": "Rúa da República Argentina, 21" + }, + "latitude": 42.237538973, + "longitude": -8.718186356, + "lines": [ + "C3i", + "A", + "5A", + "5B", + "10", + "11", + "15B", + "15C" + ] + }, + { + "stopId": "vitrasa:20215", + "name": { + "original": "Rúa da Coruña, 21" + }, + "latitude": 42.223880296, + "longitude": -8.735520196, + "lines": [ + "A", + "5A", + "5B", + "10", + "11", + "13", + "N4", + "U1", + "H1", + "H", + "VTS" + ] + }, + { + "stopId": "vitrasa:20216", + "name": { + "original": "Avda. de Cesáreo Vázquez (fronte 43)" + }, + "latitude": 42.179747589, + "longitude": -8.802157388, + "lines": [ + "11" + ] + }, + { + "stopId": "vitrasa:20217", + "name": { + "original": "Rosalía de Castro, 4" + }, + "latitude": 42.238229421, + "longitude": -8.719950346, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:20218", + "name": { + "original": "Rúa de Oporto, 28" + }, + "latitude": 42.23721395, + "longitude": -8.716444794, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:20219", + "name": { + "original": "Avda. do Aeroporto (fronte 90)" + }, + "latitude": 42.234830699, + "longitude": -8.695443515, + "lines": [ + "A", + "9B", + "27", + "28" + ] + }, + { + "stopId": "vitrasa:2030", "name": { "original": "Avda. de Madrid, 28" }, @@ -2304,7 +6754,7 @@ ] }, { - "stopId": 2040, + "stopId": "vitrasa:2040", "name": { "original": "Avda. de Madrid (trasera Colexio Hogar)" }, @@ -2317,7 +6767,7 @@ ] }, { - "stopId": 2060, + "stopId": "vitrasa:2060", "name": { "original": "Avda. de Redondela, 122" }, @@ -2328,7 +6778,7 @@ ] }, { - "stopId": 2070, + "stopId": "vitrasa:2070", "name": { "original": "Avda. de Redondela, 109" }, @@ -2339,7 +6789,7 @@ ] }, { - "stopId": 2080, + "stopId": "vitrasa:2080", "name": { "original": "Avda. de Redondela, 19" }, @@ -2350,7 +6800,7 @@ ] }, { - "stopId": 2090, + "stopId": "vitrasa:2090", "name": { "original": "Avda. de Redondela, 32" }, @@ -2361,7 +6811,19 @@ ] }, { - "stopId": 2100, + "stopId": "vitrasa:210", + "name": { + "original": "Rúa de Ángel de Lema, 140" + }, + "latitude": 42.255798748, + "longitude": -8.678507526, + "lines": [ + "C3i", + "10" + ] + }, + { + "stopId": "vitrasa:2100", "name": { "original": "Avda. de Redondela, 47" }, @@ -2372,7 +6834,7 @@ ] }, { - "stopId": 2110, + "stopId": "vitrasa:2110", "name": { "original": "Avda. de Redondela, 70" }, @@ -2383,7 +6845,7 @@ ] }, { - "stopId": 2130, + "stopId": "vitrasa:2130", "name": { "original": "Avda. de Redondela (Instituto)" }, @@ -2394,7 +6856,7 @@ ] }, { - "stopId": 2140, + "stopId": "vitrasa:2140", "name": { "original": "Avda. de Samil (Verbum)" }, @@ -2409,7 +6871,7 @@ ] }, { - "stopId": 2150, + "stopId": "vitrasa:2150", "name": { "original": "Avda. de Samil (fronte Praia da Fonte)" }, @@ -2422,7 +6884,7 @@ ] }, { - "stopId": 2160, + "stopId": "vitrasa:2160", "name": { "original": "Avda. de Samil, 15" }, @@ -2435,7 +6897,7 @@ ] }, { - "stopId": 2170, + "stopId": "vitrasa:2170", "name": { "original": "Avda. de Samil, 35" }, @@ -2448,7 +6910,7 @@ ] }, { - "stopId": 2180, + "stopId": "vitrasa:2180", "name": { "original": "Avda. de Samil, 67" }, @@ -2461,7 +6923,7 @@ ] }, { - "stopId": 2190, + "stopId": "vitrasa:2190", "name": { "original": "Avda. de Samil, 81" }, @@ -2474,7 +6936,19 @@ ] }, { - "stopId": 2200, + "stopId": "vitrasa:220", + "name": { + "original": "Rúa de Ángel de Lema, 163" + }, + "latitude": 42.252694363, + "longitude": -8.68302903, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:2200", "name": { "original": "Avda. de Santa Mariña, 110" }, @@ -2485,7 +6959,7 @@ ] }, { - "stopId": 2210, + "stopId": "vitrasa:2210", "name": { "original": "Avda. de Santa Mariña, 137" }, @@ -2496,7 +6970,7 @@ ] }, { - "stopId": 2220, + "stopId": "vitrasa:2220", "name": { "original": "Avda. de Santa Mariña, 17" }, @@ -2507,7 +6981,7 @@ ] }, { - "stopId": 2230, + "stopId": "vitrasa:2230", "name": { "original": "Avda. de Santa Mariña, 52" }, @@ -2518,7 +6992,7 @@ ] }, { - "stopId": 2240, + "stopId": "vitrasa:2240", "name": { "original": "Avda. de Santa Mariña, 77" }, @@ -2529,7 +7003,7 @@ ] }, { - "stopId": 2250, + "stopId": "vitrasa:2250", "name": { "original": "Avda. de Santa Mariña (cruce Camiño do Narxo)" }, @@ -2540,7 +7014,7 @@ ] }, { - "stopId": 2260, + "stopId": "vitrasa:2260", "name": { "original": "Avda. de Santa Mariña, 18" }, @@ -2551,7 +7025,7 @@ ] }, { - "stopId": 2270, + "stopId": "vitrasa:2270", "name": { "original": "Avda. de Santa Mariña, 103" }, @@ -2562,7 +7036,7 @@ ] }, { - "stopId": 2280, + "stopId": "vitrasa:2280", "name": { "original": "Baixada á Laxe, 31" }, @@ -2575,7 +7049,7 @@ ] }, { - "stopId": 2290, + "stopId": "vitrasa:2290", "name": { "original": "Baixada á Laxe, 44" }, @@ -2588,7 +7062,19 @@ ] }, { - "stopId": 2300, + "stopId": "vitrasa:230", + "name": { + "original": "Rúa de Ángel de Lema, 14" + }, + "latitude": 42.248041601, + "longitude": -8.691024475, + "lines": [ + "C3i", + "10" + ] + }, + { + "stopId": "vitrasa:2300", "name": { "original": "Baixada á Ponte Nova, 13" }, @@ -2599,7 +7085,7 @@ ] }, { - "stopId": 2310, + "stopId": "vitrasa:2310", "name": { "original": "Baixada á Praia (fronte 187)" }, @@ -2612,7 +7098,7 @@ ] }, { - "stopId": 2320, + "stopId": "vitrasa:2320", "name": { "original": "Baixada á Praia, 121" }, @@ -2623,7 +7109,7 @@ ] }, { - "stopId": 2330, + "stopId": "vitrasa:2330", "name": { "original": "Avda. de Ricardo Mella, 357" }, @@ -2634,7 +7120,7 @@ ] }, { - "stopId": 2340, + "stopId": "vitrasa:2340", "name": { "original": "Baixada á Praia, 44" }, @@ -2647,7 +7133,7 @@ ] }, { - "stopId": 2350, + "stopId": "vitrasa:2350", "name": { "original": "Baixada á Praia, 74" }, @@ -2660,7 +7146,7 @@ ] }, { - "stopId": 2360, + "stopId": "vitrasa:2360", "name": { "original": "Baixada á Praia (Parque C.Cívico)" }, @@ -2671,7 +7157,7 @@ ] }, { - "stopId": 2370, + "stopId": "vitrasa:2370", "name": { "original": "Baixada á Praia, 94" }, @@ -2684,7 +7170,7 @@ ] }, { - "stopId": 2380, + "stopId": "vitrasa:2380", "name": { "original": "Baixada á Praia, 101" }, @@ -2695,7 +7181,7 @@ ] }, { - "stopId": 2390, + "stopId": "vitrasa:2390", "name": { "original": "Baixada á Salgueira, 49" }, @@ -2706,7 +7192,19 @@ ] }, { - "stopId": 2410, + "stopId": "vitrasa:240", + "name": { + "original": "Rúa de Ángel de Lema, 19" + }, + "latitude": 42.247513476, + "longitude": -8.691874301, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:2410", "name": { "original": "Baixada ao Río, 31" }, @@ -2717,7 +7215,7 @@ ] }, { - "stopId": 2420, + "stopId": "vitrasa:2420", "name": { "original": "Rúa do Cacheno (Lavadero)" }, @@ -2728,7 +7226,7 @@ ] }, { - "stopId": 2430, + "stopId": "vitrasa:2430", "name": { "original": "Rúa de Barcelona, 64" }, @@ -2739,7 +7237,7 @@ ] }, { - "stopId": 2440, + "stopId": "vitrasa:2440", "name": { "original": "Rúa de Barcelona, 2" }, @@ -2750,7 +7248,7 @@ ] }, { - "stopId": 2450, + "stopId": "vitrasa:2450", "name": { "original": "Rúa de Barcelona, 32" }, @@ -2761,7 +7259,7 @@ ] }, { - "stopId": 2460, + "stopId": "vitrasa:2460", "name": { "original": "Rúa de Xeme, 59" }, @@ -2772,7 +7270,7 @@ ] }, { - "stopId": 2490, + "stopId": "vitrasa:2490", "name": { "original": "Rúa das Coutadas, 57" }, @@ -2784,7 +7282,19 @@ ] }, { - "stopId": 2500, + "stopId": "vitrasa:250", + "name": { + "original": "Rúa de Ángel de Lema, 221" + }, + "latitude": 42.255252085, + "longitude": -8.679480662, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:2500", "name": { "original": "Rúa de Ramiro Pascual (Igrexa)" }, @@ -2795,7 +7305,7 @@ ] }, { - "stopId": 2510, + "stopId": "vitrasa:2510", "name": { "original": "Avda. de Castrelos, 439" }, @@ -2806,7 +7316,7 @@ ] }, { - "stopId": 2520, + "stopId": "vitrasa:2520", "name": { "original": "Estrada de Bembrive, 238" }, @@ -2818,7 +7328,7 @@ ] }, { - "stopId": 2540, + "stopId": "vitrasa:2540", "name": { "original": "Bouzas (Rotonda de Las Anclas)" }, @@ -2830,7 +7340,7 @@ ] }, { - "stopId": 2550, + "stopId": "vitrasa:2550", "name": { "original": "Camiño da Brea, 10" }, @@ -2842,7 +7352,7 @@ ] }, { - "stopId": 2551, + "stopId": "vitrasa:2551", "name": { "original": "Camiño da Brea, 40" }, @@ -2853,7 +7363,7 @@ ] }, { - "stopId": 2560, + "stopId": "vitrasa:2560", "name": { "original": "Camiño da Brea, 37" }, @@ -2865,7 +7375,7 @@ ] }, { - "stopId": 2580, + "stopId": "vitrasa:2580", "name": { "original": "Camiño da Brea, 69" }, @@ -2877,7 +7387,7 @@ ] }, { - "stopId": 2590, + "stopId": "vitrasa:2590", "name": { "original": "Rúa da Cabalaría, 94" }, @@ -2888,7 +7398,19 @@ ] }, { - "stopId": 2600, + "stopId": "vitrasa:260", + "name": { + "original": "Rúa de Ángel de Lema, 91" + }, + "latitude": 42.250421216, + "longitude": -8.685464716, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:2600", "name": { "original": "Rúa da Cabalaría, 153" }, @@ -2900,7 +7422,7 @@ ] }, { - "stopId": 2610, + "stopId": "vitrasa:2610", "name": { "original": "Rúa da Cabalaría, 14" }, @@ -2911,7 +7433,7 @@ ] }, { - "stopId": 2620, + "stopId": "vitrasa:2620", "name": { "original": "Rúa da Cabalaría, 186" }, @@ -2922,7 +7444,7 @@ ] }, { - "stopId": 2630, + "stopId": "vitrasa:2630", "name": { "original": "Rúa da Cabalaría (cruce Subida ao Rosal Florido)" }, @@ -2934,7 +7456,7 @@ ] }, { - "stopId": 2640, + "stopId": "vitrasa:2640", "name": { "original": "Rúa da Cabalaría, 67" }, @@ -2946,7 +7468,19 @@ ] }, { - "stopId": 2735, + "stopId": "vitrasa:270", + "name": { + "original": "Rúa de Desiderio Pernas Arquitecto, 1" + }, + "latitude": 42.18920151, + "longitude": -8.810340862, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:2735", "name": { "original": "Rúa da Cachamuíña (Concello)" }, @@ -2958,7 +7492,7 @@ ] }, { - "stopId": 2740, + "stopId": "vitrasa:2740", "name": { "original": "Rúa do Cacheno, 75" }, @@ -2969,7 +7503,7 @@ ] }, { - "stopId": 2750, + "stopId": "vitrasa:2750", "name": { "original": "Rúa do Cacheno, 28" }, @@ -2980,7 +7514,7 @@ ] }, { - "stopId": 2760, + "stopId": "vitrasa:2760", "name": { "original": "Rúa do Cacheno, 66" }, @@ -2991,7 +7525,7 @@ ] }, { - "stopId": 2770, + "stopId": "vitrasa:2770", "name": { "original": "Rúa do Cacheno, 49" }, @@ -3002,7 +7536,7 @@ ] }, { - "stopId": 2780, + "stopId": "vitrasa:2780", "name": { "original": "Avda. das Camelias, 135" }, @@ -3024,7 +7558,7 @@ ] }, { - "stopId": 2790, + "stopId": "vitrasa:2790", "name": { "original": "Avda. das Camelias, 37" }, @@ -3041,7 +7575,19 @@ ] }, { - "stopId": 2800, + "stopId": "vitrasa:280", + "name": { + "original": "Rúa do Arquitecto Antonio Cominges, 38" + }, + "latitude": 42.189490674, + "longitude": -8.808107114, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:2800", "name": { "original": "Avda. das Camelias, 46" }, @@ -3060,7 +7606,7 @@ ] }, { - "stopId": 2810, + "stopId": "vitrasa:2810", "name": { "original": "Avda. das Camelias, 80" }, @@ -3079,7 +7625,7 @@ ] }, { - "stopId": 2820, + "stopId": "vitrasa:2820", "name": { "original": "Avda. das Camelias (Praza 8 de Marzo)" }, @@ -3096,7 +7642,7 @@ ] }, { - "stopId": 2830, + "stopId": "vitrasa:2830", "name": { "original": "Rúa de Camilo Veiga, 33" }, @@ -3112,7 +7658,7 @@ ] }, { - "stopId": 2840, + "stopId": "vitrasa:2840", "name": { "original": "Rúa da Goleta, 3" }, @@ -3125,7 +7671,7 @@ ] }, { - "stopId": 2850, + "stopId": "vitrasa:2850", "name": { "original": "Rúa da Goleta, 2" }, @@ -3137,7 +7683,7 @@ ] }, { - "stopId": 2870, + "stopId": "vitrasa:2870", "name": { "original": "Rúa de Cantabria (Compañía Suministradora de Auga)" }, @@ -3149,7 +7695,7 @@ ] }, { - "stopId": 2880, + "stopId": "vitrasa:2880", "name": { "original": "Rúa de Cantabria, 148" }, @@ -3161,7 +7707,19 @@ ] }, { - "stopId": 2910, + "stopId": "vitrasa:290", + "name": { + "original": "Rúa do Arquitecto Gómez Román, 37" + }, + "latitude": 42.190149471, + "longitude": -8.803788225, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:2910", "name": { "original": "Rúa de Cantabria, 212" }, @@ -3173,7 +7731,7 @@ ] }, { - "stopId": 2920, + "stopId": "vitrasa:2920", "name": { "original": "Rúa de Cantabria, 45" }, @@ -3185,7 +7743,7 @@ ] }, { - "stopId": 2930, + "stopId": "vitrasa:2930", "name": { "original": "Rúa de Cantabria, 58" }, @@ -3197,7 +7755,7 @@ ] }, { - "stopId": 2950, + "stopId": "vitrasa:2950", "name": { "original": "Rúa dos Canteiros, 4" }, @@ -3209,7 +7767,7 @@ ] }, { - "stopId": 2960, + "stopId": "vitrasa:2960", "name": { "original": "Rúa dos Canteiros, 101" }, @@ -3221,7 +7779,7 @@ ] }, { - "stopId": 2970, + "stopId": "vitrasa:2970", "name": { "original": "Rúa dos Canteiros, 116" }, @@ -3233,7 +7791,7 @@ ] }, { - "stopId": 2980, + "stopId": "vitrasa:2980", "name": { "original": "Rúa dos Canteiros, 164" }, @@ -3245,7 +7803,7 @@ ] }, { - "stopId": 2990, + "stopId": "vitrasa:2990", "name": { "original": "Rúa dos Canteiros, 9" }, @@ -3257,7 +7815,7 @@ ] }, { - "stopId": 3000, + "stopId": "vitrasa:3000", "name": { "original": "Rúa dos Canteiros, 49" }, @@ -3269,7 +7827,7 @@ ] }, { - "stopId": 3010, + "stopId": "vitrasa:3010", "name": { "original": "Rúa dos Canteiros, 73" }, @@ -3281,7 +7839,7 @@ ] }, { - "stopId": 3020, + "stopId": "vitrasa:3020", "name": { "original": "Rúa dos Canteiros, 76" }, @@ -3293,7 +7851,7 @@ ] }, { - "stopId": 3030, + "stopId": "vitrasa:3030", "name": { "original": "Avda. de Castrelos, 458" }, @@ -3305,7 +7863,7 @@ ] }, { - "stopId": 3050, + "stopId": "vitrasa:3050", "name": { "original": "Estrada de Casás (cruce Camiño da Pedra Branca)" }, @@ -3316,7 +7874,7 @@ ] }, { - "stopId": 3052, + "stopId": "vitrasa:3052", "name": { "original": "Avda. Arquitecto Antonio Palacios (cruce Rúa Ricardo Torres)" }, @@ -3327,7 +7885,7 @@ ] }, { - "stopId": 3060, + "stopId": "vitrasa:3060", "name": { "original": "Rúa da Ceboleira, 30" }, @@ -3338,7 +7896,7 @@ ] }, { - "stopId": 3070, + "stopId": "vitrasa:3070", "name": { "original": "Rúa da Ceboleira, 49" }, @@ -3349,7 +7907,7 @@ ] }, { - "stopId": 3080, + "stopId": "vitrasa:3080", "name": { "original": "Avda. de Cesáreo Vázquez, 136" }, @@ -3360,7 +7918,7 @@ ] }, { - "stopId": 3090, + "stopId": "vitrasa:3090", "name": { "original": "Avda. de Cesáreo Vázquez, 182" }, @@ -3373,7 +7931,19 @@ ] }, { - "stopId": 3100, + "stopId": "vitrasa:310", + "name": { + "original": "Rúa do Arquitecto Antonio Cominges, 4" + }, + "latitude": 42.190850463, + "longitude": -8.80358845, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:3100", "name": { "original": "Avda. de Cesáreo Vázquez, 99" }, @@ -3385,7 +7955,7 @@ ] }, { - "stopId": 3110, + "stopId": "vitrasa:3110", "name": { "original": "Avda. de Cesáreo Vázquez, 74" }, @@ -3396,7 +7966,7 @@ ] }, { - "stopId": 3120, + "stopId": "vitrasa:3120", "name": { "original": "Avda. de Cesáreo Vázquez, 141" }, @@ -3408,7 +7978,7 @@ ] }, { - "stopId": 3130, + "stopId": "vitrasa:3130", "name": { "original": "Avda. de Cesáreo Vázquez, 169" }, @@ -3419,7 +7989,7 @@ ] }, { - "stopId": 3140, + "stopId": "vitrasa:3140", "name": { "original": "Estrada De Zamáns, 255" }, @@ -3430,7 +8000,7 @@ ] }, { - "stopId": 3150, + "stopId": "vitrasa:3150", "name": { "original": "Estrada de Zamáns (cruce Igrexa)" }, @@ -3441,7 +8011,7 @@ ] }, { - "stopId": 3160, + "stopId": "vitrasa:3160", "name": { "original": "Camiño da Falcoa, 10" }, @@ -3453,7 +8023,7 @@ ] }, { - "stopId": 3170, + "stopId": "vitrasa:3170", "name": { "original": "Rúa das Coutadas, 76" }, @@ -3464,7 +8034,7 @@ ] }, { - "stopId": 3180, + "stopId": "vitrasa:3180", "name": { "original": "Camiño de Quirós, 106" }, @@ -3476,7 +8046,7 @@ ] }, { - "stopId": 3190, + "stopId": "vitrasa:3190", "name": { "original": "Camiño de Quirós (cruce Rúa de Dona Cristina)" }, @@ -3488,19 +8058,30 @@ ] }, { - "stopId": 3230, + "stopId": "vitrasa:320", + "name": { + "original": "Rúa do Arquitecto Antonio Cominges, 70" + }, + "latitude": 42.189221331, + "longitude": -8.811730246, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:3230", "name": { "original": "Rúa de Colón, 27" }, "latitude": 42.236471452, "longitude": -8.720164905, "lines": [ - "11", "16" ] }, { - "stopId": 3240, + "stopId": "vitrasa:3240", "name": { "original": "Rúa da Coruña, 5" }, @@ -3521,7 +8102,7 @@ ] }, { - "stopId": 3250, + "stopId": "vitrasa:3250", "name": { "original": "Rúa da Coruña, 26" }, @@ -3536,7 +8117,7 @@ ] }, { - "stopId": 3260, + "stopId": "vitrasa:3260", "name": { "original": "Rúa da Coruña, 37" }, @@ -3547,7 +8128,7 @@ ] }, { - "stopId": 3270, + "stopId": "vitrasa:3270", "name": { "original": "Rúa da Coruña (fronte 39)" }, @@ -3559,7 +8140,7 @@ ] }, { - "stopId": 3280, + "stopId": "vitrasa:3280", "name": { "original": "Rúa de Manuel Lago Lago, 1" }, @@ -3570,7 +8151,7 @@ ] }, { - "stopId": 3290, + "stopId": "vitrasa:3290", "name": { "original": "Rúa da Costa, 13" }, @@ -3583,7 +8164,19 @@ ] }, { - "stopId": 3300, + "stopId": "vitrasa:330", + "name": { + "original": "Rúa do Arquitecto Antonio Cominges, 90" + }, + "latitude": 42.187213169, + "longitude": -8.813069201, + "lines": [ + "C3d", + "10" + ] + }, + { + "stopId": "vitrasa:3300", "name": { "original": "Rúa da Costa, 22" }, @@ -3596,7 +8189,7 @@ ] }, { - "stopId": 3310, + "stopId": "vitrasa:3310", "name": { "original": "Rúa da Costa, 74" }, @@ -3609,7 +8202,7 @@ ] }, { - "stopId": 3320, + "stopId": "vitrasa:3320", "name": { "original": "Rúa da Costa, 63" }, @@ -3622,7 +8215,7 @@ ] }, { - "stopId": 3350, + "stopId": "vitrasa:3350", "name": { "original": "Rúa do Couto, 1" }, @@ -3636,7 +8229,7 @@ ] }, { - "stopId": 3360, + "stopId": "vitrasa:3360", "name": { "original": "Rúa do Doutor Canoa, 8" }, @@ -3647,7 +8240,7 @@ ] }, { - "stopId": 3370, + "stopId": "vitrasa:3370", "name": { "original": "Estrada de Bembrive (cruce Rúa Eifonso)" }, @@ -3659,7 +8252,7 @@ ] }, { - "stopId": 3380, + "stopId": "vitrasa:3380", "name": { "original": "Cruce Eifonso" }, @@ -3671,7 +8264,7 @@ ] }, { - "stopId": 3390, + "stopId": "vitrasa:3390", "name": { "original": "Estrada de Bembrive, 160" }, @@ -3683,7 +8276,19 @@ ] }, { - "stopId": 3400, + "stopId": "vitrasa:340", + "name": { + "original": "Rúa de Aragón, 116" + }, + "latitude": 42.238036494, + "longitude": -8.700921187, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:3400", "name": { "original": "Estrada da Gándara, 22" }, @@ -3694,7 +8299,7 @@ ] }, { - "stopId": 3420, + "stopId": "vitrasa:3420", "name": { "original": "Avda. de Castrelos (Cemiterio de Pereiró)" }, @@ -3709,7 +8314,7 @@ ] }, { - "stopId": 3430, + "stopId": "vitrasa:3430", "name": { "original": "Avda. da Ponte, 86 (Cemiterio)" }, @@ -3721,7 +8326,7 @@ ] }, { - "stopId": 3450, + "stopId": "vitrasa:3450", "name": { "original": "Estrada de Camposancos, 155" }, @@ -3733,7 +8338,7 @@ ] }, { - "stopId": 3460, + "stopId": "vitrasa:3460", "name": { "original": "Estrada de Camposancos, 19" }, @@ -3745,7 +8350,7 @@ ] }, { - "stopId": 3470, + "stopId": "vitrasa:3470", "name": { "original": "Estrada de Camposancos, 214" }, @@ -3757,7 +8362,7 @@ ] }, { - "stopId": 3480, + "stopId": "vitrasa:3480", "name": { "original": "Estrada de Camposancos, 141" }, @@ -3769,7 +8374,7 @@ ] }, { - "stopId": 3490, + "stopId": "vitrasa:3490", "name": { "original": "Estrada de Camposancos, 171" }, @@ -3781,7 +8386,19 @@ ] }, { - "stopId": 3500, + "stopId": "vitrasa:350", + "name": { + "original": "Rúa de Aragón, 162" + }, + "latitude": 42.240488915, + "longitude": -8.700357923, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:3500", "name": { "original": "Estrada de Camposancos, 190" }, @@ -3793,7 +8410,7 @@ ] }, { - "stopId": 3510, + "stopId": "vitrasa:3510", "name": { "original": "Estrada de Camposancos, 28" }, @@ -3806,7 +8423,7 @@ ] }, { - "stopId": 3520, + "stopId": "vitrasa:3520", "name": { "original": "Estrada de Camposancos, 75" }, @@ -3818,7 +8435,7 @@ ] }, { - "stopId": 3530, + "stopId": "vitrasa:3530", "name": { "original": "Estrada de Camposancos, 88" }, @@ -3830,7 +8447,7 @@ ] }, { - "stopId": 3540, + "stopId": "vitrasa:3540", "name": { "original": "Estrada de Camposancos, 138" }, @@ -3842,7 +8459,7 @@ ] }, { - "stopId": 3550, + "stopId": "vitrasa:3550", "name": { "original": "Estrada de Bembrive (cruce Camiño Cova)" }, @@ -3853,7 +8470,7 @@ ] }, { - "stopId": 3560, + "stopId": "vitrasa:3560", "name": { "original": "Estrada de Bembrive, 104" }, @@ -3864,7 +8481,7 @@ ] }, { - "stopId": 3570, + "stopId": "vitrasa:3570", "name": { "original": "Estrada de Bembrive, 109" }, @@ -3875,7 +8492,7 @@ ] }, { - "stopId": 3572, + "stopId": "vitrasa:3572", "name": { "original": "Estrada de Bembrive, 110" }, @@ -3886,7 +8503,7 @@ ] }, { - "stopId": 3574, + "stopId": "vitrasa:3574", "name": { "original": "Estrada de Bembrive, 129" }, @@ -3897,7 +8514,7 @@ ] }, { - "stopId": 3580, + "stopId": "vitrasa:3580", "name": { "original": "Estrada de Bembrive, 180" }, @@ -3909,7 +8526,7 @@ ] }, { - "stopId": 3590, + "stopId": "vitrasa:3590", "name": { "original": "Estrada de Bembrive, 195" }, @@ -3921,7 +8538,19 @@ ] }, { - "stopId": 3600, + "stopId": "vitrasa:360", + "name": { + "original": "Rúa de Aragón, 193" + }, + "latitude": 42.24013184, + "longitude": -8.700947033, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:3600", "name": { "original": "Estrada de Bembrive, 22" }, @@ -3932,7 +8561,7 @@ ] }, { - "stopId": 3610, + "stopId": "vitrasa:3610", "name": { "original": "Estrada de Bembrive, 237" }, @@ -3944,7 +8573,7 @@ ] }, { - "stopId": 3620, + "stopId": "vitrasa:3620", "name": { "original": "Estrada de Bembrive, 278" }, @@ -3955,7 +8584,7 @@ ] }, { - "stopId": 3630, + "stopId": "vitrasa:3630", "name": { "original": "Estrada de Bembrive, 269" }, @@ -3967,7 +8596,7 @@ ] }, { - "stopId": 3640, + "stopId": "vitrasa:3640", "name": { "original": "Estrada de Bembrive, 315" }, @@ -3978,7 +8607,7 @@ ] }, { - "stopId": 3650, + "stopId": "vitrasa:3650", "name": { "original": "Estrada de Bembrive, 346" }, @@ -3989,7 +8618,7 @@ ] }, { - "stopId": 3660, + "stopId": "vitrasa:3660", "name": { "original": "Estrada de Bembrive, 39" }, @@ -4000,7 +8629,7 @@ ] }, { - "stopId": 3670, + "stopId": "vitrasa:3670", "name": { "original": "Estrada de Bembrive, 398" }, @@ -4011,7 +8640,7 @@ ] }, { - "stopId": 3680, + "stopId": "vitrasa:3680", "name": { "original": "Estrada de Bembrive, 64" }, @@ -4022,7 +8651,7 @@ ] }, { - "stopId": 3690, + "stopId": "vitrasa:3690", "name": { "original": "Estrada de Bembrive, 73" }, @@ -4033,7 +8662,19 @@ ] }, { - "stopId": 3700, + "stopId": "vitrasa:370", + "name": { + "original": "Rúa de Aragón, 212" + }, + "latitude": 42.242101304, + "longitude": -8.698394546, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:3700", "name": { "original": "Estrada de Bembrive (cruce Camiño Riomao)" }, @@ -4044,7 +8685,7 @@ ] }, { - "stopId": 3710, + "stopId": "vitrasa:3710", "name": { "original": "Estrada de Bembrive, 363" }, @@ -4055,7 +8696,7 @@ ] }, { - "stopId": 3720, + "stopId": "vitrasa:3720", "name": { "original": "Estrada de Bembrive, 341" }, @@ -4066,7 +8707,7 @@ ] }, { - "stopId": 3730, + "stopId": "vitrasa:3730", "name": { "original": "Estrada de Bembrive, 301" }, @@ -4077,7 +8718,7 @@ ] }, { - "stopId": 3740, + "stopId": "vitrasa:3740", "name": { "original": "Rúa de Canido (Igrexa)" }, @@ -4090,7 +8731,7 @@ ] }, { - "stopId": 3750, + "stopId": "vitrasa:3750", "name": { "original": "Rúa de Canido (Praia de Canido)" }, @@ -4102,7 +8743,7 @@ ] }, { - "stopId": 3760, + "stopId": "vitrasa:3760", "name": { "original": "Rúa de Canido (fronte 119)" }, @@ -4114,7 +8755,7 @@ ] }, { - "stopId": 3770, + "stopId": "vitrasa:3770", "name": { "original": "Rúa de Canido, 135" }, @@ -4127,7 +8768,7 @@ ] }, { - "stopId": 3780, + "stopId": "vitrasa:3780", "name": { "original": "Rúa de Canido, 217" }, @@ -4140,7 +8781,7 @@ ] }, { - "stopId": 3790, + "stopId": "vitrasa:3790", "name": { "original": "Rúa de Canido, 15" }, @@ -4153,7 +8794,19 @@ ] }, { - "stopId": 3800, + "stopId": "vitrasa:380", + "name": { + "original": "Rúa de Aragón, 221" + }, + "latitude": 42.242091376, + "longitude": -8.698668131, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:3800", "name": { "original": "Rúa de Canido, 26" }, @@ -4164,7 +8817,7 @@ ] }, { - "stopId": 3810, + "stopId": "vitrasa:3810", "name": { "original": "Rúa de Canido, 55" }, @@ -4177,7 +8830,7 @@ ] }, { - "stopId": 3820, + "stopId": "vitrasa:3820", "name": { "original": "Rúa do Falcoído, 16" }, @@ -4188,7 +8841,7 @@ ] }, { - "stopId": 3830, + "stopId": "vitrasa:3830", "name": { "original": "Rúa do Falcoído (cruce Camiño Goaldino)" }, @@ -4199,7 +8852,7 @@ ] }, { - "stopId": 3840, + "stopId": "vitrasa:3840", "name": { "original": "Rúa do Falcoído (cruce Camiño das Presas)" }, @@ -4210,7 +8863,7 @@ ] }, { - "stopId": 3850, + "stopId": "vitrasa:3850", "name": { "original": "Estrada Clara Campoamor (cruce Estrada Marcosende)" }, @@ -4222,7 +8875,7 @@ ] }, { - "stopId": 3860, + "stopId": "vitrasa:3860", "name": { "original": "Estrada Clara Campoamor (cruce Rúa do Falcoído)" }, @@ -4234,7 +8887,7 @@ ] }, { - "stopId": 3870, + "stopId": "vitrasa:3870", "name": { "original": "Rúa do Falcoído, 13" }, @@ -4245,7 +8898,7 @@ ] }, { - "stopId": 3880, + "stopId": "vitrasa:3880", "name": { "original": "Estrada da Coutada, 44" }, @@ -4256,7 +8909,7 @@ ] }, { - "stopId": 3890, + "stopId": "vitrasa:3890", "name": { "original": "Estrada da Coutada, 39" }, @@ -4268,7 +8921,19 @@ ] }, { - "stopId": 3900, + "stopId": "vitrasa:390", + "name": { + "original": "Rúa de Aragón, 26" + }, + "latitude": 42.233174046, + "longitude": -8.702380309, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:3900", "name": { "original": "Estrada da Coutada, 19" }, @@ -4280,7 +8945,7 @@ ] }, { - "stopId": 3910, + "stopId": "vitrasa:3910", "name": { "original": "Estrada da Coutada, 68" }, @@ -4291,7 +8956,7 @@ ] }, { - "stopId": 3920, + "stopId": "vitrasa:3920", "name": { "original": "Estrada da Coutada, 65" }, @@ -4303,7 +8968,7 @@ ] }, { - "stopId": 3930, + "stopId": "vitrasa:3930", "name": { "original": "Estrada da Coutada, 12" }, @@ -4315,7 +8980,7 @@ ] }, { - "stopId": 3940, + "stopId": "vitrasa:3940", "name": { "original": "Estrada de Casás, 83" }, @@ -4326,7 +8991,7 @@ ] }, { - "stopId": 3950, + "stopId": "vitrasa:3950", "name": { "original": "Estrada de Casás (cruce Camiño do Rial)" }, @@ -4337,7 +9002,7 @@ ] }, { - "stopId": 3960, + "stopId": "vitrasa:3960", "name": { "original": "Baixada do Castelo" }, @@ -4353,7 +9018,7 @@ ] }, { - "stopId": 3970, + "stopId": "vitrasa:3970", "name": { "original": "Estrada Vella de Madrid, 190" }, @@ -4367,7 +9032,7 @@ ] }, { - "stopId": 3980, + "stopId": "vitrasa:3980", "name": { "original": "Estrada Vella de Madrid (cruce Hospital)" }, @@ -4384,7 +9049,30 @@ ] }, { - "stopId": 4000, + "stopId": "vitrasa:40", + "name": { + "original": "Rúa do Abade Juan de Bastos (cruce Baixada da Moo)" + }, + "latitude": 42.192126677, + "longitude": -8.72901589, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:400", + "name": { + "original": "Rúa de Aragón, 91" + }, + "latitude": 42.235598195, + "longitude": -8.701426538, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:4000", "name": { "original": "Estrada de Fragoselo, 143" }, @@ -4395,7 +9083,7 @@ ] }, { - "stopId": 4010, + "stopId": "vitrasa:4010", "name": { "original": "Estrada de Fragoselo, 170" }, @@ -4406,7 +9094,7 @@ ] }, { - "stopId": 4020, + "stopId": "vitrasa:4020", "name": { "original": "Estrada de Fragoselo, 79" }, @@ -4417,7 +9105,7 @@ ] }, { - "stopId": 4030, + "stopId": "vitrasa:4030", "name": { "original": "Estrada de Fragoselo, 111" }, @@ -4428,7 +9116,7 @@ ] }, { - "stopId": 4040, + "stopId": "vitrasa:4040", "name": { "original": "Estrada de Fragoselo, 108" }, @@ -4439,7 +9127,7 @@ ] }, { - "stopId": 4050, + "stopId": "vitrasa:4050", "name": { "original": "Estrada de Fragoselo, 196" }, @@ -4450,7 +9138,7 @@ ] }, { - "stopId": 4060, + "stopId": "vitrasa:4060", "name": { "original": "Estrada da Gándara, 7" }, @@ -4461,7 +9149,7 @@ ] }, { - "stopId": 4070, + "stopId": "vitrasa:4070", "name": { "original": "Estrada da Gándara, 55" }, @@ -4472,7 +9160,7 @@ ] }, { - "stopId": 4080, + "stopId": "vitrasa:4080", "name": { "original": "Estrada da Gándara, 48" }, @@ -4483,7 +9171,7 @@ ] }, { - "stopId": 4090, + "stopId": "vitrasa:4090", "name": { "original": "Estrada da Garrida, 124" }, @@ -4494,7 +9182,19 @@ ] }, { - "stopId": 4100, + "stopId": "vitrasa:410", + "name": { + "original": "Rúa de Aragón, 82" + }, + "latitude": 42.235524387, + "longitude": -8.701248417, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:4100", "name": { "original": "Estrada da Garrida, 199" }, @@ -4505,7 +9205,7 @@ ] }, { - "stopId": 4110, + "stopId": "vitrasa:4110", "name": { "original": "Estrada da Garrida, 40" }, @@ -4516,7 +9216,7 @@ ] }, { - "stopId": 4120, + "stopId": "vitrasa:4120", "name": { "original": "Estrada da Garrida, 84" }, @@ -4527,7 +9227,7 @@ ] }, { - "stopId": 4130, + "stopId": "vitrasa:4130", "name": { "original": "Estrada da Garrida, 83" }, @@ -4538,7 +9238,7 @@ ] }, { - "stopId": 4140, + "stopId": "vitrasa:4140", "name": { "original": "Estrada da Garrida (frente 80)" }, @@ -4549,7 +9249,7 @@ ] }, { - "stopId": 4150, + "stopId": "vitrasa:4150", "name": { "original": "Estrada de Miraflores, 69" }, @@ -4562,7 +9262,7 @@ ] }, { - "stopId": 4160, + "stopId": "vitrasa:4160", "name": { "original": "Estrada de Miraflores, 36" }, @@ -4573,7 +9273,7 @@ ] }, { - "stopId": 4170, + "stopId": "vitrasa:4170", "name": { "original": "Estrada de Miraflores, 64" }, @@ -4586,7 +9286,19 @@ ] }, { - "stopId": 4200, + "stopId": "vitrasa:420", + "name": { + "original": "Rúa de Aragón, 147" + }, + "latitude": 42.238092485, + "longitude": -8.701156245, + "lines": [ + "4A", + "H3" + ] + }, + { + "stopId": "vitrasa:4200", "name": { "original": "Estrada de Moledo, 6" }, @@ -4598,7 +9310,7 @@ ] }, { - "stopId": 4210, + "stopId": "vitrasa:4210", "name": { "original": "Estrada de Moledo, 42" }, @@ -4610,7 +9322,7 @@ ] }, { - "stopId": 4220, + "stopId": "vitrasa:4220", "name": { "original": "Estrada de Moledo, 22" }, @@ -4622,7 +9334,7 @@ ] }, { - "stopId": 4230, + "stopId": "vitrasa:4230", "name": { "original": "Estrada de Moledo, 1" }, @@ -4634,7 +9346,7 @@ ] }, { - "stopId": 4240, + "stopId": "vitrasa:4240", "name": { "original": "Estrada de Moledo, 73" }, @@ -4646,7 +9358,7 @@ ] }, { - "stopId": 4250, + "stopId": "vitrasa:4250", "name": { "original": "Estrada de Moledo, 25" }, @@ -4658,7 +9370,7 @@ ] }, { - "stopId": 4280, + "stopId": "vitrasa:4280", "name": { "original": "Rúa de Emilia Pardo Bazán, 80" }, @@ -4671,7 +9383,7 @@ ] }, { - "stopId": 4290, + "stopId": "vitrasa:4290", "name": { "original": "Rúa de Emilia Pardo Bazán, 3" }, @@ -4685,7 +9397,7 @@ ] }, { - "stopId": 4300, + "stopId": "vitrasa:4300", "name": { "original": "Rúa de Emilia Pardo Bazán, 104" }, @@ -4698,7 +9410,7 @@ ] }, { - "stopId": 4310, + "stopId": "vitrasa:4310", "name": { "original": "Rúa de Emilia Pardo Bazán, 111" }, @@ -4711,7 +9423,7 @@ ] }, { - "stopId": 4320, + "stopId": "vitrasa:4320", "name": { "original": "Rúa de Emilia Pardo Bazán, 2" }, @@ -4724,7 +9436,7 @@ ] }, { - "stopId": 4330, + "stopId": "vitrasa:4330", "name": { "original": "Rúa de Emilia Pardo Bazán (cruce Baixada á Salgueira)" }, @@ -4738,7 +9450,7 @@ ] }, { - "stopId": 4340, + "stopId": "vitrasa:4340", "name": { "original": "Rúa de Emilia Pardo Bazán, 54" }, @@ -4751,7 +9463,7 @@ ] }, { - "stopId": 4350, + "stopId": "vitrasa:4350", "name": { "original": "Rúa de Emilia Pardo Bazán, 43" }, @@ -4764,7 +9476,7 @@ ] }, { - "stopId": 4440, + "stopId": "vitrasa:4440", "name": { "original": "Estrada de San Xoán, 169" }, @@ -4775,7 +9487,7 @@ ] }, { - "stopId": 4450, + "stopId": "vitrasa:4450", "name": { "original": "Estrada de San Xoán, 61" }, @@ -4786,7 +9498,7 @@ ] }, { - "stopId": 4460, + "stopId": "vitrasa:4460", "name": { "original": "Estrada de San Xoán, 141" }, @@ -4797,7 +9509,7 @@ ] }, { - "stopId": 4490, + "stopId": "vitrasa:4490", "name": { "original": "Rúa de Manuel Lago Lago (fronte Colexio)" }, @@ -4808,7 +9520,7 @@ ] }, { - "stopId": 4500, + "stopId": "vitrasa:4500", "name": { "original": "Rúa de Manuel Lago Lago, 20" }, @@ -4819,7 +9531,7 @@ ] }, { - "stopId": 4510, + "stopId": "vitrasa:4510", "name": { "original": "Rúa de Manuel Lago Lago (Colexio)" }, @@ -4830,7 +9542,7 @@ ] }, { - "stopId": 4520, + "stopId": "vitrasa:4520", "name": { "original": "Estrada das Plantas (Cidade Deportiva)" }, @@ -4841,7 +9553,7 @@ ] }, { - "stopId": 4530, + "stopId": "vitrasa:4530", "name": { "original": "Estrada das Plantas (fronte cruce Camiño do Pouso)" }, @@ -4852,7 +9564,7 @@ ] }, { - "stopId": 4540, + "stopId": "vitrasa:4540", "name": { "original": "Estrada das Plantas (fronte Viveiros)" }, @@ -4863,7 +9575,7 @@ ] }, { - "stopId": 4550, + "stopId": "vitrasa:4550", "name": { "original": "Estrada das Plantas (cruce Camiño do Pouso)" }, @@ -4875,7 +9587,7 @@ ] }, { - "stopId": 4560, + "stopId": "vitrasa:4560", "name": { "original": "Estrada de Valadares, 233" }, @@ -4886,7 +9598,7 @@ ] }, { - "stopId": 4570, + "stopId": "vitrasa:4570", "name": { "original": "Estrada de Valadares, 100" }, @@ -4898,7 +9610,7 @@ ] }, { - "stopId": 4580, + "stopId": "vitrasa:4580", "name": { "original": "Estrada de Valadares, 146" }, @@ -4910,7 +9622,7 @@ ] }, { - "stopId": 4590, + "stopId": "vitrasa:4590", "name": { "original": "Estrada de Valadares, 173" }, @@ -4921,7 +9633,7 @@ ] }, { - "stopId": 4600, + "stopId": "vitrasa:4600", "name": { "original": "Estrada de Valadares, 212" }, @@ -4933,7 +9645,7 @@ ] }, { - "stopId": 4610, + "stopId": "vitrasa:4610", "name": { "original": "Estrada de Valadares, 262" }, @@ -4945,7 +9657,7 @@ ] }, { - "stopId": 4620, + "stopId": "vitrasa:4620", "name": { "original": "Estrada de Valadares, 329" }, @@ -4956,7 +9668,7 @@ ] }, { - "stopId": 4630, + "stopId": "vitrasa:4630", "name": { "original": "Estrada de Valadares, 406" }, @@ -4968,7 +9680,7 @@ ] }, { - "stopId": 4640, + "stopId": "vitrasa:4640", "name": { "original": "Estrada de Valadares (cruce Camiño do Canizo)" }, @@ -4979,7 +9691,7 @@ ] }, { - "stopId": 4650, + "stopId": "vitrasa:4650", "name": { "original": "Estrada de Valadares, 48" }, @@ -4991,7 +9703,7 @@ ] }, { - "stopId": 4660, + "stopId": "vitrasa:4660", "name": { "original": "Estrada de Valadares, 99" }, @@ -5002,7 +9714,7 @@ ] }, { - "stopId": 4670, + "stopId": "vitrasa:4670", "name": { "original": "Estrada do Vao, 27" }, @@ -5013,7 +9725,7 @@ ] }, { - "stopId": 4680, + "stopId": "vitrasa:4680", "name": { "original": "Estrada do Vao, 116" }, @@ -5024,7 +9736,7 @@ ] }, { - "stopId": 4690, + "stopId": "vitrasa:4690", "name": { "original": "Estrada do Vao, 153" }, @@ -5035,7 +9747,7 @@ ] }, { - "stopId": 4700, + "stopId": "vitrasa:4700", "name": { "original": "Estrada do Vao, 46" }, @@ -5046,7 +9758,7 @@ ] }, { - "stopId": 4710, + "stopId": "vitrasa:4710", "name": { "original": "Estrada do Vao, 65" }, @@ -5057,7 +9769,7 @@ ] }, { - "stopId": 4720, + "stopId": "vitrasa:4720", "name": { "original": "Estrada do Vao, 90" }, @@ -5068,7 +9780,7 @@ ] }, { - "stopId": 4730, + "stopId": "vitrasa:4730", "name": { "original": "Estrada do Vao, 91" }, @@ -5079,7 +9791,7 @@ ] }, { - "stopId": 4740, + "stopId": "vitrasa:4740", "name": { "original": "Estrada do Vao (Praia do Vao)" }, @@ -5090,7 +9802,7 @@ ] }, { - "stopId": 4750, + "stopId": "vitrasa:4750", "name": { "original": "Estrada Vella de Madrid, 6" }, @@ -5105,7 +9817,7 @@ ] }, { - "stopId": 4760, + "stopId": "vitrasa:4760", "name": { "original": "Estrada Vella de Madrid, 34" }, @@ -5120,7 +9832,7 @@ ] }, { - "stopId": 4770, + "stopId": "vitrasa:4770", "name": { "original": "Estrada Vella de Madrid, 104" }, @@ -5135,7 +9847,7 @@ ] }, { - "stopId": 4780, + "stopId": "vitrasa:4780", "name": { "original": "Estrada Vella de Madrid, 136" }, @@ -5150,7 +9862,7 @@ ] }, { - "stopId": 4790, + "stopId": "vitrasa:4790", "name": { "original": "Estrada Vella de Madrid, 123" }, @@ -5164,7 +9876,7 @@ ] }, { - "stopId": 4800, + "stopId": "vitrasa:4800", "name": { "original": "Estrada Vella de Madrid, 160" }, @@ -5179,7 +9891,7 @@ ] }, { - "stopId": 4810, + "stopId": "vitrasa:4810", "name": { "original": "Estrada Vella de Madrid, 177" }, @@ -5193,7 +9905,7 @@ ] }, { - "stopId": 4820, + "stopId": "vitrasa:4820", "name": { "original": "Estrada Vella de Madrid, 31" }, @@ -5207,7 +9919,7 @@ ] }, { - "stopId": 4830, + "stopId": "vitrasa:4830", "name": { "original": "Estrada Vella de Madrid, 81" }, @@ -5221,7 +9933,7 @@ ] }, { - "stopId": 4840, + "stopId": "vitrasa:4840", "name": { "original": "Estrada Vella de Madrid, 76" }, @@ -5236,7 +9948,7 @@ ] }, { - "stopId": 4850, + "stopId": "vitrasa:4850", "name": { "original": "Estrada Vella de Madrid (frente Centro Comercial)" }, @@ -5249,7 +9961,7 @@ ] }, { - "stopId": 4860, + "stopId": "vitrasa:4860", "name": { "original": "Estrada da Venda (cruce Camiño da Coutadiña)" }, @@ -5261,7 +9973,7 @@ ] }, { - "stopId": 4870, + "stopId": "vitrasa:4870", "name": { "original": "Estrada da Venda, 5" }, @@ -5274,7 +9986,7 @@ ] }, { - "stopId": 4880, + "stopId": "vitrasa:4880", "name": { "original": "Estrada da Venda, 240" }, @@ -5286,7 +9998,7 @@ ] }, { - "stopId": 4890, + "stopId": "vitrasa:4890", "name": { "original": "Estrada da Venda, 238" }, @@ -5298,7 +10010,7 @@ ] }, { - "stopId": 4900, + "stopId": "vitrasa:4900", "name": { "original": "Estrada da Venda, 35" }, @@ -5311,7 +10023,7 @@ ] }, { - "stopId": 4910, + "stopId": "vitrasa:4910", "name": { "original": "Estrada da Venda, 4" }, @@ -5323,7 +10035,7 @@ ] }, { - "stopId": 4920, + "stopId": "vitrasa:4920", "name": { "original": "Estrada da Venda, 49" }, @@ -5335,7 +10047,7 @@ ] }, { - "stopId": 4930, + "stopId": "vitrasa:4930", "name": { "original": "Travesía da Devesa (Asociación Veciños)" }, @@ -5348,7 +10060,7 @@ ] }, { - "stopId": 4940, + "stopId": "vitrasa:4940", "name": { "original": "Camiño da Devesa (fronte 55)" }, @@ -5361,7 +10073,7 @@ ] }, { - "stopId": 4960, + "stopId": "vitrasa:4960", "name": { "original": "Rúa do Doutor Corbal, 135" }, @@ -5372,7 +10084,7 @@ ] }, { - "stopId": 4970, + "stopId": "vitrasa:4970", "name": { "original": "Rúa do Doutor Corbal, 126" }, @@ -5383,7 +10095,7 @@ ] }, { - "stopId": 4980, + "stopId": "vitrasa:4980", "name": { "original": "Rúa do Doutor Corbal, 149" }, @@ -5394,7 +10106,18 @@ ] }, { - "stopId": 5000, + "stopId": "vitrasa:50", + "name": { + "original": "Rúa do Abade Juan de Bastos, 24" + }, + "latitude": 42.19287042, + "longitude": -8.727513924, + "lines": [ + "17" + ] + }, + { + "stopId": "vitrasa:5000", "name": { "original": "Rúa do Doutor Corbal, 6" }, @@ -5405,7 +10128,7 @@ ] }, { - "stopId": 5010, + "stopId": "vitrasa:5010", "name": { "original": "Rúa do Doutor Corbal, 95" }, @@ -5416,7 +10139,7 @@ ] }, { - "stopId": 5020, + "stopId": "vitrasa:5020", "name": { "original": "Rúa do Doutor Corbal, 94" }, @@ -5427,7 +10150,7 @@ ] }, { - "stopId": 5030, + "stopId": "vitrasa:5030", "name": { "original": "Avda. de Redondela (fronte 28)" }, @@ -5438,7 +10161,7 @@ ] }, { - "stopId": 5040, + "stopId": "vitrasa:5040", "name": { "original": "Rúa da Salgueira Entrada, 5" }, @@ -5449,7 +10172,7 @@ ] }, { - "stopId": 5060, + "stopId": "vitrasa:5060", "name": { "original": "Estadio de Balaídos (Avda. do Fragoso)" }, @@ -5462,7 +10185,7 @@ ] }, { - "stopId": 5070, + "stopId": "vitrasa:5070", "name": { "original": "Rúa da Estrada, 10-12" }, @@ -5474,7 +10197,7 @@ ] }, { - "stopId": 5090, + "stopId": "vitrasa:5090", "name": { "original": "Rúa da Estrada, 1" }, @@ -5486,7 +10209,7 @@ ] }, { - "stopId": 5120, + "stopId": "vitrasa:5120", "name": { "original": "Camiño da Falcoa, 41" }, @@ -5499,7 +10222,7 @@ ] }, { - "stopId": 5140, + "stopId": "vitrasa:5140", "name": { "original": "Camiño da Falcoa, 15" }, @@ -5511,7 +10234,7 @@ ] }, { - "stopId": 5160, + "stopId": "vitrasa:5160", "name": { "original": "Camiño da Falcoa, 26" }, @@ -5524,7 +10247,7 @@ ] }, { - "stopId": 5170, + "stopId": "vitrasa:5170", "name": { "original": "Rúa das Figueiras (Praza da Feira)" }, @@ -5536,7 +10259,7 @@ ] }, { - "stopId": 5180, + "stopId": "vitrasa:5180", "name": { "original": "Rúa das Figueiras, 96" }, @@ -5548,7 +10271,7 @@ ] }, { - "stopId": 5190, + "stopId": "vitrasa:5190", "name": { "original": "Rúa das Figueiras, 124" }, @@ -5560,7 +10283,7 @@ ] }, { - "stopId": 5200, + "stopId": "vitrasa:5200", "name": { "original": "Rúa das Figueiras, 138" }, @@ -5572,7 +10295,7 @@ ] }, { - "stopId": 5220, + "stopId": "vitrasa:5220", "name": { "original": "Rúa das Figueiras, 190" }, @@ -5584,7 +10307,7 @@ ] }, { - "stopId": 5230, + "stopId": "vitrasa:5230", "name": { "original": "Rúa das Figueiras, 254" }, @@ -5596,7 +10319,7 @@ ] }, { - "stopId": 5250, + "stopId": "vitrasa:5250", "name": { "original": "Rúa das Figueiras, 29" }, @@ -5608,7 +10331,7 @@ ] }, { - "stopId": 5260, + "stopId": "vitrasa:5260", "name": { "original": "Rúa das Figueiras, 22" }, @@ -5620,7 +10343,7 @@ ] }, { - "stopId": 5270, + "stopId": "vitrasa:5270", "name": { "original": "Rúa das Figueiras, 65" }, @@ -5632,7 +10355,7 @@ ] }, { - "stopId": 5280, + "stopId": "vitrasa:5280", "name": { "original": "Rúa das Figueiras, 113" }, @@ -5644,7 +10367,7 @@ ] }, { - "stopId": 5290, + "stopId": "vitrasa:5290", "name": { "original": "Avda. da Florida, 60" }, @@ -5658,7 +10381,18 @@ ] }, { - "stopId": 5300, + "stopId": "vitrasa:530", + "name": { + "original": "Avda. de Ricardo Mella (Estación Coruxo)" + }, + "latitude": 42.193562859, + "longitude": -8.78173994, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:5300", "name": { "original": "Avda. da Florida, 117" }, @@ -5671,7 +10405,7 @@ ] }, { - "stopId": 5310, + "stopId": "vitrasa:5310", "name": { "original": "Avda. da Florida, 140" }, @@ -5685,7 +10419,7 @@ ] }, { - "stopId": 5320, + "stopId": "vitrasa:5320", "name": { "original": "Avda. da Florida, 145" }, @@ -5698,7 +10432,7 @@ ] }, { - "stopId": 5330, + "stopId": "vitrasa:5330", "name": { "original": "Avda. da Florida, 3" }, @@ -5711,7 +10445,7 @@ ] }, { - "stopId": 5340, + "stopId": "vitrasa:5340", "name": { "original": "Avda. da Florida, 197" }, @@ -5724,7 +10458,7 @@ ] }, { - "stopId": 5350, + "stopId": "vitrasa:5350", "name": { "original": "Avda. da Florida, 40" }, @@ -5738,7 +10472,7 @@ ] }, { - "stopId": 5360, + "stopId": "vitrasa:5360", "name": { "original": "Avda. da Florida, 70" }, @@ -5752,7 +10486,7 @@ ] }, { - "stopId": 5370, + "stopId": "vitrasa:5370", "name": { "original": "Avda. da Florida, 69" }, @@ -5765,7 +10499,7 @@ ] }, { - "stopId": 5380, + "stopId": "vitrasa:5380", "name": { "original": "Avda. da Florida, 8" }, @@ -5779,7 +10513,7 @@ ] }, { - "stopId": 5390, + "stopId": "vitrasa:5390", "name": { "original": "Estrada de Fragoselo (cruce Camiño Río da Barxa)" }, @@ -5790,7 +10524,18 @@ ] }, { - "stopId": 5400, + "stopId": "vitrasa:540", + "name": { + "original": "Avda. de Ricardo Mella (fronte 223)" + }, + "latitude": 42.189424424, + "longitude": -8.790733064, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:5400", "name": { "original": "Avda. do Fragoso, 95" }, @@ -5805,7 +10550,7 @@ ] }, { - "stopId": 5410, + "stopId": "vitrasa:5410", "name": { "original": "Avda. do Fragoso, 12" }, @@ -5824,7 +10569,7 @@ ] }, { - "stopId": 5420, + "stopId": "vitrasa:5420", "name": { "original": "Avda. do Fragoso, 3" }, @@ -5839,7 +10584,7 @@ ] }, { - "stopId": 5430, + "stopId": "vitrasa:5430", "name": { "original": "Avda. do Fragoso, 36" }, @@ -5858,7 +10603,7 @@ ] }, { - "stopId": 5440, + "stopId": "vitrasa:5440", "name": { "original": "Avda. do Fragoso, 47" }, @@ -5873,7 +10618,7 @@ ] }, { - "stopId": 5450, + "stopId": "vitrasa:5450", "name": { "original": "Avda. do Fragoso, 54" }, @@ -5892,7 +10637,7 @@ ] }, { - "stopId": 5460, + "stopId": "vitrasa:5460", "name": { "original": "Avda. do Fragoso, 71" }, @@ -5907,7 +10652,7 @@ ] }, { - "stopId": 5470, + "stopId": "vitrasa:5470", "name": { "original": "Avda. do Fragoso, 86" }, @@ -5926,7 +10671,7 @@ ] }, { - "stopId": 5480, + "stopId": "vitrasa:5480", "name": { "original": "Estrada de San Xoán, 25" }, @@ -5937,7 +10682,7 @@ ] }, { - "stopId": 5490, + "stopId": "vitrasa:5490", "name": { "original": "Avda. de García Barbón (fronte 120)" }, @@ -5954,7 +10699,7 @@ ] }, { - "stopId": 5500, + "stopId": "vitrasa:5500", "name": { "original": "Avda. de García Barbón, 126" }, @@ -5973,7 +10718,7 @@ ] }, { - "stopId": 5510, + "stopId": "vitrasa:5510", "name": { "original": "Avda. de García Barbón, 127" }, @@ -5989,7 +10734,7 @@ ] }, { - "stopId": 5520, + "stopId": "vitrasa:5520", "name": { "original": "FORA DE SERVIZO.G.B." }, @@ -6029,7 +10774,7 @@ ] }, { - "stopId": 5530, + "stopId": "vitrasa:5530", "name": { "original": "Avda. de García Barbón, 18" }, @@ -6045,7 +10790,7 @@ ] }, { - "stopId": 5540, + "stopId": "vitrasa:5540", "name": { "original": "Avda. de García Barbón, 28" }, @@ -6062,7 +10807,7 @@ ] }, { - "stopId": 5560, + "stopId": "vitrasa:5560", "name": { "original": "Avda. de García Barbón, 60" }, @@ -6081,7 +10826,7 @@ ] }, { - "stopId": 5570, + "stopId": "vitrasa:5570", "name": { "original": "Avda. de García Barbón, 87" }, @@ -6097,7 +10842,7 @@ ] }, { - "stopId": 5580, + "stopId": "vitrasa:5580", "name": { "original": "Avda. de García Barbón, 90" }, @@ -6113,7 +10858,7 @@ ] }, { - "stopId": 5590, + "stopId": "vitrasa:5590", "name": { "original": "Avda. da Ponte (Grupo S. Gorxal)" }, @@ -6126,7 +10871,18 @@ ] }, { - "stopId": 5600, + "stopId": "vitrasa:560", + "name": { + "original": "Avda. de Ricardo Mella, 518" + }, + "latitude": 42.181015915, + "longitude": -8.807696921, + "lines": [ + "10" + ] + }, + { + "stopId": "vitrasa:5600", "name": { "original": "Avda. da Gran Vía, 107" }, @@ -6145,7 +10901,7 @@ ] }, { - "stopId": 5610, + "stopId": "vitrasa:5610", "name": { "original": "Avda. da Gran Vía, 12" }, @@ -6168,7 +10924,7 @@ ] }, { - "stopId": 5620, + "stopId": "vitrasa:5620", "name": { "original": "Avda. da Gran Vía, 148" }, @@ -6187,7 +10943,7 @@ ] }, { - "stopId": 5630, + "stopId": "vitrasa:5630", "name": { "original": "Avda. da Gran Vía, 147" }, @@ -6208,7 +10964,7 @@ ] }, { - "stopId": 5640, + "stopId": "vitrasa:5640", "name": { "original": "Avda. da Gran Vía, 176" }, @@ -6226,7 +10982,7 @@ ] }, { - "stopId": 5650, + "stopId": "vitrasa:5650", "name": { "original": "Avda. da Gran Vía, 185" }, @@ -6245,7 +11001,7 @@ ] }, { - "stopId": 5660, + "stopId": "vitrasa:5660", "name": { "original": "Avda. da Gran Vía, 19" }, @@ -6268,7 +11024,7 @@ ] }, { - "stopId": 5670, + "stopId": "vitrasa:5670", "name": { "original": "Avda. da Gran Vía, 46" }, @@ -6286,7 +11042,7 @@ ] }, { - "stopId": 5680, + "stopId": "vitrasa:5680", "name": { "original": "Avda. da Gran Vía, 66" }, @@ -6303,7 +11059,7 @@ ] }, { - "stopId": 5690, + "stopId": "vitrasa:5690", "name": { "original": "Avda. da Gran Vía, 85" }, @@ -6322,7 +11078,18 @@ ] }, { - "stopId": 5700, + "stopId": "vitrasa:570", + "name": { + "original": "Avda. de Ricardo Mella, 250" + }, + "latitude": 42.195225102, + "longitude": -8.775226375, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:5700", "name": { "original": "Avda. da Gran Vía, 104" }, @@ -6339,7 +11106,7 @@ ] }, { - "stopId": 5710, + "stopId": "vitrasa:5710", "name": { "original": "Avda. do Alcalde Gregorio Espino, 22" }, @@ -6350,7 +11117,21 @@ ] }, { - "stopId": 5720, + "stopId": "vitrasa:572", + "name": { + "original": "Estrada de Madrid, 210" + }, + "latitude": 42.214058797, + "longitude": -8.672946954, + "lines": [ + "12B", + "15B", + "15C", + "U2" + ] + }, + { + "stopId": "vitrasa:5720", "name": { "original": "Avda. do Alcalde Gregorio Espino, 33" }, @@ -6365,7 +11146,7 @@ ] }, { - "stopId": 5730, + "stopId": "vitrasa:5730", "name": { "original": "Avda. do Alcalde Gregorio Espino, 44" }, @@ -6377,7 +11158,7 @@ ] }, { - "stopId": 5740, + "stopId": "vitrasa:5740", "name": { "original": "Avda. do Alcalde Gregorio Espino, 57" }, @@ -6394,7 +11175,7 @@ ] }, { - "stopId": 5750, + "stopId": "vitrasa:5750", "name": { "original": "Avda. do Alcalde Gregorio Espino, 79" }, @@ -6411,7 +11192,7 @@ ] }, { - "stopId": 5760, + "stopId": "vitrasa:5760", "name": { "original": "Estrada de Valadares, 377" }, @@ -6422,7 +11203,7 @@ ] }, { - "stopId": 5770, + "stopId": "vitrasa:5770", "name": { "original": "Estrada de Valadares, 310" }, @@ -6434,7 +11215,7 @@ ] }, { - "stopId": 5790, + "stopId": "vitrasa:5790", "name": { "original": "Hospital do Meixoeiro" }, @@ -6450,7 +11231,18 @@ ] }, { - "stopId": 5800, + "stopId": "vitrasa:580", + "name": { + "original": "Avda. de Ricardo Mella, 135" + }, + "latitude": 42.195766012, + "longitude": -8.773648966, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:5800", "name": { "original": "Rúa de Jenaro de la Fuente, 29" }, @@ -6472,7 +11264,7 @@ ] }, { - "stopId": 5810, + "stopId": "vitrasa:5810", "name": { "original": "Rúa de Jenaro de la Fuente, 10" }, @@ -6498,7 +11290,7 @@ ] }, { - "stopId": 5820, + "stopId": "vitrasa:5820", "name": { "original": "Rúa de Jenaro de la Fuente, 22" }, @@ -6524,7 +11316,7 @@ ] }, { - "stopId": 5830, + "stopId": "vitrasa:5830", "name": { "original": "Rúa de Jenaro de la Fuente, 11" }, @@ -6546,7 +11338,7 @@ ] }, { - "stopId": 5840, + "stopId": "vitrasa:5840", "name": { "original": "Rúa da Lagoa (cruce Rúa do Balde)" }, @@ -6558,7 +11350,7 @@ ] }, { - "stopId": 5850, + "stopId": "vitrasa:5850", "name": { "original": "Rúa da Lagoa (fronte 21)" }, @@ -6570,7 +11362,7 @@ ] }, { - "stopId": 5860, + "stopId": "vitrasa:5860", "name": { "original": "Baixada á Laxe (Centro Saúde)" }, @@ -6583,7 +11375,7 @@ ] }, { - "stopId": 5870, + "stopId": "vitrasa:5870", "name": { "original": "Rúa de López Mora, 10" }, @@ -6594,7 +11386,7 @@ ] }, { - "stopId": 5880, + "stopId": "vitrasa:5880", "name": { "original": "Rúa de López Mora, 19" }, @@ -6607,7 +11399,7 @@ ] }, { - "stopId": 5890, + "stopId": "vitrasa:5890", "name": { "original": "Rúa de López Mora, 84" }, @@ -6618,7 +11410,7 @@ ] }, { - "stopId": 5900, + "stopId": "vitrasa:5900", "name": { "original": "Rúa de Macal, 8" }, @@ -6631,7 +11423,7 @@ ] }, { - "stopId": 5910, + "stopId": "vitrasa:5910", "name": { "original": "Rúa de Macal, 90" }, @@ -6644,7 +11436,7 @@ ] }, { - "stopId": 5920, + "stopId": "vitrasa:5920", "name": { "original": "Rúa de Macal (cruce Rúa de Ramiro Pascual)" }, @@ -6657,7 +11449,7 @@ ] }, { - "stopId": 5930, + "stopId": "vitrasa:5930", "name": { "original": "Rúa de Macal (frente 8)" }, @@ -6670,7 +11462,7 @@ ] }, { - "stopId": 5940, + "stopId": "vitrasa:5940", "name": { "original": "Rúa de Macal, 39" }, @@ -6683,7 +11475,7 @@ ] }, { - "stopId": 5950, + "stopId": "vitrasa:5950", "name": { "original": "Rúa dos Mestres Goldar, 62" }, @@ -6694,7 +11486,7 @@ ] }, { - "stopId": 5960, + "stopId": "vitrasa:5960", "name": { "original": "Rúa dos Mestres Goldar, 77" }, @@ -6705,7 +11497,7 @@ ] }, { - "stopId": 5970, + "stopId": "vitrasa:5970", "name": { "original": "Rúa dos Mestres Goldar, 96" }, @@ -6716,7 +11508,7 @@ ] }, { - "stopId": 5980, + "stopId": "vitrasa:5980", "name": { "original": "Rúa dos Mestres Goldar, 37" }, @@ -6727,7 +11519,20 @@ ] }, { - "stopId": 6000, + "stopId": "vitrasa:600", + "name": { + "original": "Avda. de Ricardo Mella, 273" + }, + "latitude": 42.189927171, + "longitude": -8.800634184, + "lines": [ + "C3d", + "10", + "12A" + ] + }, + { + "stopId": "vitrasa:6000", "name": { "original": "Rúa de Manuel Álvarez, 185" }, @@ -6739,7 +11544,7 @@ ] }, { - "stopId": 6010, + "stopId": "vitrasa:6010", "name": { "original": "Rúa de Manuel Álvarez (cruce Camiño Sulevada)" }, @@ -6752,7 +11557,7 @@ ] }, { - "stopId": 6020, + "stopId": "vitrasa:6020", "name": { "original": "Rúa de Manuel Álvarez, 58" }, @@ -6765,7 +11570,7 @@ ] }, { - "stopId": 6030, + "stopId": "vitrasa:6030", "name": { "original": "Rúa de Manuel Álvarez, 102" }, @@ -6777,7 +11582,7 @@ ] }, { - "stopId": 6040, + "stopId": "vitrasa:6040", "name": { "original": "Rúa de Manuel Álvarez (fronte cruce Camiño Sulevada)" }, @@ -6790,7 +11595,7 @@ ] }, { - "stopId": 6050, + "stopId": "vitrasa:6050", "name": { "original": "Rúa de Manuel Cominges, 22" }, @@ -6802,7 +11607,7 @@ ] }, { - "stopId": 6060, + "stopId": "vitrasa:6060", "name": { "original": "Rúa de Manuel Cominges, 135" }, @@ -6813,7 +11618,7 @@ ] }, { - "stopId": 6070, + "stopId": "vitrasa:6070", "name": { "original": "Rúa de Manuel Cominges, 15" }, @@ -6824,7 +11629,7 @@ ] }, { - "stopId": 6080, + "stopId": "vitrasa:6080", "name": { "original": "Rúa de Manuel Cominges, 64" }, @@ -6836,7 +11641,7 @@ ] }, { - "stopId": 6090, + "stopId": "vitrasa:6090", "name": { "original": "Rúa de Manuel Cominges, 77" }, @@ -6847,7 +11652,7 @@ ] }, { - "stopId": 6100, + "stopId": "vitrasa:6100", "name": { "original": "Rúa de Manuel Cominges, 80" }, @@ -6859,7 +11664,7 @@ ] }, { - "stopId": 6110, + "stopId": "vitrasa:6110", "name": { "original": "Camiño da Devesa, 6" }, @@ -6872,7 +11677,7 @@ ] }, { - "stopId": 6130, + "stopId": "vitrasa:6130", "name": { "original": "Estrada do Marco, 105" }, @@ -6884,7 +11689,7 @@ ] }, { - "stopId": 6140, + "stopId": "vitrasa:6140", "name": { "original": "Estrada do Marco (Colexio)" }, @@ -6895,7 +11700,7 @@ ] }, { - "stopId": 6150, + "stopId": "vitrasa:6150", "name": { "original": "Estrada De Zamáns, 233" }, @@ -6906,7 +11711,7 @@ ] }, { - "stopId": 6160, + "stopId": "vitrasa:6160", "name": { "original": "Estrada De Zamáns, 150" }, @@ -6917,7 +11722,7 @@ ] }, { - "stopId": 6180, + "stopId": "vitrasa:6180", "name": { "original": "Rúa de Marín (fronte 30)" }, @@ -6929,7 +11734,7 @@ ] }, { - "stopId": 6187, + "stopId": "vitrasa:6187", "name": { "original": "Rúa de Martín Echegaray (Parque)" }, @@ -6941,7 +11746,18 @@ ] }, { - "stopId": 6200, + "stopId": "vitrasa:620", + "name": { + "original": "Avda. de Ricado Mella, 165" + }, + "latitude": 42.1935678, + "longitude": -8.781529566, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:6200", "name": { "original": "Avda. de E. Martínez Garrido, 11" }, @@ -6954,7 +11770,7 @@ ] }, { - "stopId": 6210, + "stopId": "vitrasa:6210", "name": { "original": "Avda. de E. Martínez Garrido, 16" }, @@ -6972,7 +11788,7 @@ ] }, { - "stopId": 6220, + "stopId": "vitrasa:6220", "name": { "original": "Avda. de E. Martínez Garrido, 45" }, @@ -6983,7 +11799,7 @@ ] }, { - "stopId": 6230, + "stopId": "vitrasa:6230", "name": { "original": "Avda. de E. Martínez Garrido, 69" }, @@ -6994,7 +11810,7 @@ ] }, { - "stopId": 6240, + "stopId": "vitrasa:6240", "name": { "original": "Avda. de E. Martínez Garrido, 77" }, @@ -7005,7 +11821,7 @@ ] }, { - "stopId": 6250, + "stopId": "vitrasa:6250", "name": { "original": "Avda. de E. Martínez Garrido, 80" }, @@ -7021,7 +11837,7 @@ ] }, { - "stopId": 6260, + "stopId": "vitrasa:6260", "name": { "original": "Estrada da Balsa, 3" }, @@ -7033,7 +11849,7 @@ ] }, { - "stopId": 6280, + "stopId": "vitrasa:6280", "name": { "original": "Rúa Molais (Parque da Grileira)" }, @@ -7044,7 +11860,7 @@ ] }, { - "stopId": 6290, + "stopId": "vitrasa:6290", "name": { "original": "Rúa de San Paio (cruce Rúa Muíños)" }, @@ -7056,7 +11872,18 @@ ] }, { - "stopId": 6300, + "stopId": "vitrasa:630", + "name": { + "original": "Avda. de Ricardo Mella, 223" + }, + "latitude": 42.189304527, + "longitude": -8.79068363, + "lines": [ + "12A" + ] + }, + { + "stopId": "vitrasa:6300", "name": { "original": "Rúa de Cánovas del Castillo (Centro Comercial)" }, @@ -7081,7 +11908,7 @@ ] }, { - "stopId": 6305, + "stopId": "vitrasa:6305", "name": { "original": "O Castro" }, @@ -7092,7 +11919,7 @@ ] }, { - "stopId": 6360, + "stopId": "vitrasa:6360", "name": { "original": "Rúa de Pablo Iglesias (Colexio)" }, @@ -7103,7 +11930,7 @@ ] }, { - "stopId": 6370, + "stopId": "vitrasa:6370", "name": { "original": "Rúa de Pablo Iglesias (Río)" }, @@ -7114,7 +11941,7 @@ ] }, { - "stopId": 6380, + "stopId": "vitrasa:6380", "name": { "original": "Rúa de Pablo Iglesias, 2" }, @@ -7126,7 +11953,7 @@ ] }, { - "stopId": 6390, + "stopId": "vitrasa:6390", "name": { "original": "Rúa de Pablo Iglesias, 20" }, @@ -7138,7 +11965,7 @@ ] }, { - "stopId": 6415, + "stopId": "vitrasa:6415", "name": { "original": "Parque de Castrelos (Museo)" }, @@ -7149,7 +11976,7 @@ ] }, { - "stopId": 6420, + "stopId": "vitrasa:6420", "name": { "original": "Paseo de Alfonso XII (Mirador)" }, @@ -7160,7 +11987,7 @@ ] }, { - "stopId": 6440, + "stopId": "vitrasa:6440", "name": { "original": "Camiño do Pino Manso, 6" }, @@ -7171,7 +11998,7 @@ ] }, { - "stopId": 6450, + "stopId": "vitrasa:6450", "name": { "original": "Praza de Suárez Llanos" }, @@ -7186,7 +12013,7 @@ ] }, { - "stopId": 6460, + "stopId": "vitrasa:6460", "name": { "original": "Rúa dos Pescadores, 10" }, @@ -7198,7 +12025,7 @@ ] }, { - "stopId": 6470, + "stopId": "vitrasa:6470", "name": { "original": "Rúa de Pi i Margall, 108" }, @@ -7209,7 +12036,7 @@ ] }, { - "stopId": 6480, + "stopId": "vitrasa:6480", "name": { "original": "Rúa de Pi i Margall, 137" }, @@ -7221,7 +12048,7 @@ ] }, { - "stopId": 6490, + "stopId": "vitrasa:6490", "name": { "original": "Rúa de Pi i Margall, 32" }, @@ -7232,7 +12059,20 @@ ] }, { - "stopId": 6500, + "stopId": "vitrasa:650", + "name": { + "original": "Avda. de Ricardo Mella, 289" + }, + "latitude": 42.181065441, + "longitude": -8.807509871, + "lines": [ + "C3d", + "10", + "12A" + ] + }, + { + "stopId": "vitrasa:6500", "name": { "original": "Rúa de Pi i Margall, 51" }, @@ -7244,7 +12084,7 @@ ] }, { - "stopId": 6510, + "stopId": "vitrasa:6510", "name": { "original": "Rúa de Pi i Margall, 86" }, @@ -7255,7 +12095,7 @@ ] }, { - "stopId": 6520, + "stopId": "vitrasa:6520", "name": { "original": "Rúa de Pi i Margall, 95" }, @@ -7267,7 +12107,7 @@ ] }, { - "stopId": 6530, + "stopId": "vitrasa:6530", "name": { "original": "Rúa do Pintor Laxeiro, 4" }, @@ -7278,7 +12118,7 @@ ] }, { - "stopId": 6550, + "stopId": "vitrasa:6550", "name": { "original": "Rúa de Pizarro, 10" }, @@ -7296,7 +12136,7 @@ ] }, { - "stopId": 6560, + "stopId": "vitrasa:6560", "name": { "original": "Rúa de Pizarro, 34" }, @@ -7314,7 +12154,7 @@ ] }, { - "stopId": 6570, + "stopId": "vitrasa:6570", "name": { "original": "Rúa de Pizarro, 65" }, @@ -7334,7 +12174,7 @@ ] }, { - "stopId": 6580, + "stopId": "vitrasa:6580", "name": { "original": "Rúa de Pizarro, 7" }, @@ -7354,7 +12194,37 @@ ] }, { - "stopId": 6640, + "stopId": "vitrasa:660", + "name": { + "original": "Avda. do Alcalde Portanet, 34" + }, + "latitude": 42.211494566, + "longitude": -8.736022397, + "lines": [ + "7", + "12B", + "17", + "H1", + "VTS" + ] + }, + { + "stopId": "vitrasa:6620", + "name": { + "original": "Rúa de Policarpo Sanz, 40" + }, + "latitude": 42.23757846151978, + "longitude": -8.721031378896738, + "lines": [ + "A" + ], + "amenities": [ + "shelter", + "display" + ] + }, + { + "stopId": "vitrasa:6640", "name": { "original": "Rúa do Porriño (fronte Instituto)" }, @@ -7371,7 +12241,7 @@ ] }, { - "stopId": 6650, + "stopId": "vitrasa:6650", "name": { "original": "Rúa do Porriño (Instituto)" }, @@ -7386,7 +12256,7 @@ ] }, { - "stopId": 6660, + "stopId": "vitrasa:6660", "name": { "original": "Praza da Porta do Sol" }, @@ -7397,7 +12267,7 @@ ] }, { - "stopId": 6670, + "stopId": "vitrasa:6670", "name": { "original": "Estrada da Venda, 109" }, @@ -7409,7 +12279,7 @@ ] }, { - "stopId": 6680, + "stopId": "vitrasa:6680", "name": { "original": "Rúa do Portoloureiro, 26" }, @@ -7420,7 +12290,7 @@ ] }, { - "stopId": 6690, + "stopId": "vitrasa:6690", "name": { "original": "Rúa do Portoloureiro, 52" }, @@ -7431,7 +12301,7 @@ ] }, { - "stopId": 6700, + "stopId": "vitrasa:6700", "name": { "original": "Rúa do Portoloureiro, 43" }, @@ -7442,7 +12312,7 @@ ] }, { - "stopId": 6720, + "stopId": "vitrasa:6720", "name": { "original": "Rúa do Portoloureiro (fronte 28)" }, @@ -7453,7 +12323,7 @@ ] }, { - "stopId": 6730, + "stopId": "vitrasa:6730", "name": { "original": "Rúa do Couto, 29" }, @@ -7465,7 +12335,7 @@ ] }, { - "stopId": 6740, + "stopId": "vitrasa:6740", "name": { "original": "Rúa da Vista do Mar, 95" }, @@ -7477,7 +12347,7 @@ ] }, { - "stopId": 6750, + "stopId": "vitrasa:6750", "name": { "original": "Avda. de Samil (Praia da Fonte)" }, @@ -7491,7 +12361,7 @@ ] }, { - "stopId": 6760, + "stopId": "vitrasa:6760", "name": { "original": "Rúa de Canido (Praia da Calzoa)" }, @@ -7502,7 +12372,7 @@ ] }, { - "stopId": 6780, + "stopId": "vitrasa:6780", "name": { "original": "Avda. de Samil (Dunas)" }, @@ -7513,7 +12383,7 @@ ] }, { - "stopId": 6790, + "stopId": "vitrasa:6790", "name": { "original": "Avda. de Samil (fronte Hotel)" }, @@ -7526,7 +12396,18 @@ ] }, { - "stopId": 6800, + "stopId": "vitrasa:680", + "name": { + "original": "Avda. do Aeroporto (Aeroclub)" + }, + "latitude": 42.229005723, + "longitude": -8.634356866, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:6800", "name": { "original": "Avda. de Samil, 26" }, @@ -7537,7 +12418,7 @@ ] }, { - "stopId": 6810, + "stopId": "vitrasa:6810", "name": { "original": "Avda. de Samil (Parking)" }, @@ -7548,7 +12429,7 @@ ] }, { - "stopId": 6820, + "stopId": "vitrasa:6820", "name": { "original": "Avda. de Samil (Polideportivo)" }, @@ -7559,7 +12440,7 @@ ] }, { - "stopId": 6830, + "stopId": "vitrasa:6830", "name": { "original": "Praia do Vao" }, @@ -7570,7 +12451,7 @@ ] }, { - "stopId": 6860, + "stopId": "vitrasa:6860", "name": { "original": "Praza de Compostela" }, @@ -7595,7 +12476,7 @@ ] }, { - "stopId": 6880, + "stopId": "vitrasa:6880", "name": { "original": "Praza do Cristo da Vitoria" }, @@ -7610,7 +12491,7 @@ ] }, { - "stopId": 6890, + "stopId": "vitrasa:6890", "name": { "original": "Rúa da Cruz, 36" }, @@ -7621,7 +12502,19 @@ ] }, { - "stopId": 6900, + "stopId": "vitrasa:690", + "name": { + "original": "Avda. do Aeroporto, 656" + }, + "latitude": 42.233064093, + "longitude": -8.642742935, + "lines": [ + "A", + "25" + ] + }, + { + "stopId": "vitrasa:6900", "name": { "original": "Rúa da Cruz, 49" }, @@ -7632,7 +12525,7 @@ ] }, { - "stopId": 6930, + "stopId": "vitrasa:6930", "name": { "original": "Praza de América, 1" }, @@ -7644,7 +12537,7 @@ ] }, { - "stopId": 6940, + "stopId": "vitrasa:6940", "name": { "original": "Praza de América, 3" }, @@ -7670,7 +12563,7 @@ ] }, { - "stopId": 6950, + "stopId": "vitrasa:6950", "name": { "original": "Praza de España (cruce Rúa de Pizarro)" }, @@ -7689,7 +12582,7 @@ ] }, { - "stopId": 6955, + "stopId": "vitrasa:6955", "name": { "original": "Praza de España (cruce Rúa de Fernando Conde)" }, @@ -7705,7 +12598,7 @@ ] }, { - "stopId": 6960, + "stopId": "vitrasa:6960", "name": { "original": "Avda. das Camelias s/n ( Praza do Rei)" }, @@ -7725,7 +12618,7 @@ ] }, { - "stopId": 6970, + "stopId": "vitrasa:6970", "name": { "original": "Rúa da Coruña, 52" }, @@ -7740,7 +12633,7 @@ ] }, { - "stopId": 6980, + "stopId": "vitrasa:6980", "name": { "original": "Praza Eugenio Fadrique, 6" }, @@ -7754,7 +12647,7 @@ ] }, { - "stopId": 6990, + "stopId": "vitrasa:6990", "name": { "original": "Praza Eugenio Fadrique, 9" }, @@ -7769,7 +12662,30 @@ ] }, { - "stopId": 7000, + "stopId": "vitrasa:70", + "name": { + "original": "Rúa da Lagoa (cruce Camiño do Casmarcelo)" + }, + "latitude": 42.20020175, + "longitude": -8.700621608, + "lines": [ + "18A", + "18B" + ] + }, + { + "stopId": "vitrasa:700", + "name": { + "original": "Avda. do Aeroporto (Colexio)" + }, + "latitude": 42.228674047, + "longitude": -8.633340309, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:7000", "name": { "original": "Praza de Fernando O Católico" }, @@ -7791,7 +12707,7 @@ ] }, { - "stopId": 7030, + "stopId": "vitrasa:7030", "name": { "original": "Rúa de Manuel Castro, 23" }, @@ -7805,7 +12721,7 @@ ] }, { - "stopId": 7040, + "stopId": "vitrasa:7040", "name": { "original": "Estrada de Miraflores, 1" }, @@ -7817,7 +12733,7 @@ ] }, { - "stopId": 7050, + "stopId": "vitrasa:7050", "name": { "original": "Praza de Miraflores, 4" }, @@ -7828,7 +12744,7 @@ ] }, { - "stopId": 7060, + "stopId": "vitrasa:7060", "name": { "original": "Estrada de Moledo, 70" }, @@ -7841,7 +12757,7 @@ ] }, { - "stopId": 7070, + "stopId": "vitrasa:7070", "name": { "original": "Estrada de Moledo, 109" }, @@ -7854,7 +12770,7 @@ ] }, { - "stopId": 7080, + "stopId": "vitrasa:7080", "name": { "original": "Rúa da Rabadeira, 95" }, @@ -7866,7 +12782,7 @@ ] }, { - "stopId": 7090, + "stopId": "vitrasa:7090", "name": { "original": "Rúa de Ramiro Pascual, 108" }, @@ -7877,7 +12793,23 @@ ] }, { - "stopId": 7100, + "stopId": "vitrasa:710", + "name": { + "original": "Rúa de Aragón (Instituto)" + }, + "latitude": 42.232478958, + "longitude": -8.701988706, + "lines": [ + "A", + "4A", + "9B", + "24", + "27", + "28" + ] + }, + { + "stopId": "vitrasa:7100", "name": { "original": "Rúa de Ramiro Pascual, 16" }, @@ -7891,7 +12823,7 @@ ] }, { - "stopId": 7110, + "stopId": "vitrasa:7110", "name": { "original": "Rúa de Ramiro Pascual, 30" }, @@ -7902,7 +12834,7 @@ ] }, { - "stopId": 7120, + "stopId": "vitrasa:7120", "name": { "original": "Rúa de Ramiro Pascual, 33" }, @@ -7913,7 +12845,7 @@ ] }, { - "stopId": 7130, + "stopId": "vitrasa:7130", "name": { "original": "Rúa de Ramiro Pascual, 46" }, @@ -7924,7 +12856,7 @@ ] }, { - "stopId": 7140, + "stopId": "vitrasa:7140", "name": { "original": "Rúa de Ramiro Pascual, 71" }, @@ -7935,7 +12867,7 @@ ] }, { - "stopId": 7150, + "stopId": "vitrasa:7150", "name": { "original": "Rúa de Ramiro Pascual, 74" }, @@ -7946,7 +12878,7 @@ ] }, { - "stopId": 7160, + "stopId": "vitrasa:7160", "name": { "original": "Rúa de Ramiro Pascual, 97" }, @@ -7957,7 +12889,7 @@ ] }, { - "stopId": 7170, + "stopId": "vitrasa:7170", "name": { "original": "Rúa de Ramiro Pascual, 9" }, @@ -7971,7 +12903,20 @@ ] }, { - "stopId": 7200, + "stopId": "vitrasa:720", + "name": { + "original": "Avda. do Aeroporto, 215" + }, + "latitude": 42.235739016, + "longitude": -8.684254232, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:7200", "name": { "original": "Avda. de Ramón Nieto, 125" }, @@ -7988,7 +12933,7 @@ ] }, { - "stopId": 7210, + "stopId": "vitrasa:7210", "name": { "original": "Avda. de Ramón Nieto, 136" }, @@ -8004,7 +12949,7 @@ ] }, { - "stopId": 7220, + "stopId": "vitrasa:7220", "name": { "original": "Avda. de Ramón Nieto, 173" }, @@ -8021,7 +12966,7 @@ ] }, { - "stopId": 7230, + "stopId": "vitrasa:7230", "name": { "original": "Avda. de Ramón Nieto, 198" }, @@ -8037,7 +12982,7 @@ ] }, { - "stopId": 7240, + "stopId": "vitrasa:7240", "name": { "original": "Avda. de Ramón Nieto, 252" }, @@ -8053,7 +12998,7 @@ ] }, { - "stopId": 7250, + "stopId": "vitrasa:7250", "name": { "original": "Avda. de Ramón Nieto, 273" }, @@ -8070,7 +13015,7 @@ ] }, { - "stopId": 7260, + "stopId": "vitrasa:7260", "name": { "original": "Avda. de Ramón Nieto, 308" }, @@ -8086,7 +13031,7 @@ ] }, { - "stopId": 7270, + "stopId": "vitrasa:7270", "name": { "original": "Avda. de Ramón Nieto, 341" }, @@ -8103,7 +13048,7 @@ ] }, { - "stopId": 7280, + "stopId": "vitrasa:7280", "name": { "original": "Avda. de Ramón Nieto, 355" }, @@ -8120,7 +13065,7 @@ ] }, { - "stopId": 7290, + "stopId": "vitrasa:7290", "name": { "original": "Avda. de Ramón Nieto, 360" }, @@ -8136,7 +13081,20 @@ ] }, { - "stopId": 7300, + "stopId": "vitrasa:730", + "name": { + "original": "Avda. do Aeroporto, 130" + }, + "latitude": 42.231109162, + "longitude": -8.690501398, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:7300", "name": { "original": "Avda. de Ramón Nieto, 390" }, @@ -8152,7 +13110,7 @@ ] }, { - "stopId": 7310, + "stopId": "vitrasa:7310", "name": { "original": "Avda. de Ramón Nieto, 406" }, @@ -8167,7 +13125,7 @@ ] }, { - "stopId": 7320, + "stopId": "vitrasa:7320", "name": { "original": "Avda. de Ramón Nieto, 475" }, @@ -8184,7 +13142,7 @@ ] }, { - "stopId": 7330, + "stopId": "vitrasa:7330", "name": { "original": "Avda. de Ramón Nieto, 50" }, @@ -8200,7 +13158,7 @@ ] }, { - "stopId": 7340, + "stopId": "vitrasa:7340", "name": { "original": "Avda. de Ramón Nieto, 503" }, @@ -8216,7 +13174,7 @@ ] }, { - "stopId": 7350, + "stopId": "vitrasa:7350", "name": { "original": "Avda. de Ramón Nieto, 57" }, @@ -8233,7 +13191,7 @@ ] }, { - "stopId": 7360, + "stopId": "vitrasa:7360", "name": { "original": "Avda. de Ramón Nieto, 96" }, @@ -8249,7 +13207,7 @@ ] }, { - "stopId": 7370, + "stopId": "vitrasa:7370", "name": { "original": "Avda. de Ramón Nieto, 247" }, @@ -8266,7 +13224,7 @@ ] }, { - "stopId": 7380, + "stopId": "vitrasa:7380", "name": { "original": "Camiño do Raviso, 8" }, @@ -8277,7 +13235,7 @@ ] }, { - "stopId": 7390, + "stopId": "vitrasa:7390", "name": { "original": "Camiño do Raviso, 35" }, @@ -8288,7 +13246,20 @@ ] }, { - "stopId": 7410, + "stopId": "vitrasa:740", + "name": { + "original": "Avda. do Aeroporto, 181" + }, + "latitude": 42.233560754, + "longitude": -8.686937524, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:7410", "name": { "original": "Rúa de Eduardo Cabello (Igrexa)" }, @@ -8303,7 +13274,7 @@ ] }, { - "stopId": 7440, + "stopId": "vitrasa:7440", "name": { "original": "Rúa Da Cruz, 18" }, @@ -8314,7 +13285,7 @@ ] }, { - "stopId": 7450, + "stopId": "vitrasa:7450", "name": { "original": "Rúa da Cruz, 2" }, @@ -8325,7 +13296,7 @@ ] }, { - "stopId": 7460, + "stopId": "vitrasa:7460", "name": { "original": "Rúa da Cruz, 46" }, @@ -8336,7 +13307,7 @@ ] }, { - "stopId": 7470, + "stopId": "vitrasa:7470", "name": { "original": "Rúa Da Cruz, 63" }, @@ -8347,7 +13318,7 @@ ] }, { - "stopId": 7480, + "stopId": "vitrasa:7480", "name": { "original": "Rúa Da Cruz, 19" }, @@ -8358,7 +13329,7 @@ ] }, { - "stopId": 7490, + "stopId": "vitrasa:7490", "name": { "original": "Rúa do Carballal, 52" }, @@ -8369,7 +13340,20 @@ ] }, { - "stopId": 7500, + "stopId": "vitrasa:750", + "name": { + "original": "Avda. do Aeroporto, 184" + }, + "latitude": 42.233103986, + "longitude": -8.68716283, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:7500", "name": { "original": "Rúa do Carballal, 18" }, @@ -8380,7 +13364,7 @@ ] }, { - "stopId": 7540, + "stopId": "vitrasa:7540", "name": { "original": "Avda. do Tranvía, 100" }, @@ -8392,7 +13376,7 @@ ] }, { - "stopId": 7590, + "stopId": "vitrasa:7590", "name": { "original": "Avda. do Tranvía, 40" }, @@ -8404,7 +13388,20 @@ ] }, { - "stopId": 7600, + "stopId": "vitrasa:760", + "name": { + "original": "Avda. do Aeroporto, 240" + }, + "latitude": 42.236775611, + "longitude": -8.683736566, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:7600", "name": { "original": "Rúa dos Chans (cruce Subida Chans)" }, @@ -8415,7 +13412,7 @@ ] }, { - "stopId": 7610, + "stopId": "vitrasa:7610", "name": { "original": "Rúa das Chans (Colexio)" }, @@ -8426,7 +13423,7 @@ ] }, { - "stopId": 7620, + "stopId": "vitrasa:7620", "name": { "original": "Rúa das Chans, 97" }, @@ -8437,7 +13434,7 @@ ] }, { - "stopId": 7630, + "stopId": "vitrasa:7630", "name": { "original": "Rúa do Salgueiro, 6" }, @@ -8449,7 +13446,7 @@ ] }, { - "stopId": 7640, + "stopId": "vitrasa:7640", "name": { "original": "Rúa da Rabadeira, 135" }, @@ -8461,7 +13458,7 @@ ] }, { - "stopId": 7650, + "stopId": "vitrasa:7650", "name": { "original": "Rúa da Rabadeira, 64" }, @@ -8474,7 +13471,7 @@ ] }, { - "stopId": 7660, + "stopId": "vitrasa:7660", "name": { "original": "Rúa da Rabadeira, 104" }, @@ -8487,7 +13484,7 @@ ] }, { - "stopId": 7662, + "stopId": "vitrasa:7662", "name": { "original": "Rúa de Recaré, 6" }, @@ -8498,7 +13495,7 @@ ] }, { - "stopId": 7664, + "stopId": "vitrasa:7664", "name": { "original": "Rúa de Recaré (cruce Segade)" }, @@ -8509,7 +13506,7 @@ ] }, { - "stopId": 7666, + "stopId": "vitrasa:7666", "name": { "original": "Rúa de Recaré, 3" }, @@ -8520,7 +13517,7 @@ ] }, { - "stopId": 7668, + "stopId": "vitrasa:7668", "name": { "original": "Rúa de Recaré, 39" }, @@ -8531,7 +13528,7 @@ ] }, { - "stopId": 7670, + "stopId": "vitrasa:7670", "name": { "original": "Rúa San Cristobo, 6" }, @@ -8542,7 +13539,7 @@ ] }, { - "stopId": 7680, + "stopId": "vitrasa:7680", "name": { "original": "Rúa San Cristobo, 117" }, @@ -8554,7 +13551,7 @@ ] }, { - "stopId": 7690, + "stopId": "vitrasa:7690", "name": { "original": "Rúa San Cristobo, 11" }, @@ -8566,7 +13563,20 @@ ] }, { - "stopId": 7700, + "stopId": "vitrasa:770", + "name": { + "original": "Avda. do Aeroporto, 273" + }, + "latitude": 42.238939528, + "longitude": -8.681422497, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:7700", "name": { "original": "Rúa San Cristobo, 30" }, @@ -8577,7 +13587,7 @@ ] }, { - "stopId": 7710, + "stopId": "vitrasa:7710", "name": { "original": "Rúa San Cristobo, 41" }, @@ -8589,7 +13599,7 @@ ] }, { - "stopId": 7720, + "stopId": "vitrasa:7720", "name": { "original": "Rúa San Cristobo, 80" }, @@ -8600,7 +13610,7 @@ ] }, { - "stopId": 7730, + "stopId": "vitrasa:7730", "name": { "original": "Rúa do Salgueiro, 24" }, @@ -8612,7 +13622,7 @@ ] }, { - "stopId": 7740, + "stopId": "vitrasa:7740", "name": { "original": "Rúa de Salgueiro, 23" }, @@ -8625,7 +13635,7 @@ ] }, { - "stopId": 7750, + "stopId": "vitrasa:7750", "name": { "original": "Rúa do Salgueiro, 1" }, @@ -8638,7 +13648,7 @@ ] }, { - "stopId": 7760, + "stopId": "vitrasa:7760", "name": { "original": "Camiño das Cunchadas (cruce Rúa da Senra)" }, @@ -8649,7 +13659,7 @@ ] }, { - "stopId": 7762, + "stopId": "vitrasa:7762", "name": { "original": "Rúa de Segade, 41" }, @@ -8660,7 +13670,7 @@ ] }, { - "stopId": 7764, + "stopId": "vitrasa:7764", "name": { "original": "Rúa de Segade, 86" }, @@ -8671,7 +13681,20 @@ ] }, { - "stopId": 7810, + "stopId": "vitrasa:780", + "name": { + "original": "Avda. do Aeroporto, 298" + }, + "latitude": 42.238554288, + "longitude": -8.680663432, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:7810", "name": { "original": "Estrada Miraflores (Parque Parróco Xesús Alonso)" }, @@ -8684,7 +13707,7 @@ ] }, { - "stopId": 7830, + "stopId": "vitrasa:7830", "name": { "original": "Rúa de Saa, 72" }, @@ -8696,7 +13719,7 @@ ] }, { - "stopId": 7840, + "stopId": "vitrasa:7840", "name": { "original": "Rúa da Saa do Monte, 73" }, @@ -8707,7 +13730,7 @@ ] }, { - "stopId": 7849, + "stopId": "vitrasa:7849", "name": { "original": "Rúa de Saá, 105" }, @@ -8718,7 +13741,7 @@ ] }, { - "stopId": 7850, + "stopId": "vitrasa:7850", "name": { "original": "Rúa de Saa, 57" }, @@ -8729,7 +13752,7 @@ ] }, { - "stopId": 7860, + "stopId": "vitrasa:7860", "name": { "original": "Rúa de Severino Cobas, 73" }, @@ -8740,7 +13763,7 @@ ] }, { - "stopId": 7870, + "stopId": "vitrasa:7870", "name": { "original": "Baixada á Praia, 4" }, @@ -8753,7 +13776,7 @@ ] }, { - "stopId": 7880, + "stopId": "vitrasa:7880", "name": { "original": "Barrio da Salgueira, 106" }, @@ -8764,7 +13787,7 @@ ] }, { - "stopId": 7890, + "stopId": "vitrasa:7890", "name": { "original": "Avda. de Cesáreo Vázquez, 61" }, @@ -8776,43 +13799,53 @@ ] }, { - "stopId": 7900, + "stopId": "vitrasa:790", + "name": { + "original": "Avda. do Aeroporto, 325" + }, + "latitude": 42.237426811, + "longitude": -8.675474476, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:7900", "name": { "original": "Rúa de San Paio (cruce Camiño da Quintela)" }, "latitude": 42.20492472, "longitude": -8.768904292, "lines": [ - "4A", "12A" ] }, { - "stopId": 7910, + "stopId": "vitrasa:7910", "name": { "original": "Rúa de San Paio (Igrexa)" }, "latitude": 42.208040013, "longitude": -8.767458581, "lines": [ - "4A", "12A" ] }, { - "stopId": 7920, + "stopId": "vitrasa:7920", "name": { "original": "Rúa de San Paio (Torreiro)" }, "latitude": 42.208926096, "longitude": -8.765294038, "lines": [ - "4A", "12A" ] }, { - "stopId": 7930, + "stopId": "vitrasa:7930", "name": { "original": "Rúa de San Paio, 136" }, @@ -8824,7 +13857,7 @@ ] }, { - "stopId": 7940, + "stopId": "vitrasa:7940", "name": { "original": "Rúa de San Paio, 220" }, @@ -8836,7 +13869,7 @@ ] }, { - "stopId": 7950, + "stopId": "vitrasa:7950", "name": { "original": "Rúa de San Paio, 242" }, @@ -8848,7 +13881,7 @@ ] }, { - "stopId": 7960, + "stopId": "vitrasa:7960", "name": { "original": "Rúa de San Paio, 284" }, @@ -8860,19 +13893,18 @@ ] }, { - "stopId": 7970, + "stopId": "vitrasa:7970", "name": { "original": "Rúa de San Paio (fronte 58)" }, "latitude": 42.213820465, "longitude": -8.760651176, "lines": [ - "4A", "12A" ] }, { - "stopId": 7980, + "stopId": "vitrasa:7980", "name": { "original": "Rúa de San Paio, 54" }, @@ -8884,7 +13916,7 @@ ] }, { - "stopId": 7990, + "stopId": "vitrasa:7990", "name": { "original": "Rúa de San Paio, 76" }, @@ -8896,19 +13928,43 @@ ] }, { - "stopId": 8000, + "stopId": "vitrasa:80", + "name": { + "original": "Rúa da Lagoa, 46" + }, + "latitude": 42.200132216, + "longitude": -8.700535777, + "lines": [ + "18A", + "18B" + ] + }, + { + "stopId": "vitrasa:800", + "name": { + "original": "Avda. do Aeroporto, 328" + }, + "latitude": 42.237801674, + "longitude": -8.676524783, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:8000", "name": { "original": "Rúa de San Paio, 83" }, "latitude": 42.212034517, "longitude": -8.760916715, "lines": [ - "4A", "12A" ] }, { - "stopId": 8010, + "stopId": "vitrasa:8010", "name": { "original": "Rúa de Sanjurjo Badía, 106" }, @@ -8927,7 +13983,7 @@ ] }, { - "stopId": 8020, + "stopId": "vitrasa:8020", "name": { "original": "Rúa de Sanjurjo Badía, 123" }, @@ -8943,7 +13999,7 @@ ] }, { - "stopId": 8030, + "stopId": "vitrasa:8030", "name": { "original": "Rúa de Sanjurjo Badía, 136" }, @@ -8962,7 +14018,7 @@ ] }, { - "stopId": 8040, + "stopId": "vitrasa:8040", "name": { "original": "Rúa de Sanjurjo Badía, 167" }, @@ -8978,7 +14034,7 @@ ] }, { - "stopId": 8050, + "stopId": "vitrasa:8050", "name": { "original": "Rúa de Sanjurjo Badía, 202" }, @@ -8997,7 +14053,7 @@ ] }, { - "stopId": 8060, + "stopId": "vitrasa:8060", "name": { "original": "Rúa de Sanjurjo Badía, 79" }, @@ -9013,7 +14069,7 @@ ] }, { - "stopId": 8090, + "stopId": "vitrasa:8090", "name": { "original": "Estrada Miraflores (Centro Saúde)" }, @@ -9026,7 +14082,20 @@ ] }, { - "stopId": 8100, + "stopId": "vitrasa:810", + "name": { + "original": "Avda. do Aeroporto, 350" + }, + "latitude": 42.235521261, + "longitude": -8.67465521, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:8100", "name": { "original": "Estrada da Gándara, 79" }, @@ -9037,7 +14106,7 @@ ] }, { - "stopId": 8110, + "stopId": "vitrasa:8110", "name": { "original": "Estrada da Gándara (Seoane)" }, @@ -9048,7 +14117,7 @@ ] }, { - "stopId": 8120, + "stopId": "vitrasa:8120", "name": { "original": "Rúa de Severino Cobas (cruce Trav. de Santa Cristina)" }, @@ -9059,7 +14128,7 @@ ] }, { - "stopId": 8130, + "stopId": "vitrasa:8130", "name": { "original": "Rúa de Severino Cobas, 51" }, @@ -9070,7 +14139,7 @@ ] }, { - "stopId": 8140, + "stopId": "vitrasa:8140", "name": { "original": "Rúa de Severino Cobas, 14" }, @@ -9081,7 +14150,7 @@ ] }, { - "stopId": 8150, + "stopId": "vitrasa:8150", "name": { "original": "Rúa de Severino Cobas, 3" }, @@ -9092,7 +14161,7 @@ ] }, { - "stopId": 8160, + "stopId": "vitrasa:8160", "name": { "original": "Rúa de Severino Cobas, 88" }, @@ -9103,7 +14172,7 @@ ] }, { - "stopId": 8170, + "stopId": "vitrasa:8170", "name": { "original": "Rúa de Severino Cobas, 140" }, @@ -9114,7 +14183,7 @@ ] }, { - "stopId": 8180, + "stopId": "vitrasa:8180", "name": { "original": "Estrada da Garrida, 291" }, @@ -9125,7 +14194,7 @@ ] }, { - "stopId": 8190, + "stopId": "vitrasa:8190", "name": { "original": "Subida da Costa (Colina)" }, @@ -9136,7 +14205,19 @@ ] }, { - "stopId": 8200, + "stopId": "vitrasa:820", + "name": { + "original": "Avda. do Aeroporto, 377" + }, + "latitude": 42.234766626, + "longitude": -8.671305131, + "lines": [ + "A", + "9B" + ] + }, + { + "stopId": "vitrasa:8200", "name": { "original": "Subida da Costa, 21" }, @@ -9147,7 +14228,7 @@ ] }, { - "stopId": 8210, + "stopId": "vitrasa:8210", "name": { "original": "Subida da Costa, 3" }, @@ -9158,7 +14239,7 @@ ] }, { - "stopId": 8220, + "stopId": "vitrasa:8220", "name": { "original": "Camiño da Corredoura, 3" }, @@ -9169,7 +14250,7 @@ ] }, { - "stopId": 8230, + "stopId": "vitrasa:8230", "name": { "original": "Rúa dos Chans (cruce Camiño Regada)" }, @@ -9180,7 +14261,7 @@ ] }, { - "stopId": 8240, + "stopId": "vitrasa:8240", "name": { "original": "Subida á Madroa (Urbanización)" }, @@ -9193,7 +14274,7 @@ ] }, { - "stopId": 8250, + "stopId": "vitrasa:8250", "name": { "original": "Subida á Madroa, 15" }, @@ -9206,7 +14287,7 @@ ] }, { - "stopId": 8282, + "stopId": "vitrasa:8282", "name": { "original": "Subida á Mouteira, 6" }, @@ -9217,7 +14298,7 @@ ] }, { - "stopId": 8284, + "stopId": "vitrasa:8284", "name": { "original": "Subida á Mouteira (Parque Monte Calvario)" }, @@ -9228,7 +14309,7 @@ ] }, { - "stopId": 8290, + "stopId": "vitrasa:8290", "name": { "original": "Subida das Ánimas, 31" }, @@ -9240,7 +14321,20 @@ ] }, { - "stopId": 8300, + "stopId": "vitrasa:830", + "name": { + "original": "Avda. do Aeroporto, 378" + }, + "latitude": 42.234673289, + "longitude": -8.671348046, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:8300", "name": { "original": "Subida das Ánimas, 32" }, @@ -9252,7 +14346,7 @@ ] }, { - "stopId": 8330, + "stopId": "vitrasa:8330", "name": { "original": "Rúa de Tomás A. Alonso, 86" }, @@ -9266,7 +14360,7 @@ ] }, { - "stopId": 8340, + "stopId": "vitrasa:8340", "name": { "original": "Rúa de Tomás A. Alonso, 137" }, @@ -9282,7 +14376,7 @@ ] }, { - "stopId": 8370, + "stopId": "vitrasa:8370", "name": { "original": "Rúa de Tomás A. Alonso, 220" }, @@ -9294,7 +14388,7 @@ ] }, { - "stopId": 8390, + "stopId": "vitrasa:8390", "name": { "original": "Rúa de Tomás A. Alonso, 251" }, @@ -9310,7 +14404,23 @@ ] }, { - "stopId": 8410, + "stopId": "vitrasa:840", + "name": { + "original": "Avda. do Aeroporto, 43" + }, + "latitude": 42.234904325, + "longitude": -8.699245802, + "lines": [ + "A", + "4A", + "9B", + "24", + "27", + "28" + ] + }, + { + "stopId": "vitrasa:8410", "name": { "original": "Rúa de Tomás Paredes (fronte 108)" }, @@ -9323,7 +14433,7 @@ ] }, { - "stopId": 8420, + "stopId": "vitrasa:8420", "name": { "original": "Rúa de Tomás Paredes, 114" }, @@ -9335,7 +14445,7 @@ ] }, { - "stopId": 8430, + "stopId": "vitrasa:8430", "name": { "original": "Rúa de Tomás Paredes, 9" }, @@ -9348,7 +14458,7 @@ ] }, { - "stopId": 8440, + "stopId": "vitrasa:8440", "name": { "original": "Rúa de Tomás Paredes, 86" }, @@ -9360,7 +14470,7 @@ ] }, { - "stopId": 8450, + "stopId": "vitrasa:8450", "name": { "original": "Rúa do Conde de Torrecedeira (Parque)" }, @@ -9378,7 +14488,7 @@ ] }, { - "stopId": 8460, + "stopId": "vitrasa:8460", "name": { "original": "Rúa do Conde de Torrecedeira, 105" }, @@ -9395,7 +14505,7 @@ ] }, { - "stopId": 8470, + "stopId": "vitrasa:8470", "name": { "original": "Rúa do Conde de Torrecedeira, 21" }, @@ -9413,7 +14523,7 @@ ] }, { - "stopId": 8480, + "stopId": "vitrasa:8480", "name": { "original": "Rúa do Conde de Torrecedeira, 81" }, @@ -9431,7 +14541,7 @@ ] }, { - "stopId": 8490, + "stopId": "vitrasa:8490", "name": { "original": "Rúa da Travesía de Vigo, 202" }, @@ -9446,7 +14556,19 @@ ] }, { - "stopId": 8500, + "stopId": "vitrasa:850", + "name": { + "original": "Avda. do Aeroporto, 423" + }, + "latitude": 42.23630176, + "longitude": -8.665791599, + "lines": [ + "A", + "9B" + ] + }, + { + "stopId": "vitrasa:8500", "name": { "original": "Rúa da Travesía de Vigo, 105" }, @@ -9462,7 +14584,7 @@ ] }, { - "stopId": 8510, + "stopId": "vitrasa:8510", "name": { "original": "Rúa da Travesía de Vigo, 124" }, @@ -9476,7 +14598,7 @@ ] }, { - "stopId": 8520, + "stopId": "vitrasa:8520", "name": { "original": "Rúa da Travesía de Vigo, 153" }, @@ -9492,7 +14614,7 @@ ] }, { - "stopId": 8530, + "stopId": "vitrasa:8530", "name": { "original": "Rúa da Travesía de Vigo, 158" }, @@ -9506,7 +14628,7 @@ ] }, { - "stopId": 8540, + "stopId": "vitrasa:8540", "name": { "original": "Rúa da Travesía de Vigo, 193" }, @@ -9522,7 +14644,7 @@ ] }, { - "stopId": 8550, + "stopId": "vitrasa:8550", "name": { "original": "Rúa da Travesía de Vigo, 220" }, @@ -9538,7 +14660,7 @@ ] }, { - "stopId": 8560, + "stopId": "vitrasa:8560", "name": { "original": "Rúa da Travesía de Vigo, 213" }, @@ -9555,7 +14677,7 @@ ] }, { - "stopId": 8570, + "stopId": "vitrasa:8570", "name": { "original": "Rúa da Travesía de Vigo, 239" }, @@ -9572,7 +14694,7 @@ ] }, { - "stopId": 8580, + "stopId": "vitrasa:8580", "name": { "original": "Rúa da Travesía de Vigo, 32" }, @@ -9587,7 +14709,7 @@ ] }, { - "stopId": 8590, + "stopId": "vitrasa:8590", "name": { "original": "Rúa da Travesía de Vigo, 37" }, @@ -9603,7 +14725,20 @@ ] }, { - "stopId": 8600, + "stopId": "vitrasa:860", + "name": { + "original": "Avda. do Aeroporto, 446" + }, + "latitude": 42.235612667, + "longitude": -8.666529207, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:8600", "name": { "original": "Rúa da Travesía de Vigo, 71" }, @@ -9619,7 +14754,7 @@ ] }, { - "stopId": 8610, + "stopId": "vitrasa:8610", "name": { "original": "Rúa da Travesía de Vigo, 8" }, @@ -9647,7 +14782,7 @@ ] }, { - "stopId": 8620, + "stopId": "vitrasa:8620", "name": { "original": "Rúa da Travesía de Vigo, 82" }, @@ -9661,7 +14796,7 @@ ] }, { - "stopId": 8630, + "stopId": "vitrasa:8630", "name": { "original": "Rúa da Travesía de Vigo, 7" }, @@ -9691,7 +14826,7 @@ ] }, { - "stopId": 8660, + "stopId": "vitrasa:8660", "name": { "original": "Química (CUVI)" }, @@ -9705,7 +14840,7 @@ ] }, { - "stopId": 8670, + "stopId": "vitrasa:8670", "name": { "original": "Bioloxía (CUVI)" }, @@ -9719,7 +14854,7 @@ ] }, { - "stopId": 8680, + "stopId": "vitrasa:8680", "name": { "original": "Económicas e Empresariais (CUVI)" }, @@ -9733,7 +14868,19 @@ ] }, { - "stopId": 8700, + "stopId": "vitrasa:870", + "name": { + "original": "Avda. do Aeroporto, 447" + }, + "latitude": 42.23543058, + "longitude": -8.66197943, + "lines": [ + "A", + "9B" + ] + }, + { + "stopId": "vitrasa:8700", "name": { "original": "Enxeñeiros (CUVI)" }, @@ -9747,7 +14894,7 @@ ] }, { - "stopId": 8710, + "stopId": "vitrasa:8710", "name": { "original": "Universidade." }, @@ -9758,7 +14905,7 @@ ] }, { - "stopId": 8720, + "stopId": "vitrasa:8720", "name": { "original": "Humanidades (CUVI)" }, @@ -9772,7 +14919,7 @@ ] }, { - "stopId": 8721, + "stopId": "vitrasa:8721", "name": { "original": "Universidade.." }, @@ -9784,7 +14931,7 @@ ] }, { - "stopId": 8730, + "stopId": "vitrasa:8730", "name": { "original": "Telecomunicacións (CUVI) B" }, @@ -9795,7 +14942,7 @@ ] }, { - "stopId": 8740, + "stopId": "vitrasa:8740", "name": { "original": "Telecomunicacións (CUVI)" }, @@ -9809,7 +14956,7 @@ ] }, { - "stopId": 8750, + "stopId": "vitrasa:8750", "name": { "original": "Rúa de Urzáiz - Est. Intermodal - C.C." }, @@ -9832,7 +14979,7 @@ ] }, { - "stopId": 8770, + "stopId": "vitrasa:8770", "name": { "original": "Rúa de Urzáiz, 13" }, @@ -9864,7 +15011,20 @@ ] }, { - "stopId": 8820, + "stopId": "vitrasa:880", + "name": { + "original": "Avda. do Aeroporto, 484" + }, + "latitude": 42.23544051, + "longitude": -8.662354939, + "lines": [ + "A", + "9B", + "27" + ] + }, + { + "stopId": "vitrasa:8820", "name": { "original": "Rúa de Urzáiz, 28" }, @@ -9894,7 +15054,7 @@ ] }, { - "stopId": 8840, + "stopId": "vitrasa:8840", "name": { "original": "Rúa de Urzáiz, 60 - Est. Intermodal - C.C." }, @@ -9916,7 +15076,7 @@ ] }, { - "stopId": 8850, + "stopId": "vitrasa:8850", "name": { "original": "Rúa de Urzáiz, 97" }, @@ -9938,7 +15098,7 @@ ] }, { - "stopId": 8870, + "stopId": "vitrasa:8870", "name": { "original": "Rúa de Venezuela, 4" }, @@ -9957,7 +15117,7 @@ ] }, { - "stopId": 8880, + "stopId": "vitrasa:8880", "name": { "original": "Rúa de Venezuela, 20" }, @@ -9976,7 +15136,7 @@ ] }, { - "stopId": 8890, + "stopId": "vitrasa:8890", "name": { "original": "Rúa de Venezuela, 21" }, @@ -9994,7 +15154,18 @@ ] }, { - "stopId": 8900, + "stopId": "vitrasa:890", + "name": { + "original": "Avda. do Aeroporto, 491" + }, + "latitude": 42.232066419, + "longitude": -8.653842977, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:8900", "name": { "original": "Rúa de Venezuela, 45" }, @@ -10012,7 +15183,7 @@ ] }, { - "stopId": 8910, + "stopId": "vitrasa:8910", "name": { "original": "Rúa de Venezuela, 42" }, @@ -10031,7 +15202,7 @@ ] }, { - "stopId": 8916, + "stopId": "vitrasa:8916", "name": { "original": "Rúa de Venezuela, 60" }, @@ -10042,7 +15213,7 @@ ] }, { - "stopId": 8930, + "stopId": "vitrasa:8930", "name": { "original": "Rúa de Vilagarcía de Arousa (cruce Rúa do Grove)" }, @@ -10054,7 +15225,7 @@ ] }, { - "stopId": 8950, + "stopId": "vitrasa:8950", "name": { "original": "Rúa de Marín, 5" }, @@ -10066,7 +15237,7 @@ ] }, { - "stopId": 8970, + "stopId": "vitrasa:8970", "name": { "original": "Rúa do Seixo, 45" }, @@ -10078,7 +15249,7 @@ ] }, { - "stopId": 8980, + "stopId": "vitrasa:8980", "name": { "original": "Rúa do Seixo, 38" }, @@ -10090,7 +15261,7 @@ ] }, { - "stopId": 8990, + "stopId": "vitrasa:8990", "name": { "original": "Rúa do Seixo, 75" }, @@ -10103,7 +15274,29 @@ ] }, { - "stopId": 9000, + "stopId": "vitrasa:90", + "name": { + "original": "Aeroporto de Peinador" + }, + "latitude": 42.225956918, + "longitude": -8.63286469, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:900", + "name": { + "original": "Avda. do Aeroporto, 531" + }, + "latitude": 42.233527998, + "longitude": -8.648237616, + "lines": [ + "A" + ] + }, + { + "stopId": "vitrasa:9000", "name": { "original": "Rúa do Seixo (Parque)" }, @@ -10115,7 +15308,7 @@ ] }, { - "stopId": 9010, + "stopId": "vitrasa:9010", "name": { "original": "Rúa de Xeme, 71" }, @@ -10126,7 +15319,7 @@ ] }, { - "stopId": 9020, + "stopId": "vitrasa:9020", "name": { "original": "Xestoso" }, @@ -10138,7 +15331,7 @@ ] }, { - "stopId": 9030, + "stopId": "vitrasa:9030", "name": { "original": "Xestoso (B)" }, @@ -10150,7 +15343,7 @@ ] }, { - "stopId": 9040, + "stopId": "vitrasa:9040", "name": { "original": "Estrada das Plantas (cruce Camiño Monte Vello)" }, @@ -10163,7 +15356,7 @@ ] }, { - "stopId": 9050, + "stopId": "vitrasa:9050", "name": { "original": "Estrada da Igrexa, 45" }, @@ -10174,5041 +15367,114 @@ ] }, { - "stopId": 10061, - "name": { - "original": "Estrada de San Xoán, 193" - }, - "latitude": 42.185277472, - "longitude": -8.741558953, - "lines": [ - "17" - ] - }, - { - "stopId": 14101, - "name": { - "original": "Estrada da Garrida, 165" - }, - "latitude": 42.168008539, - "longitude": -8.710415438, - "lines": [ - "7" - ] - }, - { - "stopId": 14102, - "name": { - "original": "Estrada da Garrida, 108" - }, - "latitude": 42.168282882, - "longitude": -8.710066751, - "lines": [ - "7" - ] - }, - { - "stopId": 14105, - "name": { - "original": "Ciencias Xurídicas (CUVI)" - }, - "latitude": 42.167237978, - "longitude": -8.681135704, - "lines": [ - "A", - "15C", - "U1", - "U2" - ] - }, - { - "stopId": 14106, - "name": { - "original": "Avda. do Aeroporto, 92" - }, - "latitude": 42.234161582, - "longitude": -8.695074564, - "lines": [ - "A", - "9B", - "27" - ] - }, - { - "stopId": 14107, - "name": { - "original": "Camiño Padín (Rotonda Autoestrada)" - }, - "latitude": 42.257847205, - "longitude": -8.677696507, - "lines": [ - "10" - ] - }, - { - "stopId": 14108, - "name": { - "original": "Avda. da Ponte (antes desvío Autovía)" - }, - "latitude": 42.21401741, - "longitude": -8.67133083, - "lines": [ - "15B", - "15C" - ] - }, - { - "stopId": 14111, - "name": { - "original": "Estrada de Bembrive (Centro Saúde)" - }, - "latitude": 42.204262657, - "longitude": -8.684801801, - "lines": [ - "6", - "14" - ] - }, - { - "stopId": 14112, - "name": { - "original": "Estrada de Bembrive (Alameda)" - }, - "latitude": 42.204047198, - "longitude": -8.684697288, - "lines": [ - "6", - "14" - ] - }, - { - "stopId": 14113, - "name": { - "original": "Estrada da Coutada, 20" - }, - "latitude": 42.193458577, - "longitude": -8.702065856, - "lines": [ - "6", - "27" - ] - }, - { - "stopId": 14117, - "name": { - "original": "Rúa do Couto de San Honorato, 26" - }, - "latitude": 42.228574702, - "longitude": -8.712864548, - "lines": [ - "H2" - ] - }, - { - "stopId": 14119, - "name": { - "original": "Rúa do Couto de San Honorato, 80" - }, - "latitude": 42.229320789, - "longitude": -8.710390551, - "lines": [ - "H2" - ] - }, - { - "stopId": 14122, - "name": { - "original": "Avda. do Alcalde Gregorio Espino, 9" - }, - "latitude": 42.231584097, - "longitude": -8.706968521, - "lines": [ - "4C", - "23", - "31", - "H2", - "PSA 4" - ] - }, - { - "stopId": 14123, - "name": { - "original": "Rúa do Porriño, 9" - }, - "latitude": 42.214127819, - "longitude": -8.752027594, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "5B", - "11", - "15A", - "15B", - "N4", - "U1" - ] - }, - { - "stopId": 14124, - "name": { - "original": "Rúa de Eduardo Cabello (fronte Igrexa)" - }, - "latitude": 42.226569499, - "longitude": -8.752773946, - "lines": [ - "C3d", - "C3i", - "6" - ] - }, - { - "stopId": 14125, - "name": { - "original": "Rúa do Porriño (fronte 9)" - }, - "latitude": 42.213869651, - "longitude": -8.751990789, - "lines": [ - "C3d", - "C3i", - "4A", - "4C", - "15A", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 14126, + "stopId": "vitrasa:910", "name": { - "original": "Rúa da Travesía de Vigo, 194" - }, - "latitude": 42.242494425, - "longitude": -8.699249038, - "lines": [ - "C3i", - "5A", - "N1", - "VTS" - ] - }, - { - "stopId": 14127, - "name": { - "original": "Avda. de Buenos Aires, 13" - }, - "latitude": 42.249306896, - "longitude": -8.695179916, - "lines": [ - "5B", - "10", - "N1", - "H3", - "VTS" - ] - }, - { - "stopId": 14128, - "name": { - "original": "Camiño do Caramuxo (fronte 9)" - }, - "latitude": 42.20733292, - "longitude": -8.752159103, - "lines": [ - "5A" - ] - }, - { - "stopId": 14129, - "name": { - "original": "Camiño do Caramuxo, 11" - }, - "latitude": 42.20723039, - "longitude": -8.752592351, - "lines": [ - "5A" - ] - }, - { - "stopId": 14131, - "name": { - "original": "Rúa de Tomás Paredes, 4" - }, - "latitude": 42.221948768, - "longitude": -8.753171211, - "lines": [ - "C3i", - "10" - ] - }, - { - "stopId": 14132, - "name": { - "original": "Rúa de Sanjurjo Badía, 252" - }, - "latitude": 42.249307631, - "longitude": -8.696542008, - "lines": [ - "C3d", - "5A", - "5B", - "10", - "17", - "31", - "U2", - "H2", - "H3", - "PSA 1" - ] - }, - { - "stopId": 14133, - "name": { - "original": "Avda. de Galicia, 37" - }, - "latitude": 42.250977575, - "longitude": -8.694471881, - "lines": [ - "C3i", - "17" - ] - }, - { - "stopId": 14134, - "name": { - "original": "Avda. de Galicia, 182" - }, - "latitude": 42.253208793, - "longitude": -8.686995591, - "lines": [ - "C3d" - ] - }, - { - "stopId": 14135, - "name": { - "original": "Rúa de Santo Amaro (Praza de España)" - }, - "latitude": 42.229174145, - "longitude": -8.720143055, - "lines": [ - "C1" - ] - }, - { - "stopId": 14136, - "name": { - "original": "Avda. de Galicia, 18" - }, - "latitude": 42.250484372, - "longitude": -8.694878804, - "lines": [ - "C3d", - "17" - ] - }, - { - "stopId": 14137, - "name": { - "original": "Estrada Matamá Pazo (Igrexa)" - }, - "latitude": 42.200003406, - "longitude": -8.753169, - "lines": [ - "29" - ] - }, - { - "stopId": 14138, - "name": { - "original": "Estrada de Madrid (Campo de Fútbol)" - }, - "latitude": 42.216459201, - "longitude": -8.678591709, - "lines": [ - "12B", - "15B", - "15C" - ] - }, - { - "stopId": 14139, - "name": { - "original": "Avda. de E. Martínez Garrido, 27" - }, - "latitude": 42.227492758, - "longitude": -8.700413366, - "lines": [ - "6", - "25", - "31" - ] - }, - { - "stopId": 14140, - "name": { - "original": "Avda. de E. Martínez Garrido, 30" - }, - "latitude": 42.228210877, - "longitude": -8.699999354, - "lines": [ - "4C", - "6", - "23", - "25", - "31", - "N4", - "PSA 4", - "VTS" - ] - }, - { - "stopId": 14141, - "name": { - "original": "Rúa de Jenaro de la Fuente, 43" - }, - "latitude": 42.231379202, - "longitude": -8.699876213, - "lines": [ - "11", - "15A", - "15B", - "15C", - "H3" - ] - }, - { - "stopId": 14142, - "name": { - "original": "Avda. da Hispanidade, 22" - }, - "latitude": 42.231463434, - "longitude": -8.728844425, - "lines": [ - "16" - ] - }, - { - "stopId": 14143, - "name": { - "original": "Avda. da Hispanidade, 38" - }, - "latitude": 42.229753483, - "longitude": -8.729002675, - "lines": [ - "16" - ] - }, - { - "stopId": 14144, - "name": { - "original": "Avda. da Hispanidade, 82" - }, - "latitude": 42.226760436, - "longitude": -8.727385303, - "lines": [ - "16" - ] - }, - { - "stopId": 14150, - "name": { - "original": "Rúa do Padre Don Rúa, 1" - }, - "latitude": 42.232076561, - "longitude": -8.719055236, - "lines": [ - "14", - "18A" - ] - }, - { - "stopId": 14152, - "name": { - "original": "Rúa do Monte Calvario, 4" - }, - "latitude": 42.204815402, - "longitude": -8.687168969, - "lines": [ - "14" - ] - }, - { - "stopId": 14153, - "name": { - "original": "Estrada de Bembrive, 173" - }, - "latitude": 42.205357233, - "longitude": -8.692495739, - "lines": [ - "6", - "14" - ] - }, - { - "stopId": 14154, - "name": { - "original": "Rúa das Chans (fronte 56)" - }, - "latitude": 42.19360258, - "longitude": -8.677258993, - "lines": [ - "14" - ] - }, - { - "stopId": 14156, - "name": { - "original": "Rúa de Xeme (cruce Camiño da Carballeira)" - }, - "latitude": 42.203378431, - "longitude": -8.696666863, - "lines": [ - "14" - ] - }, - { - "stopId": 14157, - "name": { - "original": "Rúa do Xeme (cruce Rúa de Eifonso)" - }, - "latitude": 42.202979066, - "longitude": -8.694065121, - "lines": [ - "14" - ] - }, - { - "stopId": 14161, - "name": { - "original": "Rúa de López Mora, 62" - }, - "latitude": 42.224130699, - "longitude": -8.732568248, - "lines": [ - "VTS" - ] - }, - { - "stopId": 14162, - "name": { - "original": "Avda. da Florida, 82" - }, - "latitude": 42.211371871, - "longitude": -8.746523782, - "lines": [ - "5A", - "11", - "29", - "VTS" - ] - }, - { - "stopId": 14163, - "name": { - "original": "Avda. da Florida (fronte 82)" - }, - "latitude": 42.211442202, - "longitude": -8.746227469, - "lines": [ - "5A", - "11", - "29" - ] - }, - { - "stopId": 14164, - "name": { - "original": "Rúa de Tomás A. Alonso, 136" - }, - "latitude": 42.225172437, - "longitude": -8.744777354, - "lines": [ - "C3i", - "15B", - "15C", - "N1" - ] - }, - { - "stopId": 14165, - "name": { - "original": "Rúa de Tomás A. Alonso, 193" - }, - "latitude": 42.224905029, - "longitude": -8.745285775, - "lines": [ - "C3d", - "13", - "15B", - "15C", - "U1", - "H" - ] - }, - { - "stopId": 14166, - "name": { - "original": "Avda. das Camelias, 114" - }, - "latitude": 42.225142981, - "longitude": -8.729707944, - "lines": [ - "4A", - "4C", - "5B", - "7", - "12A", - "12B", - "17", - "27", - "PSA 4" - ] - }, - { - "stopId": 14167, - "name": { - "original": "Beiramar - Pescadores" - }, - "latitude": 42.225279021, - "longitude": -8.751908648, - "lines": [ - "6", - "9B", - "28" - ] - }, - { - "stopId": 14168, - "name": { - "original": "Avda. das Camelias, 113" - }, - "latitude": 42.224928285, - "longitude": -8.729631509, - "lines": [ - "4A", - "4C", - "11", - "12B", - "17", - "27", - "N1" - ] - }, - { - "stopId": 14169, - "name": { - "original": "Avda. das Camelias, 136" - }, - "latitude": 42.22244224, - "longitude": -8.731271052, - "lines": [ - "C1", - "4A", - "4C", - "5B", - "7", - "12A", - "12B", - "16", - "17", - "27", - "LZH", - "PSA 4" - ] - }, - { - "stopId": 14170, - "name": { - "original": "Avda. de Samil (Praia da Punta)" - }, - "latitude": 42.218831744, - "longitude": -8.77571001, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] - }, - { - "stopId": 14171, - "name": { - "original": "Avda. de Samil (fronte Praia da Punta)" - }, - "latitude": 42.218844713, - "longitude": -8.775459221, - "lines": [ - "10", - "15B", - "15C" - ] - }, - { - "stopId": 14173, - "name": { - "original": "Rúa do Gaiteiro de Ricardo Portela (fronte Pavillón)" - }, - "latitude": 42.235900754, - "longitude": -8.731391435, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "15C", - "N4", - "H1" - ] - }, - { - "stopId": 14174, - "name": { - "original": "Rúa do Padre Seixas (Parque da Bouza)" - }, - "latitude": 42.211844516, - "longitude": -8.749287921, - "lines": [ - "11", - "16" - ] - }, - { - "stopId": 14175, - "name": { - "original": "Rúa do Padre Seixas, 32" - }, - "latitude": 42.211792864, - "longitude": -8.749617832, - "lines": [ - "16" - ] - }, - { - "stopId": 14177, - "name": { - "original": "Rúa de Fernando Conde (cruce Avda. da Gran Vía)" - }, - "latitude": 42.22985125, - "longitude": -8.71972059, - "lines": [ - "7", - "12A", - "12B", - "14", - "18A", - "27" - ] - }, - { - "stopId": 14178, - "name": { - "original": "Rúa do Marqués de Alcedo (Parque)" - }, - "latitude": 42.233009005, - "longitude": -8.724497604, - "lines": [ - "7", - "12A", - "12B", - "27" - ] - }, - { - "stopId": 14179, - "name": { - "original": "Rúa da Costa, 4" - }, - "latitude": 42.213260612, - "longitude": -8.722562576, - "lines": [ - "A", - "18B", - "18H" - ] - }, - { - "stopId": 14180, - "name": { - "original": "Avda. de E. Martínez Garrido, 108" - }, - "latitude": 42.224749197, - "longitude": -8.707320585, - "lines": [ - "4C", - "23", - "31", - "N4", - "PSA 4", - "VTS" - ] - }, - { - "stopId": 14181, - "name": { - "original": "Camiño da Corredoura (Igrexa)" - }, - "latitude": 42.210954716, - "longitude": -8.727776522, - "lines": [ - "A" - ] - }, - { - "stopId": 14182, - "name": { - "original": "Rúa da Costa, 39" - }, - "latitude": 42.211618245, - "longitude": -8.72147159, - "lines": [ - "A", - "18B", - "18H" - ] - }, - { - "stopId": 14183, - "name": { - "original": "Rúa do Xalón (Colexio)" - }, - "latitude": 42.220622235, - "longitude": -8.654888024, - "lines": [ - "11" - ] - }, - { - "stopId": 14184, - "name": { - "original": "Rúa do Xalón, 5" - }, - "latitude": 42.217384986, - "longitude": -8.657082399, - "lines": [ - "11" - ] - }, - { - "stopId": 14185, - "name": { - "original": "Rúa da Becerreira, 81" - }, - "latitude": 42.219667098, - "longitude": -8.659470523, - "lines": [ - "11" - ] - }, - { - "stopId": 14186, - "name": { - "original": "Rúa da Becerreira (fronte 64)" - }, - "latitude": 42.218044517, - "longitude": -8.662618478, - "lines": [ - "11" - ] - }, - { - "stopId": 14187, - "name": { - "original": "Rúa da Becerreira, 1" - }, - "latitude": 42.221588029, - "longitude": -8.662035851, - "lines": [ - "11" - ] - }, - { - "stopId": 14188, - "name": { - "original": "Rúa da Becerreira, 41" - }, - "latitude": 42.217595578, - "longitude": -8.661414166, - "lines": [ - "11" - ] - }, - { - "stopId": 14189, - "name": { - "original": "Rúa Molais, 84" - }, - "latitude": 42.226081487, - "longitude": -8.654133203, - "lines": [ - "11" - ] - }, - { - "stopId": 14190, - "name": { - "original": "Rúa de Severino Cobas, 196" - }, - "latitude": 42.225080876, - "longitude": -8.683314171, - "lines": [ - "25" - ] - }, - { - "stopId": 14191, - "name": { - "original": "Camiño da Bouciña, 76" - }, - "latitude": 42.223737557, - "longitude": -8.682141153, - "lines": [ - "25" - ] - }, - { - "stopId": 14192, - "name": { - "original": "Rúa das Figueiras, 282" - }, - "latitude": 42.231625599, - "longitude": -8.652046516, - "lines": [ - "25" - ] - }, - { - "stopId": 14193, - "name": { - "original": "Avda. de Santa Mariña, 443" - }, - "latitude": 42.230916628, - "longitude": -8.641628816, - "lines": [ - "25" - ] - }, - { - "stopId": 14194, - "name": { - "original": "Avda. de Santa Mariña, 425" - }, - "latitude": 42.228639377, - "longitude": -8.640978361, - "lines": [ - "25" - ] - }, - { - "stopId": 14195, - "name": { - "original": "Avda. de Santa Mariña, 249" - }, - "latitude": 42.226263256, - "longitude": -8.644091084, - "lines": [ - "25" - ] - }, - { - "stopId": 14196, - "name": { - "original": "Avda. de Santa Mariña, 229" - }, - "latitude": 42.225296, - "longitude": -8.649527921, - "lines": [ - "25" - ] - }, - { - "stopId": 14197, - "name": { - "original": "Rúa Molais (cruce Rúa das Carballas)" - }, - "latitude": 42.225912491, - "longitude": -8.653698801, - "lines": [ - "25" - ] - }, - { - "stopId": 14198, - "name": { - "original": "Rúa do Riomao, 21" - }, - "latitude": 42.227231301, - "longitude": -8.659997969, - "lines": [ - "15A", - "25" - ] - }, - { - "stopId": 14199, - "name": { - "original": "Camiño da Bouciña, 79" - }, - "latitude": 42.223755464, - "longitude": -8.682041911, - "lines": [ - "25" - ] - }, - { - "stopId": 14200, - "name": { - "original": "Rúa de Severino Cobas, 119" - }, - "latitude": 42.225112655, - "longitude": -8.683402684, - "lines": [ - "25" - ] - }, - { - "stopId": 14201, - "name": { - "original": "Avda. de Santa Mariña (cruce Avda. do Tranvía)" - }, - "latitude": 42.226291056, - "longitude": -8.641647591, - "lines": [ - "25" - ] - }, - { - "stopId": 14202, - "name": { - "original": "Rúa de Jenaro de la Fuente, 58" - }, - "latitude": 42.231273786, - "longitude": -8.700145645, - "lines": [ - "11", - "15A", - "15B", - "15C", - "H3" - ] - }, - { - "stopId": 14203, - "name": { - "original": "Avda. do Tranvía S/N (despois Camiño Lugar)" - }, - "latitude": 42.226524401, - "longitude": -8.661251786, - "lines": [ - "11", - "15A" - ] - }, - { - "stopId": 14204, - "name": { - "original": "Rúa de Manuel Álvarez, 151" - }, - "latitude": 42.22312688, - "longitude": -8.681864633, - "lines": [ - "25", - "31", - "H3" - ] - }, - { - "stopId": 14205, - "name": { - "original": "Estrada do Freixo (Cemiterio)" - }, - "latitude": 42.178408629, - "longitude": -8.733198549, - "lines": [ - "7" - ] - }, - { - "stopId": 14206, - "name": { - "original": "Avda. da Gran Vía (Instituto)" - }, - "latitude": 42.220514043, - "longitude": -8.731700217, - "lines": [ - "C3i", - "7", - "11", - "13", - "15A", - "16", - "23", - "29", - "H2" - ] - }, - { - "stopId": 14207, - "name": { - "original": "Camiño do Pinal, 19" - }, - "latitude": 42.161212162, - "longitude": -8.716377433, - "lines": [ - "7" - ] - }, - { - "stopId": 14208, - "name": { - "original": "Estrada de Valadares, 452" - }, - "latitude": 42.162237207, - "longitude": -8.71885531, - "lines": [ - "7" - ] - }, - { - "stopId": 14209, - "name": { - "original": "Estrada da Garrida, 263" - }, - "latitude": 42.173333822, - "longitude": -8.705439803, - "lines": [ - "7" - ] - }, - { - "stopId": 14210, - "name": { - "original": "Estrada da Garrida (frente 243)" - }, - "latitude": 42.173077394, - "longitude": -8.705659744, - "lines": [ - "7" - ] - }, - { - "stopId": 14211, - "name": { - "original": "Estrada do Monte Alba, 32" - }, - "latitude": 42.165479162, - "longitude": -8.721775005, - "lines": [ - "7" - ] - }, - { - "stopId": 14212, - "name": { - "original": "Estrada do Monte Alba, 54" - }, - "latitude": 42.164694101, - "longitude": -8.724472962, - "lines": [ - "7" - ] - }, - { - "stopId": 14213, - "name": { - "original": "Estrada do Freixo (Campo Fútbol)" - }, - "latitude": 42.169153241, - "longitude": -8.729001464, - "lines": [ - "7" - ] - }, - { - "stopId": 14214, - "name": { - "original": "Estrada do Freixo, 191" - }, - "latitude": 42.175760907, - "longitude": -8.734516924, - "lines": [ - "7" - ] - }, - { - "stopId": 14215, - "name": { - "original": "Estrada do Freixo, 90" - }, - "latitude": 42.175592169, - "longitude": -8.734477788, - "lines": [ - "7" - ] - }, - { - "stopId": 14216, - "name": { - "original": "Estrada do Freixo (fronte Campo Fútbol)" - }, - "latitude": 42.169143301, - "longitude": -8.729076566, - "lines": [ - "7" - ] - }, - { - "stopId": 14217, - "name": { - "original": "Estrada do Monte Alba (frente 54)" - }, - "latitude": 42.164570839, - "longitude": -8.724561475, - "lines": [ - "7" - ] - }, - { - "stopId": 14218, - "name": { - "original": "Estrada do Monte Alba, 21" - }, - "latitude": 42.165288305, - "longitude": -8.721367309, - "lines": [ - "7" - ] - }, - { - "stopId": 14219, - "name": { - "original": "Camiño do Pinal, 59" - }, - "latitude": 42.159500512, - "longitude": -8.718247279, - "lines": [ - "7" - ] - }, - { - "stopId": 14220, - "name": { - "original": "Camiño da Bouciña, 14" - }, - "latitude": 42.225657321, - "longitude": -8.681467666, - "lines": [ - "25" - ] - }, - { - "stopId": 14221, - "name": { - "original": "Camiño da Bouciña, 3" - }, - "latitude": 42.225809218, - "longitude": -8.681652991, - "lines": [ - "25" - ] - }, - { - "stopId": 14222, - "name": { - "original": "Camiño do Pinal, 5" - }, - "latitude": 42.162959525, - "longitude": -8.716541365, - "lines": [ - "7" - ] - }, - { - "stopId": 14223, - "name": { - "original": "Avda. Beiramar Porto Pesqueiro Berbés" - }, - "latitude": 42.236685153, - "longitude": -8.731609303, - "lines": [ - "C3i", - "A", - "5A", - "5B", - "10", - "11", - "15C", - "N1", - "N4", - "H1", - "VTS" - ] - }, - { - "stopId": 14224, - "name": { - "original": "Rúa do Conde de Torrecedeira, 16" - }, - "latitude": 42.234285927, - "longitude": -8.731266507, - "lines": [ - "C3i", - "A", - "5A", - "5B", - "10", - "11", - "15C", - "N1", - "N4", - "H1", - "VTS" - ] - }, - { - "stopId": 14225, - "name": { - "original": "Rúa do Conde de Torrecedeira, 50" - }, - "latitude": 42.231716574, - "longitude": -8.732308737, - "lines": [ - "C3i", - "A", - "5A", - "5B", - "10", - "11", - "15C", - "N1", - "N4", - "H1", - "VTS" - ] - }, - { - "stopId": 14226, - "name": { - "original": "Rúa do Conde de Torrecedeira, 70" - }, - "latitude": 42.229574859, - "longitude": -8.733073973, - "lines": [ - "C3i", - "A", - "5A", - "5B", - "10", - "11", - "15C", - "N1", - "N4", - "H1", - "VTS" - ] - }, - { - "stopId": 14227, - "name": { - "original": "Rúa do Conde de Torrecedeira, 86" - }, - "latitude": 42.22696657, - "longitude": -8.734559706, - "lines": [ - "C3i", - "A", - "5A", - "5B", - "10", - "11", - "15C", - "N1", - "N4", - "H1", - "VTS" - ] - }, - { - "stopId": 14228, - "name": { - "original": "Avda. de Peinador, 100" - }, - "latitude": 42.221696342, - "longitude": -8.632840997, - "lines": [ - "A" - ] - }, - { - "stopId": 14231, - "name": { - "original": "Rúa da Rabadeira, 39" - }, - "latitude": 42.235542066, - "longitude": -8.652196565, - "lines": [ - "9B" - ] - }, - { - "stopId": 14232, - "name": { - "original": "Rúa da Rabadeira (fronte 33)" - }, - "latitude": 42.235317662, - "longitude": -8.652094641, - "lines": [ - "9B", - "27" - ] - }, - { - "stopId": 14233, - "name": { - "original": "Rúa San Cristobo, 90" - }, - "latitude": 42.241037275, - "longitude": -8.668947597, - "lines": [ - "9B", - "28" - ] - }, - { - "stopId": 14236, - "name": { - "original": "Rúa de Manuel Cominges (fronte 112)" - }, - "latitude": 42.196308523, - "longitude": -8.723526935, - "lines": [ - "12B" - ] - }, - { - "stopId": 14237, - "name": { - "original": "Rúa de Manuel Cominges, 134" - }, - "latitude": 42.196119748, - "longitude": -8.723457198, - "lines": [ - "12B" - ] - }, - { - "stopId": 14238, - "name": { - "original": "Rúa da Saa do Monte, 5" - }, - "latitude": 42.20458802, - "longitude": -8.714617309, - "lines": [ - "18B" - ] - }, - { - "stopId": 14240, - "name": { - "original": "Rúa das Chabarras, 21" - }, - "latitude": 42.197985091, - "longitude": -8.714523201, - "lines": [ - "18B" - ] - }, - { - "stopId": 14241, - "name": { - "original": "Rúa das Chabarras, 60" - }, - "latitude": 42.197842023, - "longitude": -8.71471632, - "lines": [ - "18B" - ] - }, - { - "stopId": 14242, - "name": { - "original": "Rúa das Chabarras (cruce Camiño dos Pasais)" - }, - "latitude": 42.196378259, - "longitude": -8.716979043, - "lines": [ - "18B" - ] - }, - { - "stopId": 14243, - "name": { - "original": "Rúa das Chabarras, 24" - }, - "latitude": 42.196539214, - "longitude": -8.716874437, - "lines": [ - "18B" - ] - }, - { - "stopId": 14244, - "name": { - "original": "Rúa de Macal, 60" - }, - "latitude": 42.198216234, - "longitude": -8.721498041, - "lines": [ - "18B", - "18H", - "27" - ] - }, - { - "stopId": 14245, - "name": { - "original": "Avda. de García Barbón, 43" - }, - "latitude": 42.23691728, - "longitude": -8.716743143, - "lines": [ - "C3i", - "A", - "5B", - "10", - "16", - "17", - "24", - "N1", - "VTS" - ] - }, - { - "stopId": 14247, - "name": { - "original": "Camiño dos Muíños, 69" - }, - "latitude": 42.200511179, - "longitude": -8.769110573, - "lines": [ - "12A" - ] - }, - { - "stopId": 14248, - "name": { - "original": "Camiño dos Muíños, 74" - }, - "latitude": 42.200580723, - "longitude": -8.76911862, - "lines": [ - "12A" - ] - }, - { - "stopId": 14249, - "name": { - "original": "Avda. de Cesáreo Vázquez, 5" - }, - "latitude": 42.177662554, - "longitude": -8.800157923, - "lines": [ - "12A" - ] - }, - { - "stopId": 14250, - "name": { - "original": "Avda. do Aeroporto, 463" - }, - "latitude": 42.234914814, - "longitude": -8.658983411, - "lines": [ - "A", - "9B" - ] - }, - { - "stopId": 14251, - "name": { - "original": "Avda. do Aeroporto (fronte 463)" - }, - "latitude": 42.234817602, - "longitude": -8.65882027, - "lines": [ - "A", - "9B", - "27" - ] - }, - { - "stopId": 14252, - "name": { - "original": "Estrada Clara Campoamor (Instituto)" - }, - "latitude": 42.165934208, - "longitude": -8.707243001, - "lines": [ - "A", - "U1" - ] - }, - { - "stopId": 14253, - "name": { - "original": "Estrada Clara Campoamor (cruce Rúa do Padrón do Couto)" - }, - "latitude": 42.164455564, - "longitude": -8.707223843, - "lines": [ - "A", - "U1" - ] - }, - { - "stopId": 14255, - "name": { - "original": "Rúa do Pintor Colmeiro (Parque do Pintor Colmeiro)" - }, - "latitude": 42.225111918, - "longitude": -8.726733526, - "lines": [ - "16" - ] - }, - { - "stopId": 14256, - "name": { - "original": "Rúa de Zamora, 89" - }, - "latitude": 42.222198901, - "longitude": -8.728317834, - "lines": [ - "16" - ] - }, - { - "stopId": 14257, - "name": { - "original": "Rúa de Zamora, 71" - }, - "latitude": 42.223448271, - "longitude": -8.725547112, - "lines": [ - "16" - ] - }, - { - "stopId": 14258, - "name": { - "original": "Rúa de Zamora, 51" - }, - "latitude": 42.224870416, - "longitude": -8.723632015, - "lines": [ - "16" - ] - }, - { - "stopId": 14259, - "name": { - "original": "Rúa de Zamora, 31" - }, - "latitude": 42.227088982, - "longitude": -8.721545256, - "lines": [ - "16" - ] - }, - { - "stopId": 14260, - "name": { - "original": "Avda. da Gran Vía (fronte Avda. de Madrid)" - }, - "latitude": 42.228741057, - "longitude": -8.71961914, - "lines": [ - "A", - "7", - "14", - "15A", - "16", - "18A", - "18B", - "18H", - "H2" - ] - }, - { - "stopId": 14261, - "name": { - "original": "Rúa de Zamora, 1" - }, - "latitude": 42.228644118, - "longitude": -8.720692314, - "lines": [ - "16" - ] - }, - { - "stopId": 14264, - "name": { - "original": "Rúa de Urzáiz - Príncipe" + "original": "Avda. do Aeroporto, 54" }, - "latitude": 42.235873545, - "longitude": -8.720083317, + "latitude": 42.234679919, + "longitude": -8.699623994, "lines": [ - "C1", "A", "4A", - "4C", - "5A", - "7", "9B", - "12B", - "14", - "15B", - "15C", - "16", - "17", - "18A", - "18B", - "18H", "24", - "28", - "N1", - "N4" - ], - "amenities": [ - "shelter", - "display" - ] - }, - { - "stopId": 14267, - "name": { - "original": "Avda. da Atlántida, 64" - }, - "latitude": 42.221892792, - "longitude": -8.758191526, - "lines": [ - "10", - "15B", - "15C", - "N1" - ] - }, - { - "stopId": 14268, - "name": { - "original": "Avda. da Atlántida, 49" - }, - "latitude": 42.221731945, - "longitude": -8.758417175, - "lines": [ - "10", - "15B", - "15C" - ] - }, - { - "stopId": 14270, - "name": { - "original": "Estrada da Balsa, 67" - }, - "latitude": 42.196619218, - "longitude": -8.743240048, - "lines": [ - "17" - ] - }, - { - "stopId": 14271, - "name": { - "original": "Estrada da Balsa, 103" - }, - "latitude": 42.196050474, - "longitude": -8.745105715, - "lines": [ - "17" - ] - }, - { - "stopId": 14273, - "name": { - "original": "Rúa do Xalón, 41" - }, - "latitude": 42.219274062, - "longitude": -8.656419893, - "lines": [ - "11" - ] - }, - { - "stopId": 14277, - "name": { - "original": "Avda. da Mariña Española, 8" - }, - "latitude": 42.251776399, - "longitude": -8.69414009, - "lines": [ - "17" - ] - }, - { - "stopId": 14278, - "name": { - "original": "Avda. da Mariña Española, 44" - }, - "latitude": 42.25430173, - "longitude": -8.692915616, - "lines": [ - "17" - ] - }, - { - "stopId": 14279, - "name": { - "original": "Riós (Rotonda)" - }, - "latitude": 42.257069093, - "longitude": -8.690786611, - "lines": [ - "17" - ] - }, - { - "stopId": 14280, - "name": { - "original": "Avda. da Mariña Española (ETEA)" - }, - "latitude": 42.254604716, - "longitude": -8.692539681, - "lines": [ - "17" - ] - }, - { - "stopId": 14281, - "name": { - "original": "Avda. da Mariña Española (Praia de Ríos)" - }, - "latitude": 42.251596707, - "longitude": -8.69420171, - "lines": [ - "17" - ] - }, - { - "stopId": 14287, - "name": { - "original": "Rúa Santa Tegra, 67" - }, - "latitude": 42.25020334, - "longitude": -8.701924083, - "lines": [ - "17" - ] - }, - { - "stopId": 14288, - "name": { - "original": "Avda. de Guixar (fronte 28)" - }, - "latitude": 42.249218849, - "longitude": -8.704807605, - "lines": [ - "17" - ] - }, - { - "stopId": 14289, - "name": { - "original": "Rúa de Xulián Estévez (fronte 58)" - }, - "latitude": 42.246484972, - "longitude": -8.705864005, - "lines": [ - "17" - ] - }, - { - "stopId": 14290, - "name": { - "original": "Rúa de Xulián Estévez (fronte 18)" - }, - "latitude": 42.244107542, - "longitude": -8.706343638, - "lines": [ - "17" - ] - }, - { - "stopId": 14291, - "name": { - "original": "Avda. da Ponte (Vigo Memorial)" - }, - "latitude": 42.209935219, - "longitude": -8.671464542, - "lines": [ - "12B", - "15B", - "15C", - "U2" - ] - }, - { - "stopId": 14294, - "name": { - "original": "Avda. de Ricardo Mella, 406" - }, - "latitude": 42.190684424876565, - "longitude": -8.799308812770041, - "lines": [ - "12A" - ] - }, - { - "stopId": 14295, - "name": { - "original": "Rúa de Pi i Margall, 121" - }, - "latitude": 42.230436358, - "longitude": -8.731437473, - "lines": [ - "5B", - "12A" - ] - }, - { - "stopId": 14296, - "name": { - "original": "Praza dos Leóns (Vigozoo)" - }, - "latitude": 42.248375604, - "longitude": -8.675578666, - "lines": [ - "28" - ] - }, - { - "stopId": 14298, - "name": { - "original": "Avda. de Samil (fronte 15)" - }, - "latitude": 42.215865535, - "longitude": -8.774911658, - "lines": [ - "15C" - ] - }, - { - "stopId": 14299, - "name": { - "original": "Avda. de Samil (frente Verbum)" - }, - "latitude": 42.213777217, - "longitude": -8.774600284, - "lines": [ - "C3i", - "15A", - "15B", - "15C", - "N1" - ] - }, - { - "stopId": 14300, - "name": { - "original": "Avda. da Florida, 30" - }, - "latitude": 42.217907548, - "longitude": -8.73707436, - "lines": [ - "5A", - "11", - "29", - "VTS" - ] - }, - { - "stopId": 14301, - "name": { - "original": "Avda. da Florida, 47" - }, - "latitude": 42.218257459, - "longitude": -8.736328798, - "lines": [ - "5A", - "11", - "29" - ] - }, - { - "stopId": 14302, - "name": { - "original": "Estrada Vella de Madrid, 7" - }, - "latitude": 42.214542094, - "longitude": -8.696431619, - "lines": [ - "12A", - "12B", - "13", - "H3" - ] - }, - { - "stopId": 14304, - "name": { - "original": "Estrada Vella de Madrid, 145" - }, - "latitude": 42.221313975, - "longitude": -8.681944471, - "lines": [ - "12A", - "12B", - "13", - "31" - ] - }, - { - "stopId": 14307, - "name": { - "original": "Rúa do Pintor Colmeiro, 11" - }, - "latitude": 42.224464416, - "longitude": -8.727967343, - "lines": [ - "16" - ] - }, - { - "stopId": 14308, - "name": { - "original": "Camiño do Pinal, 6" - }, - "latitude": 42.16328558, - "longitude": -8.716707662, - "lines": [ - "7" - ] - }, - { - "stopId": 14309, - "name": { - "original": "Camiño do Pinal, 28" - }, - "latitude": 42.161067029, - "longitude": -8.716468628, - "lines": [ - "7" - ] - }, - { - "stopId": 14310, - "name": { - "original": "Camiño do Pinal (fronte 57)" - }, - "latitude": 42.159564137, - "longitude": -8.718295559, - "lines": [ - "7" - ] - }, - { - "stopId": 14311, - "name": { - "original": "Estrada de Valadares, 505" - }, - "latitude": 42.162720337, - "longitude": -8.718900908, - "lines": [ - "7" - ] - }, - { - "stopId": 14314, - "name": { - "original": "Rúa das Mantelas (cruce Avda. da Gran Vía)" - }, - "latitude": 42.227212568, - "longitude": -8.720183032, - "lines": [ - "18A" - ] - }, - { - "stopId": 14315, - "name": { - "original": "Rúa das Mantelas, 92" - }, - "latitude": 42.22393338, - "longitude": -8.716924148, - "lines": [ - "18A" - ] - }, - { - "stopId": 14317, - "name": { - "original": "Rúa da Salgueira Entrada (Igrexa)" - }, - "latitude": 42.222723933, - "longitude": -8.719150283, - "lines": [ - "18A" - ] - }, - { - "stopId": 14318, - "name": { - "original": "Rúa da Salguera Entrada (fronte 5)" - }, - "latitude": 42.222591256, - "longitude": -8.717753486, - "lines": [ - "18A" - ] - }, - { - "stopId": 14319, - "name": { - "original": "Rúa das Coutadas (Fonte)" - }, - "latitude": 42.221002214, - "longitude": -8.72027208, - "lines": [ - "18A" - ] - }, - { - "stopId": 14320, - "name": { - "original": "Rúa do Miradoiro (Rotonda Centro Comercial)" - }, - "latitude": 42.220799025, - "longitude": -8.723345356, - "lines": [ - "18A" - ] - }, - { - "stopId": 14321, - "name": { - "original": "Camiño do Freixeiro, 74" - }, - "latitude": 42.218131641, - "longitude": -8.723120057, - "lines": [ - "18A" - ] - }, - { - "stopId": 14322, - "name": { - "original": "Rúa da Fonte Santa, 4" - }, - "latitude": 42.217813814, - "longitude": -8.721352482, - "lines": [ - "18A" - ] - }, - { - "stopId": 14323, - "name": { - "original": "Rúa Finca dos Aires (cruce Rúa da Fonte Santa)" - }, - "latitude": 42.217059742, - "longitude": -8.720340235, - "lines": [ - "18A" - ] - }, - { - "stopId": 14324, - "name": { - "original": "Rúa Finca dos Aires (Urbanización)" - }, - "latitude": 42.217256401, - "longitude": -8.720101519, - "lines": [ - "18A" - ] - }, - { - "stopId": 14325, - "name": { - "original": "Rúa da Fonte Santa (fronte 4)" - }, - "latitude": 42.217848286, - "longitude": -8.7214811, - "lines": [ - "18A" - ] - }, - { - "stopId": 14326, - "name": { - "original": "Baixada á Ponte Nova, 61" - }, - "latitude": 42.218038279, - "longitude": -8.722489738, - "lines": [ - "18A" - ] - }, - { - "stopId": 14328, - "name": { - "original": "Citroën - PSA" - }, - "latitude": 42.208988415, - "longitude": -8.746151897, - "lines": [ - "LZH", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 14329, - "name": { - "original": "Citroën (Puerta Principal)" - }, - "latitude": 42.210124372, - "longitude": -8.741139991, - "lines": [ - "LZH", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 14330, - "name": { - "original": "Subida ás Chans (fronte cruce Rúa Senra)" - }, - "latitude": 42.198072667, - "longitude": -8.682624653, - "lines": [ - "14" - ] - }, - { - "stopId": 14331, - "name": { - "original": "Rúa de Álvaro Cunqueiro, 30" - }, - "latitude": 42.223769828, - "longitude": -8.728938728, - "lines": [ - "4A", - "4C", - "5A", - "5B", - "11", - "12A", - "12B", - "17", "27", - "N1", - "LZH" - ] - }, - { - "stopId": 14333, - "name": { - "original": "Rúa de Cánovas del Castillo, 18" - }, - "latitude": 42.240189011, - "longitude": -8.726765331, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "10", - "15B", - "15C", - "28", - "N4", - "H1" - ] - }, - { - "stopId": 14335, - "name": { - "original": "Camiño do Arieiro (Residencia de Maiores)" - }, - "latitude": 42.212692269, - "longitude": -8.675661599, - "lines": [ - "31" - ] - }, - { - "stopId": 14336, - "name": { - "original": "Rúa das Teixugueiras, 8" - }, - "latitude": 42.21447626, - "longitude": -8.75600551, - "lines": [ - "13", - "15A" - ] - }, - { - "stopId": 14337, - "name": { - "original": "Rúa do Limpiño (Rotonda Rúa Teixugueiras)" - }, - "latitude": 42.213080218, - "longitude": -8.754660224, - "lines": [ - "5A", - "5B", - "13", - "15A", - "15B", - "N4", - "U1", - "H", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 14345, - "name": { - "original": "Rúa do Areiro, 49" - }, - "latitude": 42.237269816, - "longitude": -8.685138009, - "lines": [ - "28" - ] - }, - { - "stopId": 14346, - "name": { - "original": "Rúa do Areiro, 52" - }, - "latitude": 42.237287688, - "longitude": -8.685019992, - "lines": [ - "28" - ] - }, - { - "stopId": 14347, - "name": { - "original": "Rúa do Areiro (cruce Salcides)" - }, - "latitude": 42.23913765, - "longitude": -8.683873934, - "lines": [ - "28" - ] - }, - { - "stopId": 14348, - "name": { - "original": "Rúa do Areiro, 76" - }, - "latitude": 42.238950988, - "longitude": -8.683793467, - "lines": [ "28" ] }, { - "stopId": 14349, + "stopId": "vitrasa:920", "name": { - "original": "Rúa do Areiro (Campo de Fútbol)" - }, - "latitude": 42.244717312, - "longitude": -8.678473607, - "lines": [ - "28" - ] - }, - { - "stopId": 14350, - "name": { - "original": "Rúa do Areiro (fronte Campo de Fútbol)" - }, - "latitude": 42.244849353, - "longitude": -8.678366319, - "lines": [ - "28" - ] - }, - { - "stopId": 14353, - "name": { - "original": "Praza dos Leóns (fronte Vigozoo)" - }, - "latitude": 42.248151648, - "longitude": -8.675976097, - "lines": [ - "28" - ] - }, - { - "stopId": 14354, - "name": { - "original": "Avda. de Ramón Nieto (fronte Igrexa)" - }, - "latitude": 42.225911433, - "longitude": -8.675526243, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3" - ] - }, - { - "stopId": 14355, - "name": { - "original": "Avda. de Ramón Nieto, 409" - }, - "latitude": 42.226638363, - "longitude": -8.676135104, - "lines": [ - "11", - "15A", - "15B", - "15C", - "31", - "H3", - "VTS" - ] - }, - { - "stopId": 14356, - "name": { - "original": "Avda. de Ricardo Mella, 314" - }, - "latitude": 42.192009114, - "longitude": -8.783993123, - "lines": [ - "12A" - ] - }, - { - "stopId": 14357, - "name": { - "original": "Avda. de Ricardo Mella (cruce Camiño do Río)" - }, - "latitude": 42.191796473, - "longitude": -8.784014088, - "lines": [ - "12A" - ] - }, - { - "stopId": 14358, - "name": { - "original": "Rúa das Teixugueiras, 28" - }, - "latitude": 42.209054557, - "longitude": -8.75715865, - "lines": [ - "5A", - "5B", - "13", - "N4" - ] - }, - { - "stopId": 14359, - "name": { - "original": "Rúa das Teixugueiras, 16-Portal 2" - }, - "latitude": 42.212235738, - "longitude": -8.755011746, - "lines": [ - "5A", - "5B", - "13", - "N4" - ] - }, - { - "stopId": 14360, - "name": { - "original": "Rúa das Teixugueiras, 19-Portal 5" - }, - "latitude": 42.208965857, - "longitude": -8.757020567, - "lines": [ - "5A", - "5B", - "13", - "N4", - "U1", - "H", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 14361, - "name": { - "original": "Rúa das Teixugueiras, 17" - }, - "latitude": 42.209770472, - "longitude": -8.755295907, - "lines": [ - "5A", - "5B", - "13", - "15A", - "N4", - "U1", - "H", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 14362, - "name": { - "original": "Avda. de Samil, 101" - }, - "latitude": 42.202937872, - "longitude": -8.776830486, - "lines": [ - "C3d", - "4C", - "10" - ] - }, - { - "stopId": 14364, - "name": { - "original": "Estrada das Plantas (fronte Cidade Deportiva)" - }, - "latitude": 42.175757186, - "longitude": -8.671074371, - "lines": [ - "15C" - ] - }, - { - "stopId": 14365, - "name": { - "original": "Estrada das Plantas (Viveiros)" - }, - "latitude": 42.181650197, - "longitude": -8.667515723, - "lines": [ - "15C" - ] - }, - { - "stopId": 14372, - "name": { - "original": "Barrio da Salgueira, 22" - }, - "latitude": 42.221887526, - "longitude": -8.720011371, - "lines": [ - "18A" - ] - }, - { - "stopId": 14376, - "name": { - "original": "Rúa da Pateira, 20" - }, - "latitude": 42.226612651, - "longitude": -8.699658408, - "lines": [ - "25" - ] - }, - { - "stopId": 14377, - "name": { - "original": "Rúa da Pateira, 5" - }, - "latitude": 42.226582661, - "longitude": -8.700385762, - "lines": [ - "25" - ] - }, - { - "stopId": 14378, - "name": { - "original": "Rúa Molais, 83" + "original": "Avda. do Aeroporto (cruce Camiño das Cereixeiras)" }, - "latitude": 42.22396201, - "longitude": -8.653340726, + "latitude": 42.233499069, + "longitude": -8.643325214, "lines": [ - "25" + "A" ] }, { - "stopId": 14381, + "stopId": "vitrasa:930", "name": { - "original": "Rúa do Abade Juan de Bastos, 6" + "original": "Avda. do Aeroporto, 570" }, - "latitude": 42.195647685, - "longitude": -8.728974153, + "latitude": 42.231979036, + "longitude": -8.65372496, "lines": [ - "17" + "A" ] }, { - "stopId": 14383, + "stopId": "vitrasa:940", "name": { - "original": "Estrada Clara Campoamor (cruce Estrada do Portal)" + "original": "Avda. do Aeroporto, 605" }, - "latitude": 42.174718265, - "longitude": -8.713684656, + "latitude": 42.230493878, + "longitude": -8.638023273, "lines": [ - "A", - "U1" + "A" ] }, { - "stopId": 14384, + "stopId": "vitrasa:950", "name": { - "original": "Estrada Clara Campoamor (Parque Tecnolóxico)" + "original": "Avda. do Aeroporto, 614" }, - "latitude": 42.175073486, - "longitude": -8.713494654, + "latitude": 42.233626818, + "longitude": -8.647811163, "lines": [ "A", - "U1" - ] - }, - { - "stopId": 14385, - "name": { - "original": "Rúa da Vista do Mar, 45" - }, - "latitude": 42.240712912, - "longitude": -8.6919418, - "lines": [ - "4A", - "24" - ] - }, - { - "stopId": 14386, - "name": { - "original": "Rúa da Vista do Mar (Embalse)" - }, - "latitude": 42.238020208, - "longitude": -8.691543884, - "lines": [ - "4A", - "24" - ] - }, - { - "stopId": 14387, - "name": { - "original": "Rúa da Vista do Mar, 1" - }, - "latitude": 42.237167043, - "longitude": -8.693243792, - "lines": [ - "4A", - "24" - ] - }, - { - "stopId": 14388, - "name": { - "original": "Rúa das Teixugueiras, 11" - }, - "latitude": 42.211610124, - "longitude": -8.754550253, - "lines": [ - "5A", - "5B", - "13", - "15A", - "N4", - "U1", - "H", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 14389, - "name": { - "original": "Rúa das Teixugueiras, 22" - }, - "latitude": 42.210212603, - "longitude": -8.755079989, - "lines": [ - "5A", - "5B", - "13", - "N4" - ] - }, - { - "stopId": 14390, - "name": { - "original": "Rúa do Salgueiro (cruce Camiño Sanatorio)" - }, - "latitude": 42.241570883, - "longitude": -8.655380719, - "lines": [ - "9B", - "28" - ] - }, - { - "stopId": 14391, - "name": { - "original": "Rúa do Salgueiro (fronte 38)" - }, - "latitude": 42.241652296, - "longitude": -8.655302935, - "lines": [ - "9B", - "27", - "28" - ] - }, - { - "stopId": 14392, - "name": { - "original": "Rúa da Pedra Seixa (Colexio)" - }, - "latitude": 42.209458591, - "longitude": -8.760561083, - "lines": [ - "5A" - ] - }, - { - "stopId": 14393, - "name": { - "original": "Rúa da Pedra Seixa (fronte Colexio)" - }, - "latitude": 42.209568936, - "longitude": -8.760777001, - "lines": [ - "5A" - ] - }, - { - "stopId": 14395, - "name": { - "original": "Estrada de Madrid, 217" - }, - "latitude": 42.215601037, - "longitude": -8.675477665, - "lines": [ - "12B", - "15B", - "15C" - ] - }, - { - "stopId": 14396, - "name": { - "original": "Avda. de García Barbón, 106" - }, - "latitude": 42.239965365, - "longitude": -8.708024282, - "lines": [ - "C3d", - "5B", - "10", - "17", - "31", - "H2", - "H3", - "PSA 1" - ] - }, - { - "stopId": 14397, - "name": { - "original": "Avda. de García Barbón (fronte 104)" - }, - "latitude": 42.23973713, - "longitude": -8.708397682, - "lines": [ - "C3i", - "5B", - "10", - "17", - "N1", - "H3", - "VTS" - ] - }, - { - "stopId": 14398, - "name": { - "original": "Avda. da Gran Vía, 116" - }, - "latitude": 42.22406594, - "longitude": -8.723691036, - "lines": [ - "C3d", - "13", - "15A", - "23", - "29", - "H2", - "PSA 1" - ] - }, - { - "stopId": 14401, - "name": { - "original": "Rúa de San Paio (cruce Camiño Barroca)" - }, - "latitude": 42.21072167, - "longitude": -8.76212542, - "lines": [ - "4A", - "12A" - ] - }, - { - "stopId": 14402, - "name": { - "original": "Rúa de San Paio, 111" - }, - "latitude": 42.210791203, - "longitude": -8.761940347, - "lines": [ - "4A", - "12A" - ] - }, - { - "stopId": 14403, - "name": { - "original": "Rúa de Pedro Alvarado (cruce Camiño das Maceiras)" - }, - "latitude": 42.25049654, - "longitude": -8.698390035, - "lines": [ - "17" - ] - }, - { - "stopId": 14404, - "name": { - "original": "Rúa do Doutor Corbal, 58" - }, - "latitude": 42.251785642, - "longitude": -8.696871994, - "lines": [ - "17" - ] - }, - { - "stopId": 14406, - "name": { - "original": "Rúa de Enrique Lorenzo, 32" - }, - "latitude": 42.249462772, - "longitude": -8.699772952, - "lines": [ - "17" - ] - }, - { - "stopId": 14408, - "name": { - "original": "Rúa de Pedro Alvarado, 5" - }, - "latitude": 42.248885006, - "longitude": -8.698128758, - "lines": [ - "17" - ] - }, - { - "stopId": 14409, - "name": { - "original": "Estrada das Plantas (fronte cruce Avda. do Rebullón)" - }, - "latitude": 42.204188441, - "longitude": -8.670257126, - "lines": [ - "15B", - "15C" - ] - }, - { - "stopId": 14410, - "name": { - "original": "Estrada das Plantas (cruce Avda. do Rebullón)" - }, - "latitude": 42.204639457, - "longitude": -8.670329545, - "lines": [ - "15C" - ] - }, - { - "stopId": 14411, - "name": { - "original": "Rúa de Xeme, 1" - }, - "latitude": 42.205174543, - "longitude": -8.698209134, - "lines": [ - "14" - ] - }, - { - "stopId": 14412, - "name": { - "original": "Rúa de Xeme, 6" - }, - "latitude": 42.20497586, - "longitude": -8.697957006, - "lines": [ - "14" - ] - }, - { - "stopId": 14413, - "name": { - "original": "Estrada da Garrida (cruce Camiño Fabas)" - }, - "latitude": 42.173955568, - "longitude": -8.703050076, - "lines": [ - "7" - ] - }, - { - "stopId": 14414, - "name": { - "original": "Avda. de Santa Mariña, 40" - }, - "latitude": 42.221587211, - "longitude": -8.665078444, - "lines": [ - "11" - ] - }, - { - "stopId": 14415, - "name": { - "original": "Avda. de Santa Mariña (antes 49)" - }, - "latitude": 42.221557416, - "longitude": -8.665381534, - "lines": [ - "11" - ] - }, - { - "stopId": 14416, - "name": { - "original": "Rúa de Severino Cobas, 118" - }, - "latitude": 42.225468623, - "longitude": -8.691491081, - "lines": [ "25" ] }, { - "stopId": 14419, + "stopId": "vitrasa:960", "name": { - "original": "Estrada de Bembrive (cruce Camiño dos Rapadouros)" - }, - "latitude": 42.201138734, - "longitude": -8.688585073, - "lines": [ - "6" - ] - }, - { - "stopId": 14420, - "name": { - "original": "Estrada de Bembrive, 318" - }, - "latitude": 42.201419233, - "longitude": -8.688526069, - "lines": [ - "6" - ] - }, - { - "stopId": 14421, - "name": { - "original": "Estrada das Prantas (fronte Campo de Béisbol)" - }, - "latitude": 42.186683264, - "longitude": -8.669320703, - "lines": [ - "15C" - ] - }, - { - "stopId": 14422, - "name": { - "original": "Estrada das Plantas (Campo de Béisbol)" - }, - "latitude": 42.18695315, - "longitude": -8.669514066, - "lines": [ - "15C" - ] - }, - { - "stopId": 14425, - "name": { - "original": "Avda. do Alcalde Gregorio Espino, 2" - }, - "latitude": 42.232253792, - "longitude": -8.707208575, - "lines": [ - "31" - ] - }, - { - "stopId": 14475, - "name": { - "original": "Rúa de Barcelona, 78" - }, - "latitude": 42.222992354, - "longitude": -8.728300382, - "lines": [ - "C1" - ] - }, - { - "stopId": 14890, - "name": { - "original": "Rúa das Teixugueiras, 25" + "original": "Avda. do Aeroporto, 686" }, - "latitude": 42.207545331, - "longitude": -8.758718406, + "latitude": 42.230918888, + "longitude": -8.638532893, "lines": [ - "5B", - "13", - "N4", - "U1", - "H", - "PSA 1", - "PSA 4" + "A" ] }, { - "stopId": 14892, + "stopId": "vitrasa:970", "name": { - "original": "Rúa do Conde de Torrecedeira, 123" + "original": "Avda. do Aeroporto, 91" }, - "latitude": 42.224929414, - "longitude": -8.735414067, + "latitude": 42.232787318, + "longitude": -8.693473285, "lines": [ - "C1", - "C3d", "A", "9B", - "15C", - "N4", - "H1" - ] - }, - { - "stopId": 14893, - "name": { - "original": "Rúa de Manuel Costas Bastos, 26" - }, - "latitude": 42.243157956, - "longitude": -8.666962176, - "lines": [ - "9B", - "27", - "28" - ] - }, - { - "stopId": 14894, - "name": { - "original": "Avda. do Alcalde Portanet, 8" - }, - "latitude": 42.211736934, - "longitude": -8.733337505, - "lines": [ - "7", - "12B", - "17", - "H1", - "VTS" - ] - }, - { - "stopId": 14895, - "name": { - "original": "Rúa do Areiro (cruce Camiño das Laxes)" - }, - "latitude": 42.241392275, - "longitude": -8.681203235, - "lines": [ - "28" - ] - }, - { - "stopId": 14896, - "name": { - "original": "Rúa do Areiro, 93" - }, - "latitude": 42.241385532, - "longitude": -8.681400937, - "lines": [ - "28" - ] - }, - { - "stopId": 14897, - "name": { - "original": "Camiño do Arieiro (fronte 13)" - }, - "latitude": 42.213239161, - "longitude": -8.67854147, - "lines": [ - "31" - ] - }, - { - "stopId": 14898, - "name": { - "original": "Camiño do Arieiro, 13" - }, - "latitude": 42.213239161, - "longitude": -8.678369808, - "lines": [ - "31" - ] - }, - { - "stopId": 14899, - "name": { - "original": "Rúa de López Mora, 33" - }, - "latitude": 42.225485719, - "longitude": -8.730501434, - "lines": [ - "5A", - "5B", - "12A" - ] - }, - { - "stopId": 14900, - "name": { - "original": "Rúa de Martín Echegaray, 24" - }, - "latitude": 42.217196117, - "longitude": -8.743726669, - "lines": [ - "23", - "N4" - ] - }, - { - "stopId": 14901, - "name": { - "original": "Avda. de Castelao, 1" - }, - "latitude": 42.220211003, - "longitude": -8.734183023, - "lines": [ - "C3i", - "10", - "11", - "15A", - "U1" - ] - }, - { - "stopId": 14903, - "name": { - "original": "Rúa de Pi i Margall, 66" - }, - "latitude": 42.23174719, - "longitude": -8.731081308, - "lines": [ - "VTS" - ] - }, - { - "stopId": 14905, - "name": { - "original": "Camiño da Devesa (Cemiterio)" - }, - "latitude": 42.249981353, - "longitude": -8.667186504, - "lines": [ - "9B" - ] - }, - { - "stopId": 14906, - "name": { - "original": "Rúa da Rabadeira, 6" - }, - "latitude": 42.232479787, - "longitude": -8.654890792, - "lines": [ - "9B", "27" ] }, { - "stopId": 14907, - "name": { - "original": "Rúa da Rabadeira, 24" - }, - "latitude": 42.233655479, - "longitude": -8.653300242, - "lines": [ - "9B", - "27" - ] - }, - { - "stopId": 14908, - "name": { - "original": "Rúa da Rabadeira, 17" - }, - "latitude": 42.233829075, - "longitude": -8.653458259, - "lines": [ - "9B" - ] - }, - { - "stopId": 14909, - "name": { - "original": "Rúa da Rabadeira, 11" - }, - "latitude": 42.232663198, - "longitude": -8.655097059, - "lines": [ - "9B" - ] - }, - { - "stopId": 14910, - "name": { - "original": "Estrada do Marco, 4" - }, - "latitude": 42.21025095, - "longitude": -8.704036986, - "lines": [ - "H3" - ] - }, - { - "stopId": 14911, - "name": { - "original": "Estrada do Marco, 16" - }, - "latitude": 42.208830737, - "longitude": -8.706971174, - "lines": [ - "H3" - ] - }, - { - "stopId": 15001, - "name": { - "original": "Rúa Regueiro do Forno (Vial C) Centro de Servicios" - }, - "latitude": 42.176036704, - "longitude": -8.709480986, - "lines": [ - "PTL" - ] - }, - { - "stopId": 15002, - "name": { - "original": "PTL 2" - }, - "latitude": 42.177194637, - "longitude": -8.707850807, - "lines": [ - "PTL" - ] - }, - { - "stopId": 15003, - "name": { - "original": "PTL 3" - }, - "latitude": 42.178231278, - "longitude": -8.706474418, - "lines": [ - "PTL" - ] - }, - { - "stopId": 15004, - "name": { - "original": "PTL 4" - }, - "latitude": 42.176503017, - "longitude": -8.710007303, - "lines": [ - "PTL" - ] - }, - { - "stopId": 20009, - "name": { - "original": "Estrada Herville, 16" - }, - "latitude": 42.154843231, - "longitude": -8.67357438, - "lines": [ - "7" - ] - }, - { - "stopId": 20010, - "name": { - "original": "Avda. de Balaídos, 69" - }, - "latitude": 42.212824845, - "longitude": -8.737161077, - "lines": [ - "A", - "16", - "23", - "H" - ] - }, - { - "stopId": 20011, - "name": { - "original": "Avda. de Balaídos, 11" - }, - "latitude": 42.213089061, - "longitude": -8.733392573, - "lines": [ - "A", - "16", - "23", - "H" - ] - }, - { - "stopId": 20012, - "name": { - "original": "Avda. de Castrelos, 33" - }, - "latitude": 42.215888032, - "longitude": -8.732331627, - "lines": [ - "A", - "16", - "23", - "27", - "H2" - ] - }, - { - "stopId": 20013, - "name": { - "original": "Avda. de Castrelos, 116" - }, - "latitude": 42.215905917, - "longitude": -8.732471102, - "lines": [ - "7", - "12B", - "17", - "27", - "H2", - "VTS", - "PTL" - ] - }, - { - "stopId": 20018, - "name": { - "original": "Estrada Herville, 70" - }, - "latitude": 42.151451604, - "longitude": -8.673803367, - "lines": [ - "7" - ] - }, - { - "stopId": 20019, - "name": { - "original": "Subida aos Padróns, 165" - }, - "latitude": 42.149222193, - "longitude": -8.679363987, - "lines": [ - "7" - ] - }, - { - "stopId": 20020, - "name": { - "original": "Subida aos Padróns (cruce Parque Forestal)" - }, - "latitude": 42.151606055, - "longitude": -8.679299082, - "lines": [ - "7" - ] - }, - { - "stopId": 20021, - "name": { - "original": "Subida aos Padróns (fronte 34)" - }, - "latitude": 42.152770176, - "longitude": -8.686251828, - "lines": [ - "7" - ] - }, - { - "stopId": 20022, - "name": { - "original": "Rúa da Vía Norte (Hospital)" - }, - "latitude": 42.234622237, - "longitude": -8.707758443, - "lines": [ - "24" - ] - }, - { - "stopId": 20023, - "name": { - "original": "Rúa da Vía Norte - Est. Intermodal - C.C." - }, - "latitude": 42.234062973, - "longitude": -8.712195759, - "lines": [ - "24" - ] - }, - { - "stopId": 20024, - "name": { - "original": "Rúa das Teixugueiras, 34" - }, - "latitude": 42.207634066, - "longitude": -8.758920861, - "lines": [ - "5B", - "13", - "N4" - ] - }, - { - "stopId": 20025, - "name": { - "original": "Rúa das Teixugueiras, 38" - }, - "latitude": 42.206553268, - "longitude": -8.760122491, - "lines": [ - "5B", - "13", - "N4" - ] - }, - { - "stopId": 20026, - "name": { - "original": "Rúa das Teixugueiras, 29" - }, - "latitude": 42.206488366, - "longitude": -8.759906624, - "lines": [ - "5B", - "13", - "N4", - "U1", - "H", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 20027, - "name": { - "original": "Avda. de Castelao, 64" - }, - "latitude": 42.217691983, - "longitude": -8.749585877, - "lines": [ - "C3d", - "4A", - "4C", - "5B", - "10", - "12A", - "13", - "15A", - "N4", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 20029, - "name": { - "original": "Subida á Madroa (fronte Campo Fútbol)" - }, - "latitude": 42.245921506, - "longitude": -8.673014474, - "lines": [ - "9B", - "28" - ] - }, - { - "stopId": 20030, - "name": { - "original": "Subida á Madroa (Campo Fútbol)" - }, - "latitude": 42.247859379, - "longitude": -8.674363625, - "lines": [ - "9B", - "28" - ] - }, - { - "stopId": 20041, - "name": { - "original": "Rúa da Cabalaría, 91" - }, - "latitude": 42.233622103, - "longitude": -8.689209566, - "lines": [ - "27", - "28" - ] - }, - { - "stopId": 20042, - "name": { - "original": "Rúa da Cabalaría, 148" - }, - "latitude": 42.233723398, - "longitude": -8.689094231, - "lines": [ - "28" - ] - }, - { - "stopId": 20043, - "name": { - "original": "Rúa do Areiro, 20" - }, - "latitude": 42.236036786, - "longitude": -8.686656768, - "lines": [ - "28" - ] - }, - { - "stopId": 20044, - "name": { - "original": "Rúa de Martín Echegaray, 7" - }, - "latitude": 42.215220874, - "longitude": -8.742680967, - "lines": [ - "23", - "N4" - ] - }, - { - "stopId": 20045, - "name": { - "original": "Rúa de Xestoso, 4" - }, - "latitude": 42.200532989, - "longitude": -8.674075447, - "lines": [ - "15B" - ] - }, - { - "stopId": 20046, - "name": { - "original": "Rúa de Xestoso, 12" - }, - "latitude": 42.201968444, - "longitude": -8.67477879, - "lines": [ - "15B" - ] - }, - { - "stopId": 20047, - "name": { - "original": "Rúa do Xestoso, 72" - }, - "latitude": 42.204330306, - "longitude": -8.674670483, - "lines": [ - "15B" - ] - }, - { - "stopId": 20048, - "name": { - "original": "Avda. de Cesáreo Vázquez (cruce Camiño Amariz Lourenzo)" - }, - "latitude": 42.182684406, - "longitude": -8.802402364, - "lines": [ - "11", - "12A" - ] - }, - { - "stopId": 20049, - "name": { - "original": "Avda. de Cesáreo Vázquez, 62" - }, - "latitude": 42.18238342, - "longitude": -8.802126069, - "lines": [ - "11" - ] - }, - { - "stopId": 20050, - "name": { - "original": "Rúa de Severino Cobas, 186" - }, - "latitude": 42.225550059, - "longitude": -8.686684563, - "lines": [ - "25" - ] - }, - { - "stopId": 20051, - "name": { - "original": "Rúa de Severino Cobas, 89" - }, - "latitude": 42.225652904, - "longitude": -8.686624017, - "lines": [ - "25" - ] - }, - { - "stopId": 20052, - "name": { - "original": "Rúa de Aragón, 21" - }, - "latitude": 42.232748414, - "longitude": -8.702539655, - "lines": [ - "4A", - "H3" - ] - }, - { - "stopId": 20053, - "name": { - "original": "Rúa de Ángel de Lema (cruce Paraixal)" - }, - "latitude": 42.248962858, - "longitude": -8.688272303, - "lines": [ - "C3i", - "10" - ] - }, - { - "stopId": 20054, - "name": { - "original": "Rúa de Ángel de Lema, 33" - }, - "latitude": 42.248897377, - "longitude": -8.689150714, - "lines": [ - "C3d", - "10" - ] - }, - { - "stopId": 20057, - "name": { - "original": "Estación Ferrocarril Guixar" - }, - "latitude": 42.238843911, - "longitude": -8.713008504, - "lines": [ - "A", - "5B", - "16", - "24" - ] - }, - { - "stopId": 20058, - "name": { - "original": "Rúa do Canceleiro, 6" - }, - "latitude": 42.238435471, - "longitude": -8.714413687, - "lines": [ - "A", - "5B", - "16", - "24" - ] - }, - { - "stopId": 20059, - "name": { - "original": "Rúa de Manuel Álvarez (fronte 10)" - }, - "latitude": 42.222745522, - "longitude": -8.677932515, - "lines": [ - "25", - "31", - "H3" - ] - }, - { - "stopId": 20060, - "name": { - "original": "Rúa de Manuel Álvarez, 10" - }, - "latitude": 42.22282586, - "longitude": -8.678077606, - "lines": [ - "25", - "31", - "H3" - ] - }, - { - "stopId": 20061, - "name": { - "original": "Rúa de Martín Echegaray (Colexio)" - }, - "latitude": 42.217568173, - "longitude": -8.744018511, - "lines": [ - "23", - "N4" - ] - }, - { - "stopId": 20062, - "name": { - "original": "Avda. de Beiramar, 1" - }, - "latitude": 42.236143706, - "longitude": -8.73180718, - "lines": [ - "10", - "15B" - ] - }, - { - "stopId": 20071, - "name": { - "original": "Rúa de Xestoso (fronte 105)" - }, - "latitude": 42.205511653, - "longitude": -8.672824803, - "lines": [ - "15B" - ] - }, - { - "stopId": 20072, - "name": { - "original": "Camiño do Pouso" - }, - "latitude": 42.196643694, - "longitude": -8.671663218, - "lines": [ - "15B" - ] - }, - { - "stopId": 20075, - "name": { - "original": "Avda. de Castelao, 65" - }, - "latitude": 42.218011215, - "longitude": -8.745369728, - "lines": [ - "C3i", - "4A", - "4C", - "10", - "11", - "12A", - "15A", - "N1", - "N4", - "U1" - ] - }, - { - "stopId": 20076, + "stopId": "vitrasa:980", "name": { - "original": "Avda. de Castelao, 25" - }, - "latitude": 42.21901679, - "longitude": -8.739919147, - "lines": [ - "C3i", - "4A", - "4C", - "10", - "11", - "12A", - "15A", - "N1", - "U1" - ] - }, - { - "stopId": 20077, - "name": { - "original": "Avda. de Castelao, 40" + "original": "Avda. da Atlántida, 99" }, - "latitude": 42.219259727, - "longitude": -8.739809435, + "latitude": 42.221170087, + "longitude": -8.763656977, "lines": [ - "C3d", - "4A", - "4C", - "5B", "10", - "12A", - "13", - "15A", - "PSA 1", - "PSA 4" - ] - }, - { - "stopId": 20078, - "name": { - "original": "Avda. das Camelias, 3" - }, - "latitude": 42.233341329, - "longitude": -8.728967219, - "lines": [ - "4A", - "4C", - "11", - "12B", - "17", - "27", - "N1" - ] - }, - { - "stopId": 20079, - "name": { - "original": "Avda. das Camelias, 8" - }, - "latitude": 42.23341294, - "longitude": -8.729045156, - "lines": [ - "4A", - "4C", - "5B", - "7", - "12A", - "12B", - "17", - "27", - "PSA 4" - ] - }, - { - "stopId": 20080, - "name": { - "original": "Avda. de Santa Mariña, 68" - }, - "latitude": 42.221674556, - "longitude": -8.660937347, - "lines": [ - "11" - ] - }, - { - "stopId": 20081, - "name": { - "original": "Subida aos Padróns (cruce Camiño da Chan da Rabicha)" - }, - "latitude": 42.151852858, - "longitude": -8.684956786, - "lines": [ - "7" - ] - }, - { - "stopId": 20082, - "name": { - "original": "Avda. de Santa Mariña (fronte 66)" - }, - "latitude": 42.221758032, - "longitude": -8.661135597, - "lines": [ - "11" - ] - }, - { - "stopId": 20083, - "name": { - "original": "Rúa Castañal, 6" - }, - "latitude": 42.188074669, - "longitude": -8.701928367, - "lines": [ - "27" - ] - }, - { - "stopId": 20084, - "name": { - "original": "Rúa Castañal, 26" - }, - "latitude": 42.18711079, - "longitude": -8.699519743, - "lines": [ - "27" - ] - }, - { - "stopId": 20085, - "name": { - "original": "Rúa Castañal (cruce Camiño das Presas)" - }, - "latitude": 42.185852445, - "longitude": -8.696410892, - "lines": [ - "27" - ] - }, - { - "stopId": 20086, - "name": { - "original": "Estrada dos Seixiños, 67" - }, - "latitude": 42.190645281, - "longitude": -8.696150583, - "lines": [ - "27" - ] - }, - { - "stopId": 20087, - "name": { - "original": "Estrada dos Seixiños, 23" - }, - "latitude": 42.194639373, - "longitude": -8.696795357, - "lines": [ - "27" - ] - }, - { - "stopId": 20089, - "name": { - "original": "Porriño - Padre Seixas ©" - }, - "latitude": 42.213044566, - "longitude": -8.751396835, - "lines": [ - "16" - ] - }, - { - "stopId": 20091, - "name": { - "original": "Camiño da Miragaia, 11-13" - }, - "latitude": 42.238164803, - "longitude": -8.711212761, - "lines": [ - "A", - "5B", - "16", - "24" - ] - }, - { - "stopId": 20094, - "name": { - "original": "Rúa das Mantelas (fronte 63)" - }, - "latitude": 42.22518736, - "longitude": -8.717399288, - "lines": [ - "18A" - ] - }, - { - "stopId": 20095, - "name": { - "original": "Estrada Vella de Madrid, 107A" - }, - "latitude": 42.219212419, - "longitude": -8.685836356, - "lines": [ - "12A", - "12B", - "13", - "H3" - ] - }, - { - "stopId": 20096, - "name": { - "original": "Estrada Vella de Madrid (fronte 107A)" - }, - "latitude": 42.219128991, - "longitude": -8.685753208, - "lines": [ - "12A", - "12B", - "13", - "U2", - "H3" - ] - }, - { - "stopId": 20099, - "name": { - "original": "Rúa de Camilo Veiga, 48" - }, - "latitude": 42.222390674, - "longitude": -8.752507356, - "lines": [ - "C3i", - "15B", - "15C", - "N1" - ] - }, - { - "stopId": 20100, - "name": { - "original": "Rúa de Camilo Veiga, 6" - }, - "latitude": 42.223195763, - "longitude": -8.749650702, - "lines": [ - "C3i", - "15B", - "15C", - "N1" - ] - }, - { - "stopId": 20102, - "name": { - "original": "H. A. Cunqueiro (Porta Principal)" - }, - "latitude": 42.191034002, - "longitude": -8.714303116, - "lines": [ - "6", - "12B", - "18H", - "27", - "H1", - "H2", - "H3", - "H" - ] - }, - { - "stopId": 20103, - "name": { - "original": "Avda. do Fragoso, 21" - }, - "latitude": 42.218946899, - "longitude": -8.733670293, - "lines": [ - "7", - "12B", - "17", - "N4", - "H1" - ] - }, - { - "stopId": 20104, - "name": { - "original": "Rúa de Emilia Pardo Bazán, 134" - }, - "latitude": 42.220938435, - "longitude": -8.709621883, - "lines": [ - "14" - ] - }, - { - "stopId": 20105, - "name": { - "original": "Rúa de Emilia Pardo Bazán, 121" - }, - "latitude": 42.221232035, - "longitude": -8.709808647, - "lines": [ - "14" - ] - }, - { - "stopId": 20107, - "name": { - "original": "Estrada do Porto (Lavadero)" - }, - "latitude": 42.188244696, - "longitude": -8.703164368, - "lines": [ - "6", - "27" - ] - }, - { - "stopId": 20110, - "name": { - "original": "Rúa de Manuel Castro, 10" - }, - "latitude": 42.213797254, - "longitude": -8.741472696, - "lines": [ - "23", - "N4" - ] - }, - { - "stopId": 20111, - "name": { - "original": "H. A. Cunqueiro (Hospital de Día)" - }, - "latitude": 42.187585838, - "longitude": -8.716278919, - "lines": [ - "A", - "6", - "12B", - "18H", - "27", - "H1", - "H2", - "H3", - "H" - ] - }, - { - "stopId": 20112, - "name": { - "original": "H. A. Cunqueiro (Urxencias)" - }, - "latitude": 42.188578188, - "longitude": -8.713087125, - "lines": [ - "6", - "12B", - "18H", - "H1", - "H3", - "H" - ] - }, - { - "stopId": 20113, - "name": { - "original": "Praza de América, 3 (Dirección Hospital)" - }, - "latitude": 42.220876566, - "longitude": -8.733367644, - "lines": [ - "12B", - "N4", - "H1", - "H2", - "PTL" - ] - }, - { - "stopId": 20114, - "name": { - "original": "Estrada do Porto (fronte Lavadero)" - }, - "latitude": 42.18846205, - "longitude": -8.703352711, - "lines": [ - "6" - ] - }, - { - "stopId": 20115, - "name": { - "original": "Estrada do Porto (fronte cruce Rúa das Sueiras)" - }, - "latitude": 42.190100441, - "longitude": -8.705453204, - "lines": [ - "6" - ] - }, - { - "stopId": 20116, - "name": { - "original": "Estrada da Coutada-Beade, 2" - }, - "latitude": 42.192037327, - "longitude": -8.70573732, - "lines": [ - "6", - "27" - ] - }, - { - "stopId": 20117, - "name": { - "original": "Estrada do Porto (cruce Camiño do Frascuelo)" - }, - "latitude": 42.191616209, - "longitude": -8.706277831, - "lines": [ - "6", - "27" - ] - }, - { - "stopId": 20118, - "name": { - "original": "Rúa Conde de Gondomar" - }, - "latitude": 42.228358488, - "longitude": -8.719490904, - "lines": [ - "H2" - ] - }, - { - "stopId": 20119, - "name": { - "original": "H. A. Cunqueiro (chegada)" - }, - "latitude": 42.190930878, - "longitude": -8.71409354, - "lines": [ - "6", - "12B", - "H1", - "H3" - ] - }, - { - "stopId": 20124, - "name": { - "original": "Estrada Clara Campoamor, 6" - }, - "latitude": 42.208989468, - "longitude": -8.729330619, - "lines": [ - "A", - "12B", - "U1", - "H1", - "H2", - "H", - "PTL" - ] - }, - { - "stopId": 20125, - "name": { - "original": "Estrada Clara Campoamor (fronte 6)" - }, - "latitude": 42.209126911, - "longitude": -8.729344197, - "lines": [ - "12B", - "H1", - "H2" - ] - }, - { - "stopId": 20126, - "name": { - "original": "Estrada Clara Campoamor (Rotonda HAC)" - }, - "latitude": 42.190252452, - "longitude": -8.717998617, - "lines": [ - "12B", - "18H", - "H1", - "H2" - ] - }, - { - "stopId": 20127, - "name": { - "original": "Estrada Clara Campoamor (fronte Rotonda HAC)" - }, - "latitude": 42.19007538, - "longitude": -8.718125045, - "lines": [ - "A", - "12B", - "18H", - "27", - "U1", - "H1", - "H2", - "H", - "PTL" - ] - }, - { - "stopId": 20130, - "name": { - "original": "Parque Forestal de Zamáns (Proba Andaina)" - }, - "latitude": 42.152788309, - "longitude": -8.681902684, - "lines": [ - "7" - ] - }, - { - "stopId": 20132, - "name": { - "original": "Avda. de Galicia, 341" - }, - "latitude": 42.260473187, - "longitude": -8.67881466, - "lines": [ - "C3i" - ] - }, - { - "stopId": 20136, - "name": { - "original": "Avda. de E. Martínez Garrido, 98" - }, - "latitude": 42.225764699, - "longitude": -8.704499864, - "lines": [ - "4C", - "23", - "31", - "N4", - "PSA 4", - "VTS" - ] - }, - { - "stopId": 20137, - "name": { - "original": "Camiño da Devesa (Asociación Veciños)" - }, - "latitude": 42.246563041, - "longitude": -8.669395817, - "lines": [ - "9B" - ] - }, - { - "stopId": 20139, - "name": { - "original": "Estrada Matamá Pazo (fronte 162)" - }, - "latitude": 42.199144892, - "longitude": -8.758506717, - "lines": [ - "29" - ] - }, - { - "stopId": 20141, - "name": { - "original": "Avda. da Ponte (fronte Vigo Memorial)" - }, - "latitude": 42.21057897, - "longitude": -8.671171189, - "lines": [ - "12B", "15B", "15C" ] }, { - "stopId": 20142, - "name": { - "original": "Camiño do Outeiro, 3" - }, - "latitude": 42.200738188, - "longitude": -8.714882876, - "lines": [ - "18B" - ] - }, - { - "stopId": 20143, - "name": { - "original": "Rúa das Teixugueiras (fronte 1)" - }, - "latitude": 42.215448094, - "longitude": -8.756474306, - "lines": [ - "15A" - ] - }, - { - "stopId": 20154, - "name": { - "original": "Rúa de Ramiro Pascual (fronte 127)" - }, - "latitude": 42.192089689, - "longitude": -8.709245389, - "lines": [ - "27" - ] - }, - { - "stopId": 20155, - "name": { - "original": "Rúa de Ramiro Pascual, 131" - }, - "latitude": 42.19217626, - "longitude": -8.708899009, - "lines": [ - "27" - ] - }, - { - "stopId": 20156, - "name": { - "original": "Económicas e Empresariais (CUVI 2)" - }, - "latitude": 42.169627618, - "longitude": -8.67984145, - "lines": [ - "A", - "15C" - ] - }, - { - "stopId": 20157, - "name": { - "original": "Estrada do Porto, 88" - }, - "latitude": 42.185615419, - "longitude": -8.702424678, - "lines": [ - "6" - ] - }, - { - "stopId": 20158, - "name": { - "original": "Estrada do Porto, 81" - }, - "latitude": 42.185593055, - "longitude": -8.702377974, - "lines": [ - "6" - ] - }, - { - "stopId": 20159, - "name": { - "original": "Estrada de Valadares, 571" - }, - "latitude": 42.160348044, - "longitude": -8.718706355, - "lines": [ - "7" - ] - }, - { - "stopId": 20160, - "name": { - "original": "Estrada de Valadares, 522" - }, - "latitude": 42.160066796, - "longitude": -8.718938239, - "lines": [ - "7" - ] - }, - { - "stopId": 20166, - "name": { - "original": "Camiño da Brea, 2" - }, - "latitude": 42.202134841, - "longitude": -8.70572793, - "lines": [ - "18A", - "18B" - ] - }, - { - "stopId": 20167, - "name": { - "original": "Camiño da Brea, 3" - }, - "latitude": 42.202095058, - "longitude": -8.705814233, - "lines": [ - "18A", - "18B" - ] - }, - { - "stopId": 20168, + "stopId": "vitrasa:990", "name": { - "original": "Estrada do Freixo (despois 118)" - }, - "latitude": 42.173596087, - "longitude": -8.730918928, - "lines": [ - "7" - ] - }, - { - "stopId": 20169, - "name": { - "original": "Estrada do Freixo (despois 235)" - }, - "latitude": 42.173616782, - "longitude": -8.730810863, - "lines": [ - "7" - ] - }, - { - "stopId": 20170, - "name": { - "original": "Rúa de Álvaro Cunqueiro, 4" - }, - "latitude": 42.224544805, - "longitude": -8.730413561, - "lines": [ - "5A", - "5B", - "12A" - ] - }, - { - "stopId": 20171, - "name": { - "original": "Estrada Clara Campoamor (cruce Camiño da Pousa)" - }, - "latitude": 42.204380762, - "longitude": -8.726688445, - "lines": [ - "12B", - "H1", - "H2" - ] - }, - { - "stopId": 20172, - "name": { - "original": "Estrada Clara Campoamor (cruce Camiño da Nogueira)" - }, - "latitude": 42.203736336, - "longitude": -8.726617869, - "lines": [ - "A", - "12B", - "U1", - "H1", - "H2", - "H", - "PTL" - ] - }, - { - "stopId": 20173, - "name": { - "original": "Avda. de Castrelos, 502" - }, - "latitude": 42.192504056, - "longitude": -8.721215121, - "lines": [ - "7", - "U1" - ] - }, - { - "stopId": 20174, - "name": { - "original": "Baixada ao Pontillón S/N" - }, - "latitude": 42.21519917, - "longitude": -8.726793773, - "lines": [ - "A" - ] - }, - { - "stopId": 20177, - "name": { - "original": "Rúa de Pizarro, 16" - }, - "latitude": 42.230767817, - "longitude": -8.715105964, - "lines": [ - "C3i", - "6", - "11", - "15A", - "23", - "25", - "28" - ] - }, - { - "stopId": 20178, - "name": { - "original": "Estrada de Camposancos (cruce Camiño da Estea)" - }, - "latitude": 42.172412443, - "longitude": -8.799591567, - "lines": [ - "12A" - ] - }, - { - "stopId": 20180, - "name": { - "original": "Rúa do Reiseñor, 10" - }, - "latitude": 42.229527407, - "longitude": -8.70843784, - "lines": [ - "H2" - ] - }, - { - "stopId": 20186, - "name": { - "original": "Rúa da Rabadeira, 71" - }, - "latitude": 42.23755404, - "longitude": -8.651558138, - "lines": [ - "9B" - ] - }, - { - "stopId": 20187, - "name": { - "original": "Rúa da Rabadeira, 46" - }, - "latitude": 42.237422128, - "longitude": -8.65153195, - "lines": [ - "9B", - "27" - ] - }, - { - "stopId": 20188, - "name": { - "original": "Rúa da Saa (fronte 43)" - }, - "latitude": 42.201670402, - "longitude": -8.708928464, - "lines": [ - "18B", - "H3" - ] - }, - { - "stopId": 20189, - "name": { - "original": "Rúa da Saa, 10" - }, - "latitude": 42.201625853, - "longitude": -8.712945043, - "lines": [ - "18B", - "H3" - ] - }, - { - "stopId": 20190, - "name": { - "original": "Avda. das Camelias (fronte Praza do Rei)" - }, - "latitude": 42.234906013, - "longitude": -8.72662052, - "lines": [ - "4A", - "4C", - "11", - "12B", - "17", - "27", - "N1" - ] - }, - { - "stopId": 20191, - "name": { - "original": "Rúa das Figueiras, 200" - }, - "latitude": 42.229676205, - "longitude": -8.657383392, - "lines": [ - "15A", - "25" - ] - }, - { - "stopId": 20192, - "name": { - "original": "Rúa de Colón, 26" - }, - "latitude": 42.237168511, - "longitude": -8.720373767, - "lines": [ - "4A", - "4C", - "5B", - "7", - "12B", - "16", - "17", - "24", - "PSA 4" - ] - }, - { - "stopId": 20193, - "name": { - "original": "Rúa de Policarpo Sanz, 25" - }, - "latitude": 42.23767601188501, - "longitude": -8.721582630122455, - "lines": [ - "C3i", - "A", - "5A", - "5B", - "6", - "9B", - "10", - "11", - "15B", - "15C", - "28", - "N1", - "N4", - "H1", - "VTS" - ], - "amenities": [ - "shelter", - "display" - ] - }, - { - "stopId": 20195, - "name": { - "original": "Praza de Compostela (fronte 35)" - }, - "latitude": 42.2393606, - "longitude": -8.724131464, - "lines": [ - "C3i", - "A", - "5A", - "5B", - "6", - "9B", - "10", - "11", - "15B", - "15C", - "28", - "N1", - "N4", - "H1", - "VTS" - ] - }, - { - "stopId": 20196, - "name": { - "original": "Estrada de Camposancos, 498" - }, - "latitude": 42.175325155, - "longitude": -8.799594139, - "lines": [ - "12A" - ] - }, - { - "stopId": 20197, - "name": { - "original": "Rúa de Pi i Margall, 3-5" - }, - "latitude": 42.23558703, - "longitude": -8.728830897, - "lines": [ - "5B", - "12A" - ] - }, - { - "stopId": 20199, - "name": { - "original": "Rúa de Puerto Rico, 12" - }, - "latitude": 42.228802205, - "longitude": -8.718136653, - "lines": [ - "H2" - ] - }, - { - "stopId": 20202, - "name": { - "original": "Estación Marítima" - }, - "latitude": 42.2404374, - "longitude": -8.726048008, - "lines": [ - "TUR" - ] - }, - { - "stopId": 20203, - "name": { - "original": "Avda. da Gran Vía, 47" - }, - "latitude": 42.230881062, - "longitude": -8.718397577, - "lines": [ - "7", - "12B", - "14", - "16", - "18A", - "18B", - "18H" - ] - }, - { - "stopId": 20206, - "name": { - "original": "Rúa do Marqués de Valladares (fronte 19)" - }, - "latitude": 42.238271922, - "longitude": -8.723353532, - "lines": [ - "C1", - "C3d", - "A", - "5A", - "9B", - "10", - "15B", - "15C", - "28", - "N4", - "H1" - ] - }, - { - "stopId": 20208, - "name": { - "original": "Rúa de Colón, 12" - }, - "latitude": 42.238028627, - "longitude": -8.720556548, - "lines": [ - "C1", - "A", - "5A", - "9B", - "15B", - "15C", - "28", - "N4", - "H1" - ] - }, - { - "stopId": 20209, - "name": { - "original": "Avda. do Alcalde Portanet, 23" - }, - "latitude": 42.211481651, - "longitude": -8.734440746, - "lines": [ - "H1" - ] - }, - { - "stopId": 20210, - "name": { - "original": "Estrada de Camposancos, 108" - }, - "latitude": 42.19824056, - "longitude": -8.763182189, - "lines": [ - "11", - "29" - ] - }, - { - "stopId": 20211, - "name": { - "original": "Estrada de Camposancos, 109" - }, - "latitude": 42.198422825, - "longitude": -8.762538026, - "lines": [ - "11", - "29" - ] - }, - { - "stopId": 20212, - "name": { - "original": "Rúa do Canabido, 18" - }, - "latitude": 42.188388732, - "longitude": -8.805956864, - "lines": [ - "10" - ] - }, - { - "stopId": 20214, - "name": { - "original": "Rúa da República Argentina, 21" + "original": "Avda. da Atlántida (fronte 148)" }, - "latitude": 42.237538973, - "longitude": -8.718186356, + "latitude": 42.222451366, + "longitude": -8.769134894, "lines": [ - "C3i", - "A", - "5A", - "5B", "10", - "11", "15B", "15C" ] - }, - { - "stopId": 20215, - "name": { - "original": "Rúa da Coruña, 21" - }, - "latitude": 42.223880296, - "longitude": -8.735520196, - "lines": [ - "A", - "5A", - "5B", - "10", - "11", - "13", - "N4", - "U1", - "H1", - "H", - "VTS" - ] - }, - { - "stopId": 20216, - "name": { - "original": "Avda. de Cesáreo Vázquez (fronte 43)" - }, - "latitude": 42.179747589, - "longitude": -8.802157388, - "lines": [ - "11" - ] - }, - { - "stopId": 20217, - "name": { - "original": "Rosalía de Castro, 4" - }, - "latitude": 42.238229421, - "longitude": -8.719950346, - "lines": [ - "C3d", - "10" - ] - }, - { - "stopId": 20218, - "name": { - "original": "Rúa de Oporto, 28" - }, - "latitude": 42.23721395, - "longitude": -8.716444794, - "lines": [ - "C3d", - "10" - ] - }, - { - "stopId": 20219, - "name": { - "original": "Avda. do Aeroporto (fronte 90)" - }, - "latitude": 42.234830699, - "longitude": -8.695443515, - "lines": [ - "A", - "9B", - "27", - "28" - ] } ]
\ No newline at end of file diff --git a/src/gtfs_vigo_stops/src/stops.py b/src/gtfs_vigo_stops/src/stops.py index 44a6d2d..bb54fa4 100644 --- a/src/gtfs_vigo_stops/src/stops.py +++ b/src/gtfs_vigo_stops/src/stops.py @@ -36,14 +36,16 @@ def get_all_stops_by_code(feed_dir: str) -> Dict[str, Stop]: all_stops = get_all_stops(feed_dir) for stop in all_stops.values(): - if stop.stop_code: - stop_25829_x, stop_25829_y = transformer.transform( - stop.stop_lon, stop.stop_lat - ) - stop.stop_25829_x = stop_25829_x - stop.stop_25829_y = stop_25829_y + stop_25829_x, stop_25829_y = transformer.transform( + stop.stop_lon, stop.stop_lat + ) + stop.stop_25829_x = stop_25829_x + stop.stop_25829_y = stop_25829_y + if stop.stop_code: stops_by_code[get_numeric_code(stop.stop_code)] = stop + else: + stops_by_code[stop.stop_id] = stop CACHED_BY_CODE[feed_dir] = stops_by_code 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 |
