From e8de6475c76aa8a91ed76b58a758a9096f50b2cc Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Sun, 4 May 2025 03:19:06 -0400 Subject: [PATCH] Optimizations (#15) - Add walking transfers - Pick route with minimal walking distance, instead of stop count - Turned `shared` into the new server, client no longer relies on `server` - Prepare to send full route data (instead of string) to the client --- src/client/lib/src/pages/home.dart | 10 +- src/client/lib/src/services/api.dart | 36 +- src/client/lib/src/view_models/home.dart | 15 +- .../lib/src/view_models/home_markers.dart | 91 +- src/client/lib/src/widgets/sidebar.dart | 34 +- src/server/GET_STOPS.json | 1850 ++++++------- src/server/GET_routes.json | 2312 ++++++++--------- src/shared/.gitignore | 2 + src/shared/bin/data.dart | 11 +- src/shared/bin/path.dart | 147 -- src/shared/bin/server.dart | 25 + src/shared/bin/test.dart | 18 + src/shared/lib/graph.dart | 1 + src/shared/lib/server.dart | 2 + src/shared/lib/src/data/provider.dart | 3 + src/shared/lib/src/data/route.dart | 15 +- src/shared/lib/src/data/stop.dart | 10 +- src/shared/lib/src/data/utils.dart | 15 +- src/shared/lib/src/generator/generator.dart | 13 +- src/shared/lib/src/generator/routes_bc.dart | 7 +- src/shared/lib/src/generator/routes_occt.dart | 8 +- src/shared/lib/src/generator/stops_bc.dart | 10 +- src/shared/lib/src/generator/stops_occt.dart | 10 +- src/shared/lib/src/generator/utils.dart | 4 +- src/shared/lib/src/graph/algorithm.dart | 60 + src/shared/lib/src/graph/state.dart | 138 +- src/shared/lib/src/server/misc.dart | 16 + src/shared/lib/src/server/path.dart | 24 + src/shared/lib/src/server/utils.dart | 15 + 29 files changed, 2536 insertions(+), 2366 deletions(-) delete mode 100644 src/shared/bin/path.dart create mode 100644 src/shared/bin/server.dart create mode 100644 src/shared/bin/test.dart create mode 100644 src/shared/lib/server.dart create mode 100644 src/shared/lib/src/graph/algorithm.dart create mode 100644 src/shared/lib/src/server/misc.dart create mode 100644 src/shared/lib/src/server/path.dart create mode 100644 src/shared/lib/src/server/utils.dart diff --git a/src/client/lib/src/pages/home.dart b/src/client/lib/src/pages/home.dart index d2488e3..7527fde 100644 --- a/src/client/lib/src/pages/home.dart +++ b/src/client/lib/src/pages/home.dart @@ -16,13 +16,19 @@ class HomePage extends ReactiveWidget { body: Row( children: [ SizedBox( - width: 300, + width: 325, child: Sidebar(model), ), Expanded( child: Card( child: Column( children: [ + SwitchListTile( + value: model.markerState == MarkerState.override, + onChanged: model.overrideMarkers, + title: const Text("Show stops list"), + subtitle: const Text("To select a start or end stop, use the buttons below"), + ), LatLongEditor( latitudeController: model.startLatitudeController, longitudeController: model.startLongitudeController, @@ -65,7 +71,7 @@ class HomePage extends ReactiveWidget { markers: model.markers, onTap: model.onMapTapped, polylines: { - for (final (index, route) in model.routes.indexed) Polyline( + for (final (index, route) in model.paths.indexed) Polyline( polylineId: PolylineId(index.toString()), color: routeColors[index], points: route, diff --git a/src/client/lib/src/services/api.dart b/src/client/lib/src/services/api.dart index 566b8cc..ae6bbc7 100644 --- a/src/client/lib/src/services/api.dart +++ b/src/client/lib/src/services/api.dart @@ -17,36 +17,13 @@ class ApiService extends Service { Uri get _base => usingDocker ? Uri(path: "api/") - : Uri(scheme: "http", host: "localhost", port: 80); + : Uri(scheme: "http", host: "localhost", port: 8001); - Future?> getTrips() => _client.getJsonList( - _base.resolve("trips"), - Trip.fromJson, - key: "path", - ); - - Future getPath({ - required Coordinates start, - required Coordinates end, - }) => _client.getJsonList( - _base.resolve("path").replace( - queryParameters: { - "start_lat": start.lat.toString(), - "start_lon": start.long.toString(), - "end_lat": end.lat.toString(), - "end_lon": end.long.toString(), - "time": DateTime.now().millisecondsSinceEpoch.toString(), - }, - ), - key: "path", - PathStep.fromJson, - ); - - Future getPath2({ + Future getPath({ required Coordinates start, required Coordinates end, }) async { - final uri = Uri.parse("http://localhost:8001/path").replace( + final uri = _base.resolve("/path").replace( queryParameters: { "start_lat": start.lat.toString(), "start_lon": start.long.toString(), @@ -64,8 +41,13 @@ class ApiService extends Service { } } + Future?> getRoutes() => _client.getJsonList( + _base.resolve("/routes"), + Route.fromJson, + ); + Future?> getStops() => _client.getJsonList( - _base.resolve("stops"), + _base.resolve("/stops"), Stop.fromJson, ); } diff --git a/src/client/lib/src/view_models/home.dart b/src/client/lib/src/view_models/home.dart index 4bcf9b5..388d150 100644 --- a/src/client/lib/src/view_models/home.dart +++ b/src/client/lib/src/view_models/home.dart @@ -26,7 +26,7 @@ class HomeModel extends ViewModel with HomeMarkers { bool isSearching = false; bool isGoogleReady = false; - List> routes = []; + List> paths = []; @override Future init() async { @@ -39,14 +39,15 @@ class HomeModel extends ViewModel with HomeMarkers { void onMapTapped(LatLng coordinates) { if (!shouldShowMarkers) return; final marker = Marker( - markerId: markerId, + markerId: markerId ?? const MarkerId("Tapped"), position: coordinates, - icon: markerIcon, + icon: markerIcon ?? BitmapDescriptor.defaultMarker, infoWindow: InfoWindow(title: "$startOrEnd here"), ); switch (markerState!) { case MarkerState.start: updateStart(coordinates, marker); case MarkerState.end: updateEnd(coordinates, marker); + case MarkerState.override: return; } } @@ -72,17 +73,11 @@ class HomeModel extends ViewModel with HomeMarkers { if (end.lat == null || end.long == null) return; isSearching = true; isLoading = true; - final result = await services.api.getPath2(start: start as Coordinates, end: end as Coordinates); + final result = await services.api.getPath(start: start as Coordinates, end: end as Coordinates); pathText = result ?? "An error occurred"; - // path = result; isLoading = false; if (result == null) return; isSearching = false; - // routes = [ - // for (final step in result) [ - // ...decodePolyline(step.trip.polyline), - // ], - // ]; notifyListeners(); } } diff --git a/src/client/lib/src/view_models/home_markers.dart b/src/client/lib/src/view_models/home_markers.dart index 82375ab..8f5585c 100644 --- a/src/client/lib/src/view_models/home_markers.dart +++ b/src/client/lib/src/view_models/home_markers.dart @@ -5,20 +5,27 @@ import "package:google_maps_flutter/google_maps_flutter.dart"; enum MarkerState { start, - end; + end, + override; } mixin HomeMarkers on ChangeNotifier { MarkerState? markerState; bool get shouldShowMarkers => markerState != null; - List? stops; + // List? stops; + Map stops = {}; + Map routes = {}; Marker? _startMarker; Marker? _endMarker; + Iterable getStopsForRoute(RouteID routeID) => routes[routeID]!.stops + .map((stopID) => stops[stopID]!); + Set get _filteredMarkers => { - for (final stop in stops ?? []) - if (stop.routes.any(routesToShow.contains)) + // for (final stop in stops ?? []) + for (final routeID in routesToShow) + for (final stop in getStopsForRoute(routeID)) Marker( markerId: MarkerId(stop.name), position: stop.coordinates.toLatLng(), @@ -36,55 +43,67 @@ mixin HomeMarkers on ChangeNotifier { if (_endMarker != null) _endMarker!, }; - Set bcRouteNames = {}; - Set occtRouteNames = {}; - Set routesToShow = {}; - Map stopCounts = {}; - Iterable<(String, List)> get providers => [ - ("OCCT", occtRouteNames.toList()..sort()), - ("BC Transit", bcRouteNames.toList()..sort(compareNums)), + List bcRouteNames = []; + List occtRouteNames = []; + Set routesToShow = {}; + Iterable<(String, List)> get providers => [ + ("OCCT", occtRouteNames), + ("BC Transit", bcRouteNames), ]; - int parseBcNumber(String routeName) { + int _parseBcNumber(String routeName) { // eg, "53)" --> 53 final first = routeName.split(" ").first; final withoutParen = first.substring(0, first.length - 1); return int.parse(withoutParen); } - int compareNums(String a, String b) => - parseBcNumber(a).compareTo(parseBcNumber(b)); + int compareBcRoutes(Route a, Route b) => + _parseBcNumber(a.shortName).compareTo(_parseBcNumber(b.shortName)); - MarkerId get markerId => switch (markerState!) { + int compareOcctRoutes(Route a, Route b) => + a.shortName.compareTo(b.shortName); + + MarkerId? get markerId => switch (markerState!) { MarkerState.start => const MarkerId("start"), MarkerState.end => const MarkerId("end"), + _ => null, }; - BitmapDescriptor get markerIcon => switch (markerState!) { + BitmapDescriptor? get markerIcon => switch (markerState!) { MarkerState.start => BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueCyan), MarkerState.end => BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen), + _ => null, }; - String get startOrEnd => switch (markerState!) { + String? get startOrEnd => switch (markerState!) { MarkerState.start => "Start", MarkerState.end => "End", + _ => null, }; Future updateMarkers() async { - stops = await services.api.getStops(); - if (stops == null) return; - for (final stop in stops!) { - for (final route in stop.routes) { - stopCounts[route] ??= 0; - stopCounts[route] = stopCounts[route]! + 1; - } - final namesList = switch (stop.provider) { + final stopsResponse = await services.api.getStops(); + if (stopsResponse == null) return; + stops = { + for (final stop in stopsResponse) + stop.id: stop, + }; + final routesResponse = await services.api.getRoutes(); + if (routesResponse == null) return; + routes = { + for (final route in routesResponse) + route.id: route, + }; + for (final route in routesResponse) { + final namesList = switch (route.provider) { Provider.occt => occtRouteNames, Provider.bc => bcRouteNames, }; - namesList.addAll(stop.routes); + namesList.add(route); } - notifyListeners(); + occtRouteNames.sort(compareOcctRoutes); + bcRouteNames.sort(compareBcRoutes); } void showMarkers(MarkerState newState) { @@ -100,20 +119,28 @@ mixin HomeMarkers on ChangeNotifier { void onMarkerTapped(Stop stop) { final coordinates = stop.coordinates.toLatLng(); final marker = Marker( - markerId: markerId, + markerId: markerId ?? MarkerId(stop.name), position: coordinates, infoWindow: InfoWindow( title: "$startOrEnd at ${stop.name}", snippet: stop.description, ), - icon: markerIcon, + icon: markerIcon ?? BitmapDescriptor.defaultMarker, ); switch (markerState!) { case MarkerState.start: updateStart(coordinates, marker); case MarkerState.end: updateEnd(coordinates, marker); + case MarkerState.override: return; } } + // Flutter widget + // ignore: avoid_positional_boolean_parameters + void overrideMarkers(bool value) { + markerState = value ? MarkerState.override : null; + notifyListeners(); + } + @mustCallSuper void updateStart(LatLng coordinates, Marker marker) { _startMarker = marker; @@ -128,11 +155,11 @@ mixin HomeMarkers on ChangeNotifier { notifyListeners(); } - void showRoute(String route, {required bool shouldShow}) { + void showRoute(Route route, {required bool shouldShow}) { if (shouldShow) { - routesToShow.add(route); + routesToShow.add(route.id); } else { - routesToShow.remove(route); + routesToShow.remove(route.id); } notifyListeners(); } diff --git a/src/client/lib/src/widgets/sidebar.dart b/src/client/lib/src/widgets/sidebar.dart index d7f5c85..f641190 100644 --- a/src/client/lib/src/widgets/sidebar.dart +++ b/src/client/lib/src/widgets/sidebar.dart @@ -13,18 +13,20 @@ class Sidebar extends ReusableReactiveWidget { child: Column( children: [ const SizedBox(height: 16), - Text( - "Select routes", - maxLines: 1, - style: context.textTheme.titleLarge, - textAlign: TextAlign.center, - ), - Text( - "Or click anywhere on the map", - maxLines: 1, - style: context.textTheme.bodyMedium, - textAlign: TextAlign.center, - ), + if (model.markerState != null && model.markerState != MarkerState.override) ...[ + Text( + "Select routes", + maxLines: 1, + style: context.textTheme.titleLarge, + textAlign: TextAlign.center, + ), + Text( + "Or click anywhere on the map", + maxLines: 1, + style: context.textTheme.bodyMedium, + textAlign: TextAlign.center, + ), + ], const SizedBox(height: 8), if (model.shouldShowMarkers) TabBar( tabs: [ @@ -33,7 +35,7 @@ class Sidebar extends ReusableReactiveWidget { ], ), if (!model.shouldShowMarkers && model.pathText != null) - Center(child: Text(model.pathText!, style: context.textTheme.bodySmall)), + SingleChildScrollView(child: Center(child: Text(model.pathText!, style: context.textTheme.bodySmall))), if (!model.shouldShowMarkers && model.pathText == null) const Center(child: Text("Choose start or end location")), if (model.shouldShowMarkers) Expanded( @@ -43,12 +45,12 @@ class Sidebar extends ReusableReactiveWidget { ListView( children: [ for (final route in routesList) CheckboxListTile( - title: Text(route, maxLines: 1), + title: Text(route.fullName, maxLines: 1), subtitle: Text( - "${model.stopCounts[route] ?? 0} stops", + "${route.stops.length} stops", maxLines: 1, ), - value: model.routesToShow.contains(route), + value: model.routesToShow.contains(route.id), onChanged: (value) => model.showRoute(route, shouldShow: value!), ), ], diff --git a/src/server/GET_STOPS.json b/src/server/GET_STOPS.json index 40a40b8..00dfdc4 100644 --- a/src/server/GET_STOPS.json +++ b/src/server/GET_STOPS.json @@ -1,6 +1,6 @@ [ { - "id": "1", + "id": "BCT_1", "name": "BC Junction", "description": "BC Junction is last inbound stop", "latitude": 42.101354, @@ -36,7 +36,7 @@ ] }, { - "id": "1.1", + "id": "BCT_1.1", "name": "BC Junction", "description": "BC Junction Drop Off", "latitude": 42.100719, @@ -52,7 +52,7 @@ ] }, { - "id": "22", + "id": "BCT_22", "name": "BHS", "description": "Binghamton High School. This bus will only run when school is in session.", "latitude": 42.099044, @@ -74,7 +74,7 @@ ] }, { - "id": "301", + "id": "BCT_301", "name": "Ross Park Zoo", "description": "The stop is located near the ticket booth at the Ross Park Zoo Binghamton", "latitude": 42.075096, @@ -88,7 +88,7 @@ ] }, { - "id": "302", + "id": "BCT_302", "name": "BC Junction 3 Park Ave", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 5 Dock A", "latitude": 42.101845, @@ -102,7 +102,7 @@ ] }, { - "id": "303", + "id": "BCT_303", "name": "Morgan/Earle", "description": "The stop is located on a sign post after Earle Dr across from the Ross Park Zoo Binghamton", "latitude": 42.075542, @@ -116,7 +116,7 @@ ] }, { - "id": "304", + "id": "BCT_304", "name": "Carroll / Hawley", "description": "The stop is located on a sign post after Hawley St across from Columbus Park Binghamton", "latitude": 42.097018, @@ -130,7 +130,7 @@ ] }, { - "id": "305", + "id": "BCT_305", "name": "Morgan/Kane", "description": "The stop is located on a sign post about 20 feet before Kane Ave at a private residence Binghamton", "latitude": 42.076202, @@ -144,7 +144,7 @@ ] }, { - "id": "306", + "id": "BCT_306", "name": "Exchange/Susquehanna", "description": "The stop is located on a utility pole after Susquehanna St in front of Woodburn Court One Binghamton", "latitude": 42.09523, @@ -158,7 +158,7 @@ ] }, { - "id": "307", + "id": "BCT_307", "name": "Morgan/Spurr", "description": "The stop is located on a sign post about 50 feet before Spurr Ave at a private residence Binghamton", "latitude": 42.076294, @@ -172,7 +172,7 @@ ] }, { - "id": "308", + "id": "BCT_308", "name": "Mill / McNamara", "description": "The stop is located on a sign post across from McNamara Ave near a private residence Binghamton", "latitude": 42.089417, @@ -186,7 +186,7 @@ ] }, { - "id": "309", + "id": "BCT_309", "name": "Morgan/Mary", "description": "The stop is located on a sign post about 100 feet before Mary St at a private residence Binghamton", "latitude": 42.076672, @@ -200,7 +200,7 @@ ] }, { - "id": "310", + "id": "BCT_310", "name": "Mill / Newton", "description": "The stop is located on a sign post about 20 feet before Newton Ave at a private residence Binghamton", "latitude": 42.088409, @@ -214,7 +214,7 @@ ] }, { - "id": "311", + "id": "BCT_311", "name": "Morgan/Park", "description": "The stop is located on a sign post at the corner before Park Ave at a private residence Binghamton", "latitude": 42.077007, @@ -228,7 +228,7 @@ ] }, { - "id": "312", + "id": "BCT_312", "name": "Newton / Genesee", "description": "The stop is located on a sign post at the corner before Genesee Ave at a private residence Binghamton", "latitude": 42.088226, @@ -242,7 +242,7 @@ ] }, { - "id": "313", + "id": "BCT_313", "name": "Park/Maria Manor", "description": "The stop is located on a sign post at the corner before Maria Manor near Nips Binghamton", "latitude": 42.078358, @@ -256,7 +256,7 @@ ] }, { - "id": "314", + "id": "BCT_314", "name": "Newton / Tremont", "description": "The stop is located on a sign post at the corner before Tremont Ave at a private residence Binghamton", "latitude": 42.088207, @@ -270,7 +270,7 @@ ] }, { - "id": "315", + "id": "BCT_315", "name": "Park/Corbett", "description": "The stop is located on a sign post at the corner before Corbett Ave by a parking lot Binghamton", "latitude": 42.07959, @@ -284,7 +284,7 @@ ] }, { - "id": "316", + "id": "BCT_316", "name": "Duane/James", "description": "The stop is located on a sign post about 20 feet before James St at a private residence Binghamton", "latitude": 42.085888, @@ -298,7 +298,7 @@ ] }, { - "id": "317", + "id": "BCT_317", "name": "Park/Sherwood", "description": "The stop is located on a telephone pole at the corner before Sherwood Ave at a private residence Binghamton", "latitude": 42.080452, @@ -312,7 +312,7 @@ ] }, { - "id": "318", + "id": "BCT_318", "name": "James/Mary", "description": "The stop is located on a sign post at the corner before Mary St at a private residence Binghamton", "latitude": 42.085781, @@ -326,7 +326,7 @@ ] }, { - "id": "319", + "id": "BCT_319", "name": "Park/Guilfoyle", "description": "The stop is located on a sign post about 25 feet before Guilfoyle Ave at a private residence Binghamton", "latitude": 42.081745, @@ -340,7 +340,7 @@ ] }, { - "id": "320", + "id": "BCT_320", "name": "James/S Washington", "description": "The stop is located on a telephone pole at the corner before S Washington St across from the Binghamton General Hospital Parking Lot Binghamton", "latitude": 42.085766, @@ -354,7 +354,7 @@ ] }, { - "id": "321", + "id": "BCT_321", "name": "Park/Morris", "description": "The stop is located on a sign post about 20 feet before Morris St at a private residence Binghamton", "latitude": 42.083305, @@ -368,7 +368,7 @@ ] }, { - "id": "322", + "id": "BCT_322", "name": "S Washington / Morris", "description": "The stop is located on a sign post about 50 feet before Morris St near the NYSEG substation Binghamton", "latitude": 42.083637, @@ -382,7 +382,7 @@ ] }, { - "id": "323", + "id": "BCT_323", "name": "Park Ave /General Hospital", "description": "The stop is located on a sign post near the Emergency Room at the Binghamton General Hospital. There is a bus shelter here.", "latitude": 42.086275, @@ -396,7 +396,7 @@ ] }, { - "id": "324", + "id": "BCT_324", "name": "S Washington / Sherwood", "description": "The stop is located on a telephone about 50 feet before Sherwood Ave at a private residence Binghamton", "latitude": 42.080822, @@ -410,7 +410,7 @@ ] }, { - "id": "325.1", + "id": "BCT_325.1", "name": "Mitchell/General Hospital", "description": "The stop is located in front of the Binghamton General Hospital Main entrance- Binghamton", "latitude": 42.08663, @@ -424,7 +424,7 @@ ] }, { - "id": "325.2", + "id": "BCT_325.2", "name": "Pennsylvania/Manier", "description": "The stop is located about 200 feet after Manier St Binghamton.", "latitude": 42.085847, @@ -438,7 +438,7 @@ ] }, { - "id": "326", + "id": "BCT_326", "name": "S Washington / Woodland", "description": "The stop is located on a sign post near a telephone pole across from Woodland Ave at a private residence Binghamton", "latitude": 42.077927, @@ -452,7 +452,7 @@ ] }, { - "id": "328", + "id": "BCT_328", "name": "S Washington / Morgan", "description": "The stop is located on telephone pole about 20 feet before Morgan Rd at a private residence Binghamton", "latitude": 42.076893, @@ -466,7 +466,7 @@ ] }, { - "id": "329", + "id": "BCT_329", "name": "Susquehanna/Exchange", "description": "The stop is located on a sign post about 200 feet before Exchange St near Woodburn Court Two Binghamton", "latitude": 42.095585, @@ -480,7 +480,7 @@ ] }, { - "id": "331", + "id": "BCT_331", "name": "Carroll /Lisle", "description": "The stop is located on a sign post after Lisle Ave near Columbus Park Binghamton", "latitude": 42.097377, @@ -494,7 +494,7 @@ ] }, { - "id": "500", + "id": "BCT_500", "name": "BC Junction 5 Vestal Ave", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 4 Dock A", "latitude": 42.101462, @@ -508,7 +508,7 @@ ] }, { - "id": "501", + "id": "BCT_501", "name": "Washington / Murray Hill", "description": "The stop is located on a sign post about 50 feet before Murray Hill Rd at a private residence Vestal", "latitude": 42.0824641752712, @@ -522,7 +522,7 @@ ] }, { - "id": "502", + "id": "BCT_502", "name": "Hawley / Exchange", "description": "The stop is located on a utility pole about 50 feet after Exchange St by the Family Court Binghamton", "latitude": 42.097252, @@ -538,7 +538,7 @@ ] }, { - "id": "503", + "id": "BCT_503", "name": "Washington Country Club", "description": "The stop is located on a sign post before Country Club at a private residence Vestal", "latitude": 42.082924, @@ -552,7 +552,7 @@ ] }, { - "id": "504", + "id": "BCT_504", "name": "Conklin / Tremont", "description": "The stop is located on a sign post about 150 feet before Tremont Ave just after the State St overpass Binghamton", "latitude": 42.092323, @@ -570,7 +570,7 @@ ] }, { - "id": "505", + "id": "BCT_505", "name": "Country Club / Deerfield", "description": "The stop is located on a sign post after Deerfield Place at a private residence Vestal", "latitude": 42.085739, @@ -584,7 +584,7 @@ ] }, { - "id": "506", + "id": "BCT_506", "name": "Conklin / Mill", "description": "The stop is located on telephone pole before Mill St at a private residence Binghamton", "latitude": 42.092773, @@ -602,7 +602,7 @@ ] }, { - "id": "507", + "id": "BCT_507", "name": "Country Club / Plaza", "description": "The stop is located on a sign post before Plaza Dr at at private residence Vestal", "latitude": 42.088062, @@ -616,7 +616,7 @@ ] }, { - "id": "508", + "id": "BCT_508", "name": "Conklin / High", "description": "The stop is located on a sign post about 100 feeet after High St across from the Park Diner Binghamton", "latitude": 42.092896, @@ -634,7 +634,7 @@ ] }, { - "id": "509", + "id": "BCT_509", "name": "Plaza / Meadows Apts", "description": "The stop is located on a sign post near the entrance to The Meadows Apartments Vestal", "latitude": 42.08952, @@ -648,7 +648,7 @@ ] }, { - "id": "510", + "id": "BCT_510", "name": "Telegraph / Conklin", "description": "The stop is located on a sign post after Conklin Ave across from Dynamic Brake Binghamton", "latitude": 42.093193, @@ -664,7 +664,7 @@ ] }, { - "id": "511", + "id": "BCT_511", "name": "Plaza / Executive Plaza Dr", "description": "The stop is located on a sign post across from 120 Executive Plaza Dr Vestal", "latitude": 42.091724, @@ -678,7 +678,7 @@ ] }, { - "id": "512", + "id": "BCT_512", "name": "Telegraph / Vestal", "description": "The stop is located on a sign post before Vestal Ave at a private residence Binghamton", "latitude": 42.0912008223956, @@ -694,7 +694,7 @@ ] }, { - "id": "513", + "id": "BCT_513", "name": "University Plaza", "description": "The stop is located by the University Plaza Clocktower Vestal", "latitude": 42.09185, @@ -708,7 +708,7 @@ ] }, { - "id": "514", + "id": "BCT_514", "name": "Vestal / Carlton", "description": "The stop is located on telephone pole before Carlton St at a private residence Binghamton", "latitude": 42.090904, @@ -724,7 +724,7 @@ ] }, { - "id": "515", + "id": "BCT_515", "name": "Vestal Ave / Normandy Ct", "description": "The stop is located on a sign post after Normandy Ct at a private residence Binghamton", "latitude": 42.091164, @@ -738,7 +738,7 @@ ] }, { - "id": "516", + "id": "BCT_516", "name": "Vestal / Mill", "description": "The stop is located on a sign post about 40 feet before Mill St near Anita's Hair Salon Binghamton", "latitude": 42.090778, @@ -754,7 +754,7 @@ ] }, { - "id": "517", + "id": "BCT_517", "name": "Vestal / Larchmont", "description": "The stop is located on a sign post before Larchmont Rd at a private residence Binghamton", "latitude": 42.089184, @@ -768,7 +768,7 @@ ] }, { - "id": "518", + "id": "BCT_518", "name": "Vestal / Livingston", "description": "The stop is located on a sign post before Livingston St by St John and St Andrew Church Binghamton", "latitude": 42.090469, @@ -782,7 +782,7 @@ ] }, { - "id": "519", + "id": "BCT_519", "name": "Vestal / Jutland", "description": "The stop is located on a sign post before Jutland Rd at a private residence Binghamton", "latitude": 42.087399, @@ -796,7 +796,7 @@ ] }, { - "id": "520", + "id": "BCT_520", "name": "Vestal / Tremont", "description": "The stop is located on a sign post before Tremont Ave at a private residence Binghamton", "latitude": 42.090199, @@ -810,7 +810,7 @@ ] }, { - "id": "521", + "id": "BCT_521", "name": "Vestal / Hawthorne", "description": "The stop is located on a sign post before Hawthorne Rd at a private residence Binghamton", "latitude": 42.086082, @@ -824,7 +824,7 @@ ] }, { - "id": "522", + "id": "BCT_522", "name": "Vestal / New", "description": "The stop is located on a telephone pole before New St by Lincoln Court Apts Binghamton", "latitude": 42.089909, @@ -838,7 +838,7 @@ ] }, { - "id": "523", + "id": "BCT_523", "name": "Vestal / Clifton", "description": "The stop is located on a telephone pole before Clifton Blvd at a private residence Binghamton", "latitude": 42.085644, @@ -852,7 +852,7 @@ ] }, { - "id": "524", + "id": "BCT_524", "name": "Vestal / Mary", "description": "The stop is located on a sign post before Mary St near the Southview US Post Office Binghamton", "latitude": 42.089748, @@ -866,7 +866,7 @@ ] }, { - "id": "525", + "id": "BCT_525", "name": "Vestal / Edgebrook", "description": "The stop is located on a telephone pole at the corner after Edgebrook Rd at a private residence Binghamton", "latitude": 42.085178, @@ -880,7 +880,7 @@ ] }, { - "id": "526", + "id": "BCT_526", "name": "Vestal / Mitchell", "description": "The stop is located on a sign post across from Mitchell Ave across from the Mirabito Binghamton", "latitude": 42.088985, @@ -894,7 +894,7 @@ ] }, { - "id": "527", + "id": "BCT_527", "name": "Vestal / Denton", "description": "The stop is located on a sign post before Denton Rd at a private residence Binghamton", "latitude": 42.084831, @@ -908,7 +908,7 @@ ] }, { - "id": "528", + "id": "BCT_528", "name": "Vestal / Pennsylvania", "description": "The stop is located on a sign post about 50 feet before Pennsylvania Ave by the Twin Tiers Eye Care Binghamton", "latitude": 42.08844, @@ -924,7 +924,7 @@ ] }, { - "id": "529", + "id": "BCT_529", "name": "Vestal / Brookfield", "description": "The stop is located on a telephone pole before Brookfield Rd across from MacArthur Park Binghamton", "latitude": 42.085743, @@ -938,7 +938,7 @@ ] }, { - "id": "530", + "id": "BCT_530", "name": "Vestal / Rush", "description": "The stop is located on a sign post after Rush Ave near the Park Ave Baptist Church Binghamton", "latitude": 42.087162, @@ -954,7 +954,7 @@ ] }, { - "id": "531", + "id": "BCT_531", "name": "Vestal / Rush", "description": "The stop is located on a sign post before Rush Ave at a private residence Binghamton", "latitude": 42.087166, @@ -968,7 +968,7 @@ ] }, { - "id": "532", + "id": "BCT_532", "name": "Vestal / Brookfield", "description": "The stop is located on a sign post before Brookfield Rd near MacArthur Park Binghamton", "latitude": 42.086308, @@ -984,7 +984,7 @@ ] }, { - "id": "533", + "id": "BCT_533", "name": "Vestal / Pennsylvania", "description": "The stop is located on a sign post about 20 feet before Pennsylvania Ave near Auto Zone Binghamton", "latitude": 42.087914, @@ -998,7 +998,7 @@ ] }, { - "id": "534", + "id": "BCT_534", "name": "Vestal / Denton", "description": "The stop is located on a sign post after Denton Rd Binghamton", "latitude": 42.084938, @@ -1014,7 +1014,7 @@ ] }, { - "id": "535", + "id": "BCT_535", "name": "Vestal/ Park", "description": "The stop is located on a sign post near Dunkin Donuts Binghamton", "latitude": 42.088661, @@ -1030,7 +1030,7 @@ ] }, { - "id": "536", + "id": "BCT_536", "name": "Vestal / Edgebrook", "description": "The stop is located on a sign post across from Edgebrook Rd Binghamton", "latitude": 42.0853, @@ -1046,7 +1046,7 @@ ] }, { - "id": "537", + "id": "BCT_537", "name": "Vestal / Mary", "description": "The stop is located on a telephone pole about 20 feet before Mary St across from the Southview Post Office Binghamton", "latitude": 42.089588, @@ -1060,7 +1060,7 @@ ] }, { - "id": "538", + "id": "BCT_538", "name": "Vestal / Clifton", "description": "The stop is located on a telephone pole across from Clifton Blvd at a private residence Binghamton", "latitude": 42.08567, @@ -1076,7 +1076,7 @@ ] }, { - "id": "539", + "id": "BCT_539", "name": "Vestal / Vine", "description": "The stop is located on a sign post before Vine St across from Lincoln Court Apts Binghamton", "latitude": 42.089813, @@ -1090,7 +1090,7 @@ ] }, { - "id": "540", + "id": "BCT_540", "name": "Vestal / Ivanoe", "description": "The stop is located on a sign post near Ivanhoe Rd- Binghamton", "latitude": 42.086548, @@ -1106,7 +1106,7 @@ ] }, { - "id": "541", + "id": "BCT_541", "name": "Vestal / Tremont", "description": "The stop is located on a sign post before Tremont Ave at a private residence Binghamton", "latitude": 42.090034, @@ -1120,7 +1120,7 @@ ] }, { - "id": "542", + "id": "BCT_542", "name": "Vestal / Jutland", "description": "The stop is located across from Jutland Rd Binghamton", "latitude": 42.087406, @@ -1136,7 +1136,7 @@ ] }, { - "id": "543", + "id": "BCT_543", "name": "Vestal / Mill St", "description": "The stop is located on a sign post before Mill St near Loaves & Fishes Pantry Binghamton", "latitude": 42.090599, @@ -1150,7 +1150,7 @@ ] }, { - "id": "544", + "id": "BCT_544", "name": "Vestal / Larchmont", "description": "The stop is located on a telephone pole across from Larchmont Rd Binghamton", "latitude": 42.089237, @@ -1166,7 +1166,7 @@ ] }, { - "id": "545", + "id": "BCT_545", "name": "Vestal / Telegraph", "description": "The stop is located on a sign post before Telegraph St at a private residence Binghamton", "latitude": 42.090961, @@ -1180,7 +1180,7 @@ ] }, { - "id": "546", + "id": "BCT_546", "name": "Vestal / NY 434", "description": "The stop is located on the NY 434 highway sign before the Vestal Pkwy Binghamton", "latitude": 42.091019, @@ -1196,7 +1196,7 @@ ] }, { - "id": "547", + "id": "BCT_547", "name": "Telegraph / Lucy", "description": "The stop is located on a sign post after Lucy St by Dynamic Brake Binghamton", "latitude": 42.093105, @@ -1210,7 +1210,7 @@ ] }, { - "id": "547.1", + "id": "BCT_547.1", "name": "Conklin/High", "description": "The stop is located on a sign post near the Park Diner", "latitude": 42.093016, @@ -1224,7 +1224,7 @@ ] }, { - "id": "548", + "id": "BCT_548", "name": "University Plaza", "description": "The stop is located on a sign post across from the Armed Forces Recruiting Center in the University Plaza Vestal", "latitude": 42.092083, @@ -1238,7 +1238,7 @@ ] }, { - "id": "549", + "id": "BCT_549", "name": "Conklin / Livingston", "description": "The stop is located on a sign post about 200 feet after Exchange St across from the Islamic Awareness Center Binghamton", "latitude": 42.092819, @@ -1254,7 +1254,7 @@ ] }, { - "id": "550", + "id": "BCT_550", "name": "300 Plaza Dr", "description": "The stop is located on a sign post at 300 Plaza Dr Vestal", "latitude": 42.091267, @@ -1268,7 +1268,7 @@ ] }, { - "id": "551", + "id": "BCT_551", "name": "Hawley / Exchange", "description": "The stop is located on a street lamp pole before Exchange St near the YWCA Binghamton", "latitude": 42.097202, @@ -1282,7 +1282,7 @@ ] }, { - "id": "552", + "id": "BCT_552", "name": "500 Plaza Dr", "description": "The stop is located on a sign post across from Christ the King Church Vestal", "latitude": 42.089333, @@ -1296,7 +1296,7 @@ ] }, { - "id": "553", + "id": "BCT_553", "name": "Carroll/Court", "description": "The stop is located on a sign post about 50 feet before Court St at a private business Binghamton.", "latitude": 42.0994, @@ -1312,7 +1312,7 @@ ] }, { - "id": "554", + "id": "BCT_554", "name": "Country Club / Clubhouse", "description": "The stop is located on a sign post across from Clubhouse Rd by the Hayes Community Apartments Vestal", "latitude": 42.087379, @@ -1326,7 +1326,7 @@ ] }, { - "id": "556", + "id": "BCT_556", "name": "Country Club / Deerfield", "description": "The stop is located on a sign post after Deerfield Place at a private residence Vestal", "latitude": 42.085278, @@ -1340,7 +1340,7 @@ ] }, { - "id": "558", + "id": "BCT_558", "name": "Country Club / Washington", "description": "The stop is located on a telephone pole before Washington Dr across from Vestal Hills Elementary School Vestal", "latitude": 42.083408, @@ -1354,7 +1354,7 @@ ] }, { - "id": "560", + "id": "BCT_560", "name": "Washington / Midvale", "description": "The stop is located on a sign post at the corner before Midvale Rd at a private residence Vestal", "latitude": 42.082886, @@ -1368,7 +1368,7 @@ ] }, { - "id": "562", + "id": "BCT_562", "name": "Washington / Lehigh", "description": "The stop is located on a sign post before Lehigh Ave at a private residence Vestal", "latitude": 42.082512, @@ -1382,7 +1382,7 @@ ] }, { - "id": "701", + "id": "BCT_701", "name": "Harry L/ Shopping Plaza", "description": "The stop is located on a sign post about 50 feet after the entrance to Harry L Drive shopping plaza Johnson City", "latitude": 42.123752, @@ -1398,7 +1398,7 @@ ] }, { - "id": "702", + "id": "BCT_702", "name": "BC Junction 7 Clinton St", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 10 Dock B", "latitude": 42.101173, @@ -1412,7 +1412,7 @@ ] }, { - "id": "703", + "id": "BCT_703", "name": "Harry L / Northside Park", "description": "The stop is located on a sign post before the crosswalk by the Northside Park and across from the Small Mall Johnson City", "latitude": 42.122543, @@ -1428,7 +1428,7 @@ ] }, { - "id": "704", + "id": "BCT_704", "name": "Clinton / Oak", "description": "The stop is located on a sign post about 25 feet after Oak St at private residence Binghamton", "latitude": 42.104534, @@ -1442,7 +1442,7 @@ ] }, { - "id": "705", + "id": "BCT_705", "name": "Harry L / N Harrison", "description": "The stop is located on a sign post at the corner before N. Harrison St by Therapeutic Day Spa Johnson City", "latitude": 42.122647, @@ -1458,7 +1458,7 @@ ] }, { - "id": "706", + "id": "BCT_706", "name": "Clinton / Murray", "description": "The stop is located on a sign post at the crosswalk before Murray St near Pat's Hairstyling Binghamton", "latitude": 42.104729, @@ -1472,7 +1472,7 @@ ] }, { - "id": "707", + "id": "BCT_707", "name": "Harry L & N Broad", "description": "The stop is located on a sign post before the crosswalk at N. Broad St across from the Harry L Apartments Johnson City", "latitude": 42.122908, @@ -1488,7 +1488,7 @@ ] }, { - "id": "708", + "id": "BCT_708", "name": "Clinton St / Mygatt", "description": "The stop is located on a sign post about 150 feet after Mygatt St near the GBHC Community Center Binghamton", "latitude": 42.105404, @@ -1502,7 +1502,7 @@ ] }, { - "id": "709", + "id": "BCT_709", "name": "Harry L / Jay", "description": "The stop is located on a telephone pole at the crosswalk before Jay St by the Kwik Fill Johnson City", "latitude": 42.122989, @@ -1518,7 +1518,7 @@ ] }, { - "id": "710", + "id": "BCT_710", "name": "Clinton / St. Cyril", "description": "The stop is located on a sign post at the corner before St Cyril Ave in front St Cyril Church Binghamton", "latitude": 42.105797, @@ -1532,7 +1532,7 @@ ] }, { - "id": "711", + "id": "BCT_711", "name": "Harry L /Myrtle", "description": "The stop is located on a telephone pole before Myrtle Ave by the Ave Maria Catholic Shop Johnson City", "latitude": 42.1225312982467, @@ -1548,7 +1548,7 @@ ] }, { - "id": "712", + "id": "BCT_712", "name": "Clinton / Hudson", "description": "The stop is located on a sign post across from Hudson St near Creative Beginnings Salon Binghamton", "latitude": 42.106232, @@ -1562,7 +1562,7 @@ ] }, { - "id": "713", + "id": "BCT_713", "name": "Harry L /Lester", "description": "The stop is located on a sign post at the corner before Lester Ave near So Jealous Salon Johnson City", "latitude": 42.121452, @@ -1578,7 +1578,7 @@ ] }, { - "id": "714", + "id": "BCT_714", "name": "Clinton / Charles", "description": "The stop is located on a sign post about 150 feet after Charles St across from Paradise Hair World Binghamton", "latitude": 42.106446, @@ -1592,7 +1592,7 @@ ] }, { - "id": "715", + "id": "BCT_715", "name": "Harry L / Virginia", "description": "The stop is located on a sign post at the corner before Virgnia Ave by the PMP Deli Johnson City", "latitude": 42.121344, @@ -1608,7 +1608,7 @@ ] }, { - "id": "716", + "id": "BCT_716", "name": "Clinton / Jarvis", "description": "The stop is located on a sign post about 150 feet after Jarvis St near the First Ward Senior Center Binghamton", "latitude": 42.106823, @@ -1622,7 +1622,7 @@ ] }, { - "id": "717", + "id": "BCT_717", "name": "Harry L / Airport", "description": "The stop is located on a sign post about 100 feet before Airport Rd by Arrowhead Bookstore Johnson City", "latitude": 42.122124, @@ -1638,7 +1638,7 @@ ] }, { - "id": "718", + "id": "BCT_718", "name": "Clinton / Colfax", "description": "The stop is located on a sign post at the corner after Colfax Ave across from Rogers Trucking Binghamton", "latitude": 42.107761, @@ -1652,7 +1652,7 @@ ] }, { - "id": "720", + "id": "BCT_720", "name": "Clinton / Holland", "description": "The stop is located on a sign post about 20 feet after Holland St near Kovarik Hardware Binghamton", "latitude": 42.108501, @@ -1666,7 +1666,7 @@ ] }, { - "id": "721", + "id": "BCT_721", "name": "Prospect / Columbus", "description": "The stop is located on a sign post about 200 feet after Columbus St by the Polish Community Center Binghamton", "latitude": 42.1166877599231, @@ -1682,7 +1682,7 @@ ] }, { - "id": "722", + "id": "BCT_722", "name": "Clinton / Wilson", "description": "The stop is located on a sign post at the corner after Wilson St across Lindsey's Laundry Service Binghamton", "latitude": 42.109467, @@ -1696,7 +1696,7 @@ ] }, { - "id": "723", + "id": "BCT_723", "name": "Prospect / Glenwood", "description": "The stop is located on a sign post between Tracy St and Glenwood Ave near the traffic light Binghamton", "latitude": 42.1159751157749, @@ -1712,7 +1712,7 @@ ] }, { - "id": "724", + "id": "BCT_724", "name": "Clinton / Janette", "description": "The stop is located on a sign post at the corner before Janette Ave across from the Dollar General Binghamton", "latitude": 42.110294, @@ -1726,7 +1726,7 @@ ] }, { - "id": "725", + "id": "BCT_725", "name": "Glenwood/Downs", "description": "The stop is located before Downs Ave across from Grace Tabernacle Community Center Binghamton", "latitude": 42.114563, @@ -1740,7 +1740,7 @@ ] }, { - "id": "726", + "id": "BCT_726", "name": "Clinton / Glenwood", "description": "The stop is located on a sign post before Glenwood Ave at the curb cut out near theHoly Spirit Byzantine Catholic Church Binghamton", "latitude": 42.1109570174629, @@ -1754,7 +1754,7 @@ ] }, { - "id": "727", + "id": "BCT_727", "name": "Glenwood /Miles", "description": "The stop is located on a sign post about 25 feet after Miles St by Mar-Con's Hairstyling Binghamton", "latitude": 42.112934, @@ -1768,7 +1768,7 @@ ] }, { - "id": "728", + "id": "BCT_728", "name": "Glenwood / Julian", "description": "The stop is located on a sign post at the corner before Julian St across from the Hess Express Binghamton", "latitude": 42.112568, @@ -1782,7 +1782,7 @@ ] }, { - "id": "729", + "id": "BCT_729", "name": "Glenwood /Belknap", "description": "The stop is located on a telephone pole at the corner before Belknap Ave by the Hess Express Binghamton", "latitude": 42.111938, @@ -1796,7 +1796,7 @@ ] }, { - "id": "730", + "id": "BCT_730", "name": "Glenwood / Judson", "description": "The stop is located on a sign post after Judson Ave near the Grace Tabernacle Community Center Binghamton", "latitude": 42.114708, @@ -1810,7 +1810,7 @@ ] }, { - "id": "731", + "id": "BCT_731", "name": "Clinton / Glenwood", "description": "The stop is located on a sign post about 100 feet after Glenwood Ave across from Holy Sprirt Byzantine Church Binghamton", "latitude": 42.110728848927, @@ -1824,7 +1824,7 @@ ] }, { - "id": "732", + "id": "BCT_732", "name": "Glenwood / Prospect", "description": "The stop is located on a sign post at the corner before Prospect St by Matty B's Place Binghamton", "latitude": 42.1157135473434, @@ -1838,7 +1838,7 @@ ] }, { - "id": "733", + "id": "BCT_733", "name": "Clinton / Wilson", "description": "The stop is located on a sign post before Wilson St across from Ascension Lutheran Church Binghamton", "latitude": 42.109635748266, @@ -1852,7 +1852,7 @@ ] }, { - "id": "734", + "id": "BCT_734", "name": "Glenwood/True (call for service (607)763-4464 or (607)778-1692", "description": "The stop is located on a sign post before True St near the I86 overpass Binghamton", "latitude": 42.117414, @@ -1868,7 +1868,7 @@ ] }, { - "id": "735", + "id": "BCT_735", "name": "Clinton / Holland", "description": "The stop is located on a sign post at the crosswalk before Holland St across from Kovarik Hardware Binghamton", "latitude": 42.108356, @@ -1882,7 +1882,7 @@ ] }, { - "id": "736", + "id": "BCT_736", "name": "Glenwood/Sunset (call for service (607)763-4464 or (607)778-1692", "description": "The stop is located on sign post after and across from Sunset Dr Town of Dickinson", "latitude": 42.121973, @@ -1898,7 +1898,7 @@ ] }, { - "id": "737", + "id": "BCT_737", "name": "Clinton / Jarvis", "description": "The stop is located on a telehphone pole near All Spec Finishing Binghamton", "latitude": 42.107038, @@ -1912,7 +1912,7 @@ ] }, { - "id": "738", + "id": "BCT_738", "name": "Glenwood/Maiden (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located a sign post across from Maiden Ln Town of Dickinson", "latitude": 42.12696, @@ -1928,7 +1928,7 @@ ] }, { - "id": "740", + "id": "BCT_740", "name": "Legacy Bay/Bldg G-H (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near Bldg G-H", "latitude": 42.13123, @@ -1944,7 +1944,7 @@ ] }, { - "id": "741", + "id": "BCT_741", "name": "Clinton /Charles", "description": "This stop is located across from Charles St Binghamton", "latitude": 42.106259, @@ -1958,7 +1958,7 @@ ] }, { - "id": "742", + "id": "BCT_742", "name": "Legacy Bay/Bldg U-V (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near Bldg U-V", "latitude": 42.125815, @@ -1974,7 +1974,7 @@ ] }, { - "id": "743", + "id": "BCT_743", "name": "Clinton / Crandall St", "description": "The stop is located on a sign post about 10 feet before Crandall St across from the Lincoln Hotel Binghamton", "latitude": 42.105846, @@ -1988,7 +1988,7 @@ ] }, { - "id": "744", + "id": "BCT_744", "name": "Legacy Bay/Bldg 56-59 (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near Bldg 56-59", "latitude": 42.124851, @@ -2004,7 +2004,7 @@ ] }, { - "id": "745", + "id": "BCT_745", "name": "Clinton / Titchner", "description": "The stop is located on a sign post at the crosswalk across from Mygatt St across from the GBHC Community Center", "latitude": 42.1050772168886, @@ -2018,7 +2018,7 @@ ] }, { - "id": "746", + "id": "BCT_746", "name": "Legacy Bay/Community Bldg (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near the Community Bldg", "latitude": 42.125461, @@ -2034,7 +2034,7 @@ ] }, { - "id": "747", + "id": "BCT_747", "name": "Clinton / Murray St", "description": "The stop is located on a sign post before Murray St across from Camelot Jewelers Binghamton", "latitude": 42.104675, @@ -2048,7 +2048,7 @@ ] }, { - "id": "748", + "id": "BCT_748", "name": "Legacy Bay/Bldg 12-15 (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is lcoated near Bldg 12-15", "latitude": 42.125574, @@ -2064,7 +2064,7 @@ ] }, { - "id": "749", + "id": "BCT_749", "name": "Clinton / Oak St", "description": "The stop is located on a sign post before Oak St near Luke's Anitiques Binghamton", "latitude": 42.1044214721223, @@ -2078,7 +2078,7 @@ ] }, { - "id": "750", + "id": "BCT_750", "name": "Legacy Bay/Bldg 56-59 (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near Bldg 56-59", "latitude": 42.124915, @@ -2094,7 +2094,7 @@ ] }, { - "id": "751", + "id": "BCT_751", "name": "Clinton / Front St", "description": "The stop is located on a sign post at the crosswalk before Front St near Botnick Chevrolet Binghamton", "latitude": 42.10371, @@ -2108,7 +2108,7 @@ ] }, { - "id": "752", + "id": "BCT_752", "name": "Legacy Bay/Bldg U-V (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is lcoated near Bldg U-V", "latitude": 42.125824, @@ -2124,7 +2124,7 @@ ] }, { - "id": "753", + "id": "BCT_753", "name": "Water / E Clinton St", "description": "The stop is located on a utility pole about 150 feet after E Clinton St by the Double Tree Hotel Binghamton", "latitude": 42.102219, @@ -2138,7 +2138,7 @@ ] }, { - "id": "754", + "id": "BCT_754", "name": "Legacy Bay/ (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near an access road.", "latitude": 42.130093, @@ -2154,7 +2154,7 @@ ] }, { - "id": "756", + "id": "BCT_756", "name": "Legacy Bay/Bldg G-H (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near Bldg G-H", "latitude": 42.131327, @@ -2170,7 +2170,7 @@ ] }, { - "id": "758", + "id": "BCT_758", "name": "Glenwood/BOCES (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near the BOCES campus parking lot. A bus shelter is here.", "latitude": 42.129228, @@ -2186,7 +2186,7 @@ ] }, { - "id": "760", + "id": "BCT_760", "name": "Glenwood/Maiden (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located at the corner before Maiden Ln at a private residence Binghamton", "latitude": 42.127174, @@ -2202,7 +2202,7 @@ ] }, { - "id": "762", + "id": "BCT_762", "name": "Glenwood/Helio Health (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located near the front entrance of the facility.", "latitude": 42.124695, @@ -2218,7 +2218,7 @@ ] }, { - "id": "764", + "id": "BCT_764", "name": "Glenwood/Sunset (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post before Sunset Dr at a private residence Binghamton", "latitude": 42.12106, @@ -2234,7 +2234,7 @@ ] }, { - "id": "766", + "id": "BCT_766", "name": "Glenwood/Sowden (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post before Sowden St near the I86 overpass Town of Dickinson", "latitude": 42.117831, @@ -2250,7 +2250,7 @@ ] }, { - "id": "768", + "id": "BCT_768", "name": "Glenwood / Prospect (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post before Prospect Ave across from Matty B's Pub Binghamton", "latitude": 42.116123, @@ -2266,7 +2266,7 @@ ] }, { - "id": "770", + "id": "BCT_770", "name": "Prospect / Merrill", "description": "The stop is located on a sign post across from Merrill St by the Church of the Holy Trinity Binghamton", "latitude": 42.116444, @@ -2282,7 +2282,7 @@ ] }, { - "id": "772", + "id": "BCT_772", "name": "Prospect / Airport", "description": "The stop is located on a sign post about 150 ft before Airport Rd near the Prospect Terrace Fire Station Binghamton.", "latitude": 42.1183547013954, @@ -2298,7 +2298,7 @@ ] }, { - "id": "774", + "id": "BCT_774", "name": "Request service at 33 Lewis Rd (call (607)763-4464 or (607)778-1692)", "description": "Service to 33 Lewis Rd is on request. See the 7 Clinton St schedule for more information", "latitude": 42.1404584127633, @@ -2312,7 +2312,7 @@ ] }, { - "id": "776", + "id": "BCT_776", "name": "Gannett / Pavillion", "description": "The stop is located on a sign post about 20 feet before Pavillon Rd near the CFJ Park Johnson City.", "latitude": 42.116867, @@ -2328,7 +2328,7 @@ ] }, { - "id": "778", + "id": "BCT_778", "name": "Lester / I86 Overpass", "description": "The stop is located on a telephone after the I 86 overpass Johnson City.", "latitude": 42.1199, @@ -2344,7 +2344,7 @@ ] }, { - "id": "780", + "id": "BCT_780", "name": "Harry L / Albany", "description": "The stop is located on a sign post about 50 feet before Albany Ave by Cacciatores Johnson City", "latitude": 42.1217817081864, @@ -2360,7 +2360,7 @@ ] }, { - "id": "782", + "id": "BCT_782", "name": "Harry L / Pearl", "description": "The stop is located on a sign post at the corner before Pearl Ave by Rossi's Pizza Johnson City", "latitude": 42.12219818688, @@ -2376,7 +2376,7 @@ ] }, { - "id": "784", + "id": "BCT_784", "name": "Harry L / Myrtle", "description": "The stop is located on a sign post about 10 feet before Myrtle Ave near the Harry L Pub Johnson City", "latitude": 42.122543, @@ -2392,7 +2392,7 @@ ] }, { - "id": "786", + "id": "BCT_786", "name": "Harry L / Jay", "description": "The stop is located on a sign post at the corner before Jay St across from the Kwik Fill in Johnson City", "latitude": 42.123079, @@ -2408,7 +2408,7 @@ ] }, { - "id": "788", + "id": "BCT_788", "name": "Harry L / N Arch", "description": "The stop is located on a sign post about 50 feet after N. Arch St near CVS Johnson City", "latitude": 42.122916, @@ -2424,7 +2424,7 @@ ] }, { - "id": "790", + "id": "BCT_790", "name": "Harry L / N Hudson St", "description": "The stop is located on a sign post at the curb cut out before N Hudson St Johnson City", "latitude": 42.122822, @@ -2440,7 +2440,7 @@ ] }, { - "id": "792", + "id": "BCT_792", "name": "Harry L / Small Mall", "description": "The stop is located on a sign post at the crosswalk before the entrance to the Small Mall Johnson City", "latitude": 42.122681, @@ -2456,7 +2456,7 @@ ] }, { - "id": "794", + "id": "BCT_794", "name": "Harry L Dr Friendly's", "description": "The stop is located on a sign post about 30 feet after the entrance to Friendly's Johnson City", "latitude": 42.124187251239, @@ -2472,7 +2472,7 @@ ] }, { - "id": "801", + "id": "BCT_801", "name": "Chenango Park & Ride", "description": "The stop is located in front of the Chenango Park & Ride Town of Chenango. There is a bus shelter here.", "latitude": 42.167835, @@ -2488,7 +2488,7 @@ ] }, { - "id": "802", + "id": "BCT_802", "name": "BC Junction 8 Front St", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 11 Dock B", "latitude": 42.101609, @@ -2502,7 +2502,7 @@ ] }, { - "id": "803", + "id": "BCT_803", "name": "Chenango Bridge / Oak Dr", "description": "The stop is located on a sign post at the corner before Oak Dr. Town of Chenango.", "latitude": 42.168728, @@ -2516,7 +2516,7 @@ ] }, { - "id": "805", + "id": "BCT_805", "name": "Chenango Bridge/UMA", "description": "The stop is located on a sign post before the entrance to Chenango Bridege Medical Town of Chenango.", "latitude": 42.168976, @@ -2530,7 +2530,7 @@ ] }, { - "id": "806", + "id": "BCT_806", "name": "Front/North", "description": "The stop is located on a sign post across from North St near the Tri-Cities Apartments parking lot Binghamton", "latitude": 42.100578, @@ -2546,7 +2546,7 @@ ] }, { - "id": "807", + "id": "BCT_807", "name": "Chenango Bridge/Matthews", "description": "The stop is located on a sign post about 50 feet after the entrance to Price Chopper Town of Chenango. A bus shelter is here.", "latitude": 42.16845, @@ -2560,7 +2560,7 @@ ] }, { - "id": "808", + "id": "BCT_808", "name": "Front/Gerard", "description": "The stop is located on a sign post before Gerard Ave across from Botnick Chevrolet Binghamton", "latitude": 42.102306, @@ -2576,7 +2576,7 @@ ] }, { - "id": "809", + "id": "BCT_809", "name": "Front/Chenango Bridge Rd", "description": "The stop is located on a sign post before the entrance to the Hillside Garden Center Town of Chenango.", "latitude": 42.167645, @@ -2590,7 +2590,7 @@ ] }, { - "id": "810", + "id": "BCT_810", "name": "Front /McDonald", "description": "The stop is located on telephone pole at the corner before McDonald Ave across from the Broome County Health Department Binghamton", "latitude": 42.105473, @@ -2604,7 +2604,7 @@ ] }, { - "id": "811", + "id": "BCT_811", "name": "Front/Bishop", "description": "The stop is located on a sign post at the corner before Bishop Rd near the Coin Laundry Town of Chenango", "latitude": 42.165668, @@ -2618,7 +2618,7 @@ ] }, { - "id": "812", + "id": "BCT_812", "name": "Front / Valley", "description": "The stop is located on a sign post about 75 feet after Valley St in front of Catholic Charities Binghamton", "latitude": 42.108715, @@ -2632,7 +2632,7 @@ ] }, { - "id": "813", + "id": "BCT_813", "name": "Front / Councilman", "description": "The stop is located on a sign post at the corner before Councilman Rd in front of Upfront Auto Town of Chenango", "latitude": 42.163883, @@ -2646,7 +2646,7 @@ ] }, { - "id": "814", + "id": "BCT_814", "name": "Front/Franklin", "description": "The stop is located on a sign post about 150 feet before Franklin St by a flood wall across from U Save Auto Binghamton", "latitude": 42.110321, @@ -2660,7 +2660,7 @@ ] }, { - "id": "815", + "id": "BCT_815", "name": "Front/Fuller", "description": "The stop is located on a sign post about 150 feet after Fuller Rd on the I-81 road sign in front of Sonny Manny's Town of Chenango", "latitude": 42.160706, @@ -2674,7 +2674,7 @@ ] }, { - "id": "816", + "id": "BCT_816", "name": "Old Front/Sunrise Terrace", "description": "The stop is located on a telephone pole on the corner before Rosedale Dr across from the Super 8. The bus will serve this bus stop on the outbound on request only.", "latitude": 42.124546, @@ -2688,7 +2688,7 @@ ] }, { - "id": "817", + "id": "BCT_817", "name": "Front/Northgate", "description": "The stop is located on a sign post about 50 feet before the entrance to the former Tokyo Sushi Buffet Town of Chenango", "latitude": 42.156811, @@ -2702,7 +2702,7 @@ ] }, { - "id": "817.1", + "id": "BCT_817.1", "name": "Front/TSC", "description": "The stop is located by the Tractor Supply Corp Binghamton", "latitude": 42.1521, @@ -2716,7 +2716,7 @@ ] }, { - "id": "818", + "id": "BCT_818", "name": "Front/Manor", "description": "This stop is located on a sign post after the entrance to Applebee's Binghamton", "latitude": 42.130081, @@ -2730,7 +2730,7 @@ ] }, { - "id": "819", + "id": "BCT_819", "name": "Front/Nimmonsburg", "description": "The stop is located on a sign post in front of the Nimmonsburg Square Shopping Center sign there is a curb cut out and a bench. Town of Chenango", "latitude": 42.149342, @@ -2744,7 +2744,7 @@ ] }, { - "id": "820", + "id": "BCT_820", "name": "County Jail", "description": "The stop is located near the main entrance of the Broome County Jail Binghamton", "latitude": 42.13203, @@ -2758,7 +2758,7 @@ ] }, { - "id": "821", + "id": "BCT_821", "name": "Front/Smith Hill", "description": "The stop is located on a sign post about 200 feet before Wallace Rd in front of Dependable Auto. Town of Chenango", "latitude": 42.145729, @@ -2772,7 +2772,7 @@ ] }, { - "id": "822", + "id": "BCT_822", "name": "S College Dr/Lot 1", "description": "The stop is located on a sign post after the entrance to Lot 1 near BC Day Care Center SUNY Broome Campus. A bus shelter is here", "latitude": 42.132763, @@ -2786,7 +2786,7 @@ ] }, { - "id": "823", + "id": "BCT_823", "name": "Front / Morningside", "description": "The stop is located on a sign post between N. Morningside Dr and S. Morningside Dr across from Comfort Inn. There is a bench here. Town of Chenango", "latitude": 42.141766, @@ -2800,7 +2800,7 @@ ] }, { - "id": "824", + "id": "BCT_824", "name": "S College Dr/Lot 3", "description": "The stop is located on a sign post after the entrance to Lot 3 near Alumni Field SUNY Broome Campus", "latitude": 42.133491, @@ -2814,7 +2814,7 @@ ] }, { - "id": "825", + "id": "BCT_825", "name": "Front/North College", "description": "The stop is located on a sign post about the 50 feet before N College Dr across from GHS Credit Union Binghamton", "latitude": 42.136887, @@ -2828,7 +2828,7 @@ ] }, { - "id": "826", + "id": "BCT_826", "name": "N. College/Pavilion", "description": "The stop is located at the Pavilion near the SUNY Broome Student Center SUNY Broome Campus", "latitude": 42.136078, @@ -2842,7 +2842,7 @@ ] }, { - "id": "826.1", + "id": "BCT_826.1", "name": "N. College/Paul F. Titchener Hall", "description": "The stop is located near the Paul F. Titchener Hall. A bus shelter is here.", "latitude": 42.136602, @@ -2856,7 +2856,7 @@ ] }, { - "id": "828", + "id": "BCT_828", "name": "Front /Boland", "description": "The stop is located on a sign post across from Boland Rd in front of the GHS Credit Union Binghamton. A bus shelter is here.", "latitude": 42.137177, @@ -2870,7 +2870,7 @@ ] }, { - "id": "830", + "id": "BCT_830", "name": "Front/N Morningside", "description": "The stop is located on a sign post across from on a sign post Morningside Dr in front of the Comfort Inn Town of Chenango", "latitude": 42.141911, @@ -2884,7 +2884,7 @@ ] }, { - "id": "832", + "id": "BCT_832", "name": "Front/Riverview", "description": "The stop is located on a sign post before the entrance to Maines Cash and Carry Town of Chenango", "latitude": 42.143173, @@ -2898,7 +2898,7 @@ ] }, { - "id": "834", + "id": "BCT_834", "name": "Front/Wallace", "description": "The stop is located on a sign post across from Wallace Rd across from Dependable Auto Town of Chenango", "latitude": 42.145126, @@ -2912,7 +2912,7 @@ ] }, { - "id": "835", + "id": "BCT_835", "name": "Front/Manor", "description": "The stop is located on a sign post about 100 feet after Manor Dr in front of United Methodist Homes Binghamton. There is a bus shelter here.", "latitude": 42.130192, @@ -2926,7 +2926,7 @@ ] }, { - "id": "836", + "id": "BCT_836", "name": "Front / Ethel", "description": "The stop is located on a sign post about 150 feet before Ethel St near the McDonald's Regional Offices Town of Chenango", "latitude": 42.14687, @@ -2940,7 +2940,7 @@ ] }, { - "id": "837", + "id": "BCT_837", "name": "Front/Old Front St", "description": "The stop is located on a sign post about 300 feet before Old Front St near McDonalds Binghamton", "latitude": 42.127499, @@ -2954,7 +2954,7 @@ ] }, { - "id": "838", + "id": "BCT_838", "name": "Front /Nimmonsburg Square", "description": "The stop is located across from Nimmonsburg Square. There is a curb cutout and bench here. Town of Chenango", "latitude": 42.149388, @@ -2968,7 +2968,7 @@ ] }, { - "id": "838.1", + "id": "BCT_838.1", "name": "Front/Pinkies BBQ", "description": "The stop is located by Pinkies BBQ Binghamton NY", "latitude": 42.152056, @@ -2982,7 +2982,7 @@ ] }, { - "id": "839", + "id": "BCT_839", "name": "Front/Franklin", "description": "The stop is located on a telephone pole about 200 feet after Franklin St in front Aamco Auto Repair Binghamton", "latitude": 42.110447, @@ -2996,7 +2996,7 @@ ] }, { - "id": "840", + "id": "BCT_840", "name": "Front / Northgate", "description": "The stop is located on a sign post after the entrance to Northgate Plaza near a steet lamp in front of Creature Comforts Town of Chenango", "latitude": 42.156818, @@ -3010,7 +3010,7 @@ ] }, { - "id": "841", + "id": "BCT_841", "name": "Front/Valley St", "description": "The stop is located on a telephone pole about 100 feet after Valley St across from Catholic Charities Binghamton", "latitude": 42.108818, @@ -3024,7 +3024,7 @@ ] }, { - "id": "842", + "id": "BCT_842", "name": "Front / Fuller", "description": "The stop is located on a sign post before the entrance to Lowes near the Empire Vision Town of Chenango", "latitude": 42.160473, @@ -3038,7 +3038,7 @@ ] }, { - "id": "843", + "id": "BCT_843", "name": "Front/Winding Way", "description": "The stop is located on a sign post about 20 feet before Winding Way near the Broome County Health Department Binghamton", "latitude": 42.105469, @@ -3052,7 +3052,7 @@ ] }, { - "id": "844", + "id": "BCT_844", "name": "Front / Quinn", "description": "The stop is located on a sign post at the corner before Quinn Rd near the Lori Ashley Salon Town of Chenango", "latitude": 42.162544, @@ -3066,7 +3066,7 @@ ] }, { - "id": "845", + "id": "BCT_845", "name": "Front/North", "description": "The stop is located on a sign post about 100 feet before North St in front of the Bridgwater Center for Rehabilitation Binghamton", "latitude": 42.1010711726257, @@ -3080,7 +3080,7 @@ ] }, { - "id": "846", + "id": "BCT_846", "name": "Front/Merrill", "description": "The stop is located on a sign post at the corner before Merrill Rd across from the Upfront Auto Town of Chenango", "latitude": 42.16407, @@ -3094,7 +3094,7 @@ ] }, { - "id": "847", + "id": "BCT_847", "name": "Front/Main", "description": "The stop is located on a sign post about 200 feet before Front St by the 1st Congregational Church parking lot Binghamton", "latitude": 42.099361, @@ -3108,7 +3108,7 @@ ] }, { - "id": "848", + "id": "BCT_848", "name": "Front/Bishop", "description": "The stop is located on a sign post at the corner before Bishop Rd near the Tioga State Bank Town of Chenango", "latitude": 42.165531, @@ -3122,7 +3122,7 @@ ] }, { - "id": "850", + "id": "BCT_850", "name": "Front/ Gabor", "description": "The stop is located on a sign post about 15 feet before Gabor Rd near the Can Man Town of Chenango", "latitude": 42.167397, @@ -3136,7 +3136,7 @@ ] }, { - "id": "852", + "id": "BCT_852", "name": "Chenango Bridge / Mathews", "description": "The stop is located on a sign post at the corner before Matthews St across from the Price Chopper Town of Chenango", "latitude": 42.168331, @@ -3150,7 +3150,7 @@ ] }, { - "id": "854", + "id": "BCT_854", "name": "Chenango Bridge/Oak", "description": "The stop is located on a sign post about 50 feet after the entrance to the Chenango Animal Hospital Town of Chenango", "latitude": 42.168758, @@ -3164,7 +3164,7 @@ ] }, { - "id": "1201", + "id": "BCT_1201", "name": "Dewey/Felters", "description": "The stop is located on a sign post near the corner after Dewey Ave.", "latitude": 42.0979658696223, @@ -3178,7 +3178,7 @@ ] }, { - "id": "1202", + "id": "BCT_1202", "name": "BC Junction 12 Conklin", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 2 Dock A", "latitude": 42.101243, @@ -3192,7 +3192,7 @@ ] }, { - "id": "1203", + "id": "BCT_1203", "name": "Montour/Saratoga", "description": "The stop is located on a sign post about 200 feet after Saratoga Ave Binghamton. There is a bus shelter here.", "latitude": 42.098293, @@ -3206,7 +3206,7 @@ ] }, { - "id": "1204", + "id": "BCT_1204", "name": "Court/Jay", "description": "The stop is located about 100 feet before Jay St in front of AVRE Binghamton. There is a bus shelter here.", "latitude": 42.100044, @@ -3222,7 +3222,7 @@ ] }, { - "id": "1205", + "id": "BCT_1205", "name": "Saratoga/Afton", "description": "The stop is located on a building by the parking lot before the bus turns on Afton St Binghamton", "latitude": 42.099073, @@ -3236,7 +3236,7 @@ ] }, { - "id": "1206", + "id": "BCT_1206", "name": "Court/Fayette", "description": "The stop is located on a sign post about 200 feet after Fayette St in front of the former Sheltered Workshop Binghamton.", "latitude": 42.100536, @@ -3252,7 +3252,7 @@ ] }, { - "id": "1207", + "id": "BCT_1207", "name": "Afton/Conklin-Inbound", "description": "The stop is located on a sign post at the corner before Conklin Ave at a private residence Binghamton", "latitude": 42.09996, @@ -3266,7 +3266,7 @@ ] }, { - "id": "1208", + "id": "BCT_1208", "name": "Court/Rutherford", "description": "The stop is located on a sign post about 50 feet before Rutherford St across from the Xtra Mart Binghamton", "latitude": 42.10099, @@ -3282,7 +3282,7 @@ ] }, { - "id": "1209", + "id": "BCT_1209", "name": "Conklin/Bond", "description": "The stop is located on a sign post at the corner before Bond St at a private residence Binghamton", "latitude": 42.09959, @@ -3298,7 +3298,7 @@ ] }, { - "id": "1210", + "id": "BCT_1210", "name": "Tompkins/Webster", "description": "The stop is located on a sign post about 50 feet after Webster St at a private residence Binghamton", "latitude": 42.099113, @@ -3312,7 +3312,7 @@ ] }, { - "id": "1211", + "id": "BCT_1211", "name": "Conklin/Duke", "description": "The stop is located on a sign post about 10 feet before Bond St at a private residence Binghamton", "latitude": 42.09874, @@ -3328,7 +3328,7 @@ ] }, { - "id": "1212", + "id": "BCT_1212", "name": "Tompkins/Jackson", "description": "The stop is located on a sign post about 20 feet before Jackson St at a private residence Binghamton", "latitude": 42.098038, @@ -3342,7 +3342,7 @@ ] }, { - "id": "1213", + "id": "BCT_1213", "name": "Conklin/Bedford", "description": "The stop is located on a sign post about 200 feet after Beford St at a private residence Binghamton.", "latitude": 42.09774, @@ -3358,7 +3358,7 @@ ] }, { - "id": "1214", + "id": "BCT_1214", "name": "Tompkins/Belden", "description": "The stop is located on a sign post about 25 before Belden St at a private residence Binghamton", "latitude": 42.096844, @@ -3372,7 +3372,7 @@ ] }, { - "id": "1215", + "id": "BCT_1215", "name": "Conklin/Burr", "description": "The stop is located on a sign post about 100 feet before Burr Ave by Weis Binghamton.", "latitude": 42.096954, @@ -3388,7 +3388,7 @@ ] }, { - "id": "1216", + "id": "BCT_1216", "name": "Conklin/Tompkins", "description": "The stop is located on a sign post about 200 feet after Tompkins St in front of the Hess Express Binghamton", "latitude": 42.095207, @@ -3404,7 +3404,7 @@ ] }, { - "id": "1217", + "id": "BCT_1217", "name": "Conklin/Baldwin", "description": "The stop is located on a sign post about 10 feet before Baldwin St by the Conklin Ave Baptist Church Binghamton", "latitude": 42.095816, @@ -3420,7 +3420,7 @@ ] }, { - "id": "1218", + "id": "BCT_1218", "name": "Conklin/Hayes", "description": "The stop is located on a telephone at the crosswalk before Hayes Ave ner the Franklin Elementary School Binghamton", "latitude": 42.095596, @@ -3436,7 +3436,7 @@ ] }, { - "id": "1219", + "id": "BCT_1219", "name": "Conklin/Tompkins", "description": "The stop is located on a sign post about 50 feet before Tompkins St across from the Hess Express Binghamton", "latitude": 42.095318, @@ -3452,7 +3452,7 @@ ] }, { - "id": "1220", + "id": "BCT_1220", "name": "Conklin/Burr", "description": "The stop is located on a sign post at the corner before Burr Ave across from the Weis Binghamton", "latitude": 42.096527, @@ -3468,7 +3468,7 @@ ] }, { - "id": "1221", + "id": "BCT_1221", "name": "Tompkins/Belden", "description": "The stop is located on a sign post at the corner before Belden St at a private residence Binghamton", "latitude": 42.096611, @@ -3482,7 +3482,7 @@ ] }, { - "id": "1222", + "id": "BCT_1222", "name": "Conklin/Proctor", "description": "The stop is located on a sign post about 50 feet before Proctor St at a private residence Binghamton", "latitude": 42.09737, @@ -3498,7 +3498,7 @@ ] }, { - "id": "1223", + "id": "BCT_1223", "name": "Tompkins/Jackson", "description": "The stop is located on a sign post at the corner before Jackson St at a private residence Binghamton", "latitude": 42.097832, @@ -3512,7 +3512,7 @@ ] }, { - "id": "1224", + "id": "BCT_1224", "name": "Conklin/Bedford", "description": "The stop is located on a sign post before Bedford St near the Savage Funeral Home Binghamton", "latitude": 42.09787, @@ -3528,7 +3528,7 @@ ] }, { - "id": "1225", + "id": "BCT_1225", "name": "Tompkins/Webster", "description": "The stop is located on a sign post about 75 feet before Webster St near Webster Court Apartments Binghamton", "latitude": 42.099129, @@ -3542,7 +3542,7 @@ ] }, { - "id": "1226", + "id": "BCT_1226", "name": "Conklin/Duke", "description": "The stop is located on a sign post in front of Future Faces Childcare Binghamton", "latitude": 42.098621, @@ -3558,7 +3558,7 @@ ] }, { - "id": "1227", + "id": "BCT_1227", "name": "Court/Liberty", "description": "The stop is located on a sign post about 20 feet before Liberity St ner the NYSEG Operations Center Binghamton", "latitude": 42.102207, @@ -3572,7 +3572,7 @@ ] }, { - "id": "1228", + "id": "BCT_1228", "name": "Conklin/Bond", "description": "The stop is located on a sign post after Duke St at a private residence Binghamton", "latitude": 42.099506, @@ -3588,7 +3588,7 @@ ] }, { - "id": "1229", + "id": "BCT_1229", "name": "Court/Chapman", "description": "The stop is located on a sign post about 20 feet after Chapman St near the Xtra Mart Binghamton", "latitude": 42.10133, @@ -3602,7 +3602,7 @@ ] }, { - "id": "1230", + "id": "BCT_1230", "name": "Afton/Conklin-Outbound", "description": "The stop is located on a telephone pole about 200 feet after Conklin Ave at a private residence Binghamton", "latitude": 42.0996753608716, @@ -3616,7 +3616,7 @@ ] }, { - "id": "1231", + "id": "BCT_1231", "name": "Court/Stuyvesant", "description": "The stop is located on a sign post about 50 feet after Stuyvesant St near the former Sheltered Workship Binghamton. There is a bus shelter here.", "latitude": 42.100739, @@ -3630,7 +3630,7 @@ ] }, { - "id": "1233", + "id": "BCT_1233", "name": "Court/Jay", "description": "The stop is located on a sign post across from Jay St near the Broome County Library Binghamton. There is a bus shelter here.", "latitude": 42.100163, @@ -3644,7 +3644,7 @@ ] }, { - "id": "1500", + "id": "BCT_1500", "name": "BC Junction 15 Leroy St", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 9 Dock B", "latitude": 42.101361, @@ -3658,7 +3658,7 @@ ] }, { - "id": "1501", + "id": "BCT_1501", "name": "Bunn Hill/NY434E Northbound", "description": "The stop is located on a sign post about 200 feet before NY 434 E across from Portobello Square in Vestal", "latitude": 42.095377, @@ -3676,7 +3676,7 @@ ] }, { - "id": "1502", + "id": "BCT_1502", "name": "Court/State", "description": "The stop is located on a sign post across from Washington St near the Subway Restaurant Binghamton", "latitude": 42.098804, @@ -3690,7 +3690,7 @@ ] }, { - "id": "1503", + "id": "BCT_1503", "name": "Bunn Hill/NY 434W Northbound", "description": "The stop is located on a telephone pole about 75 feet after the Vestal Pkwy near Quality Inn in Vestal.", "latitude": 42.096214, @@ -3706,7 +3706,7 @@ ] }, { - "id": "1505", + "id": "BCT_1505", "name": "Vestal/Old Lane", "description": "The stop is located on a sign post across from Old Lane by the Lourdes Hospice in Vestal.", "latitude": 42.097569, @@ -3722,7 +3722,7 @@ ] }, { - "id": "1507", + "id": "BCT_1507", "name": "Floral/New York", "description": "The stop is located on a sign post at the corner before New York Ave private residence in Johnson City", "latitude": 42.107048, @@ -3738,7 +3738,7 @@ ] }, { - "id": "1508", + "id": "BCT_1508", "name": "Oak/Main", "description": "The stop is located on a sign post about 125 feet after Main St across from the Binghamton High School Binghamton", "latitude": 42.098854, @@ -3752,7 +3752,7 @@ ] }, { - "id": "1509", + "id": "BCT_1509", "name": "Floral/Ackley", "description": "The stop is located on a sign post at the corner before Ackley Ave by the Primitive Methodist Church Johnson City", "latitude": 42.107361, @@ -3768,7 +3768,7 @@ ] }, { - "id": "1510", + "id": "BCT_1510", "name": "Oak/Seminary", "description": "The stop is located on a sign post at the corner before Seminary Ave at a private residence Binghamton", "latitude": 42.097073, @@ -3782,7 +3782,7 @@ ] }, { - "id": "1511", + "id": "BCT_1511", "name": "Floral/Baldwin", "description": "The stop is located on a sign post at the corner before Baldwin St near Floral Ave Park in Johnson City", "latitude": 42.107734, @@ -3798,7 +3798,7 @@ ] }, { - "id": "1512", + "id": "BCT_1512", "name": "Oak/Leroy", "description": "The stop is located on a sign post at the corner before Leroy St at a private residence Binghamton", "latitude": 42.09549, @@ -3812,7 +3812,7 @@ ] }, { - "id": "1513", + "id": "BCT_1513", "name": "Floral/Willow", "description": "The stop is located across from Willow St on Floral Ave", "latitude": 42.108111, @@ -3828,7 +3828,7 @@ ] }, { - "id": "1514", + "id": "BCT_1514", "name": "Leroy/Murray", "description": "The stop is located on a sign post about 50 feet after Murray St at a private residence Binghamton", "latitude": 42.09557, @@ -3842,7 +3842,7 @@ ] }, { - "id": "1515", + "id": "BCT_1515", "name": "Floral/Burbank", "description": "The stop is located on a sign post at the corner before Burbank Ave near the Floral Park Cemetary in Johnson City", "latitude": 42.108456, @@ -3858,7 +3858,7 @@ ] }, { - "id": "1516", + "id": "BCT_1516", "name": "Leroy/Chestnut", "description": "The stop is located on a sign post at the corner before Chestnut St near the Leroy Package St Binghamton", "latitude": 42.0957976933858, @@ -3872,7 +3872,7 @@ ] }, { - "id": "1517", + "id": "BCT_1517", "name": "Division/Burbank", "description": "The stop is located on a sign post about 75 feet after Burbank Ave at private residence Binghamton", "latitude": 42.105614, @@ -3886,7 +3886,7 @@ ] }, { - "id": "1518", + "id": "BCT_1518", "name": "Leroy/Millard", "description": "The stop is located on a sign post at the corner before Millard Ave at a private residence Binghamton", "latitude": 42.095661, @@ -3900,7 +3900,7 @@ ] }, { - "id": "1519", + "id": "BCT_1519", "name": "Division/Cleveland", "description": "The stop is located on a sign post at the corner before Cleveland Ave at private residence Binghamton", "latitude": 42.105721, @@ -3914,7 +3914,7 @@ ] }, { - "id": "1520", + "id": "BCT_1520", "name": "Leroy/Laurel", "description": "The stop is located on a sign post about 50 feet before Laurel Ave at a private residence Binghamton", "latitude": 42.095589, @@ -3928,7 +3928,7 @@ ] }, { - "id": "1521", + "id": "BCT_1521", "name": "Division/West End", "description": "The stop is located on a sign post at the corner before West End Ave at private residence Binghamton", "latitude": 42.105862, @@ -3942,7 +3942,7 @@ ] }, { - "id": "1522", + "id": "BCT_1522", "name": "Leroy/Beethoven", "description": "The stop is located on a sign post about 20 feet before Beethoven St at a private residence Binghamton", "latitude": 42.095399, @@ -3956,7 +3956,7 @@ ] }, { - "id": "1523", + "id": "BCT_1523", "name": "Schubert/Matthews", "description": "The stop is located on a sign post at the corner before Matthews St at private residence Binghamton", "latitude": 42.106251, @@ -3970,7 +3970,7 @@ ] }, { - "id": "1524", + "id": "BCT_1524", "name": "Beethoven/Seminary", "description": "The stop is located on a sign post about 100 feet Seminary Ave by the Recreation Park Tennis Courts Binghamton", "latitude": 42.097908, @@ -3984,7 +3984,7 @@ ] }, { - "id": "1525", + "id": "BCT_1525", "name": "Schubert/Crestmont", "description": "The stop is located on a sign post at the corner before Crestmont Rd at private residence Binghamton", "latitude": 42.105782, @@ -3998,7 +3998,7 @@ ] }, { - "id": "1526", + "id": "BCT_1526", "name": "Beethoven/Jefferson", "description": "The stop is located on a sign post after Jefferson Ave near recreation Park Binghamton", "latitude": 42.099689, @@ -4012,7 +4012,7 @@ ] }, { - "id": "1527", + "id": "BCT_1527", "name": "Minden/Schubert", "description": "The stop is located on a telephone pole about 200 feet after Schubert St near Thomas Jefferson Elementary School Binghamton", "latitude": 42.104858, @@ -4026,7 +4026,7 @@ ] }, { - "id": "1528", + "id": "BCT_1528", "name": "Highland/Beethoven", "description": "The stop is located on a sign post about 50 feet after Beethoven St at a private residence Binghamton", "latitude": 42.100517, @@ -4040,7 +4040,7 @@ ] }, { - "id": "1529", + "id": "BCT_1529", "name": "Minden/Jerome", "description": "The stop is located on a sign post at the corner before Jerome Ave at a private residence Binghamton", "latitude": 42.103542, @@ -4054,7 +4054,7 @@ ] }, { - "id": "1530", + "id": "BCT_1530", "name": "Highland/Kneeland", "description": "The stop is located on a sign post across from Kneeland Ave near West Middle School Binghamton", "latitude": 42.100384, @@ -4068,7 +4068,7 @@ ] }, { - "id": "1531", + "id": "BCT_1531", "name": "Helen/Druid", "description": "The stop is located on a sign post at the corner across from Druid Pl at a private residence Binghamton", "latitude": 42.101852, @@ -4082,7 +4082,7 @@ ] }, { - "id": "1532", + "id": "BCT_1532", "name": "Highland/Helen", "description": "The stop is located on a sign post at the corner before Helen St at a private residence Binghamton", "latitude": 42.100197, @@ -4096,7 +4096,7 @@ ] }, { - "id": "1533", + "id": "BCT_1533", "name": "Helen/Highland", "description": "The stop is located on a sign post before Highland Ave at a private residence Binghamton", "latitude": 42.1002358070277, @@ -4110,7 +4110,7 @@ ] }, { - "id": "1534", + "id": "BCT_1534", "name": "Helen/Druid", "description": "The stop is located on a telephone pole at the corner before Druid Pl Binghamton", "latitude": 42.102089, @@ -4124,7 +4124,7 @@ ] }, { - "id": "1535", + "id": "BCT_1535", "name": "Highland/Kneeland", "description": "The stop is located on a telephone pole across from Aquinas St near West Middle School Binghamton", "latitude": 42.100244160147, @@ -4138,7 +4138,7 @@ ] }, { - "id": "1536", + "id": "BCT_1536", "name": "Helen/Jerome", "description": "The stop is located on a sign post at the corner before Jerome Ave at a private residence Binghamton", "latitude": 42.10339, @@ -4152,7 +4152,7 @@ ] }, { - "id": "1537", + "id": "BCT_1537", "name": "Highland/Beethoven", "description": "The stop is located on a sign post at the corner before Beethoven St at a private residence Binghamton", "latitude": 42.100452, @@ -4166,7 +4166,7 @@ ] }, { - "id": "1538", + "id": "BCT_1538", "name": "Helen/Schubert", "description": "The stop is located on a sign post at the corner before Schubert St near Thomas Jefferson Elementary School", "latitude": 42.104527, @@ -4180,7 +4180,7 @@ ] }, { - "id": "1539", + "id": "BCT_1539", "name": "Beethoven/Jefferson", "description": "The stop is located on a sign post at the corner before Jefferson Ave at a private residence Binghamton", "latitude": 42.099556, @@ -4194,7 +4194,7 @@ ] }, { - "id": "1540", + "id": "BCT_1540", "name": "Schubert/Crestmont", "description": "The stop is located on a sign post at the corner before Crestmont Rd at a private residence Binghamton", "latitude": 42.105751, @@ -4208,7 +4208,7 @@ ] }, { - "id": "1541", + "id": "BCT_1541", "name": "Beethoven/Seminary", "description": "The stop is located on a telephone pole before Seminary Ave across from Recreation Park Binghamton", "latitude": 42.097633, @@ -4222,7 +4222,7 @@ ] }, { - "id": "1542", + "id": "BCT_1542", "name": "Schubert/Crary", "description": "The stop is located on a sign post at the corner before Crary Ave at a private residence Binghamton", "latitude": 42.106289, @@ -4236,7 +4236,7 @@ ] }, { - "id": "1543", + "id": "BCT_1543", "name": "Beethoven/Leroy", "description": "The stop is located on a telephone pole about 50 feet before Leroy St at a private residence Binghamton", "latitude": 42.0955895353997, @@ -4250,7 +4250,7 @@ ] }, { - "id": "1544", + "id": "BCT_1544", "name": "Schubert/West End", "description": "The stop is located on a sign post at the corner before West End Ave at a private residence Binghamton", "latitude": 42.106159, @@ -4264,7 +4264,7 @@ ] }, { - "id": "1545", + "id": "BCT_1545", "name": "Leroy/Laurel", "description": "The stop is on a sign post located at the corner before Laurel Ave at a private residence Binghamton", "latitude": 42.095478, @@ -4278,7 +4278,7 @@ ] }, { - "id": "1546", + "id": "BCT_1546", "name": "Division/Cleveland", "description": "The stop is located at on a sign post at the corner before Cleveland Ave at a private residence Binghamton", "latitude": 42.1058319064041, @@ -4292,7 +4292,7 @@ ] }, { - "id": "1547", + "id": "BCT_1547", "name": "Leroy/Millard", "description": "The stop is located on a sign post at the corner before Milard Ave at a private residence Binghamton", "latitude": 42.095566, @@ -4306,7 +4306,7 @@ ] }, { - "id": "1548", + "id": "BCT_1548", "name": "Division/Burbank", "description": "The stop is located on a sign post about 20 before Burbank by a private residence Binghamton", "latitude": 42.1057169072941, @@ -4320,7 +4320,7 @@ ] }, { - "id": "1549", + "id": "BCT_1549", "name": "Leroy/Chestnut", "description": "The stop is located on a sign post at the corner before Chestnut St near Cananaugh's Deli Binghamton", "latitude": 42.0956756212701, @@ -4334,7 +4334,7 @@ ] }, { - "id": "1550", + "id": "BCT_1550", "name": "Burbank/Floral", "description": "The stop is located on a sign post at the corner before Burbank Ave across from the Tub Laundromat Binghamton", "latitude": 42.108459, @@ -4348,7 +4348,7 @@ ] }, { - "id": "1551", + "id": "BCT_1551", "name": "Leroy/Chapin", "description": "The stop is located on a sign post at the corner before Chapin St at a private residence Binghamton", "latitude": 42.095589, @@ -4362,7 +4362,7 @@ ] }, { - "id": "1552", + "id": "BCT_1552", "name": "Floral/Willow", "description": "The stop is located on a sign post about 30 feet before Willow St at a private residence Johnson City", "latitude": 42.108303, @@ -4380,7 +4380,7 @@ ] }, { - "id": "1553", + "id": "BCT_1553", "name": "Leroy/Oak", "description": "The stop is located on a sign post about 20 feet before Oak St near St Patrick's Church Binghamton", "latitude": 42.095383, @@ -4394,7 +4394,7 @@ ] }, { - "id": "1554", + "id": "BCT_1554", "name": "Floral/Roberts", "description": "The stop is located on a sign post at the corner before Roberts St at a private residence Johnson City.", "latitude": 42.108044, @@ -4412,7 +4412,7 @@ ] }, { - "id": "1555", + "id": "BCT_1555", "name": "Front/Leroy", "description": "The stop is located at the corner before Front St across from the M&T Bank Binghamton", "latitude": 42.094913, @@ -4426,7 +4426,7 @@ ] }, { - "id": "1556", + "id": "BCT_1556", "name": "Floral/Harrison", "description": "The stop is located on a sign post about 10 feet before Harrison St across from Floral Park Johnson City.", "latitude": 42.107761, @@ -4444,7 +4444,7 @@ ] }, { - "id": "1557", + "id": "BCT_1557", "name": "Washington/Stuart", "description": "The stop is located on a sign post at the corner before Stuart St near the Veterans Memorial Arena", "latitude": 42.096001, @@ -4458,7 +4458,7 @@ ] }, { - "id": "1558", + "id": "BCT_1558", "name": "Floral/Charles", "description": "The stop is located on a telephone pole about 100 feet before Saint Charles St near Adrianno's Pizza Johnson City", "latitude": 42.107513, @@ -4476,7 +4476,7 @@ ] }, { - "id": "1559", + "id": "BCT_1559", "name": "Hawley/Court", "description": "The stop is located at the corner before Court St near the CVS Parking Lot Binghamton", "latitude": 42.098282, @@ -4490,7 +4490,7 @@ ] }, { - "id": "1560", + "id": "BCT_1560", "name": "Floral/Cook", "description": "The stop is located on a sign post at the corner before Cook St at a private residence Johnson City.", "latitude": 42.107136, @@ -4508,7 +4508,7 @@ ] }, { - "id": "1562", + "id": "BCT_1562", "name": "Vestal/Old Lane", "description": "The stop is located on telephone pole about 150 feet after Old Lane Rd near the Karni Griffin Spa Vestal", "latitude": 42.09771, @@ -4524,7 +4524,7 @@ ] }, { - "id": "1564", + "id": "BCT_1564", "name": "Bunn Hill/NY434W Southbound", "description": "The stop is located an telephone pole about 100 feet before NY 434W near Monroe Muffler Vestal", "latitude": 42.096249, @@ -4540,7 +4540,7 @@ ] }, { - "id": "1566", + "id": "BCT_1566", "name": "Bunn Hill/NY 434E Southbound", "description": "The stop is located on a sign post after NY 434 E between Denny's and Portobello Square Vestal", "latitude": 42.095005, @@ -4560,7 +4560,7 @@ ] }, { - "id": "1701", + "id": "BCT_1701", "name": "Brocton/Lester", "description": "The stop is located after Lester Ave at a private residence in Johnson City", "latitude": 42.1187481145106, @@ -4574,7 +4574,7 @@ ] }, { - "id": "1702", + "id": "BCT_1702", "name": "Floral/Cleveland", "description": "The stop is located on a sign post about 20 feet after Cleveland Ave near an apartment complex Binghamton", "latitude": 42.109025, @@ -4588,7 +4588,7 @@ ] }, { - "id": "1703", + "id": "BCT_1703", "name": "Brocton/Concord", "description": "The stop is located before Concord St at a private residence in Johnson City", "latitude": 42.118759, @@ -4602,7 +4602,7 @@ ] }, { - "id": "1704", + "id": "BCT_1704", "name": "Floral/West End Ave", "description": "The stop is located on a sign post at the corner before West End Ave near the Kwik Fill Binghamton", "latitude": 42.109641, @@ -4616,7 +4616,7 @@ ] }, { - "id": "1705", + "id": "BCT_1705", "name": "Brocton/Diment", "description": "The stop is located after Diment St near the Johnson City Senior Center in Johnson City", "latitude": 42.118485, @@ -4630,7 +4630,7 @@ ] }, { - "id": "1706", + "id": "BCT_1706", "name": "Floral/Main", "description": "The stop is located on a sign post about 25 feet before Main St across from the Presbyterian Church Binghamton", "latitude": 42.111041, @@ -4644,7 +4644,7 @@ ] }, { - "id": "1707", + "id": "BCT_1707", "name": "N Arch/Main", "description": "The stop is located before N Arch St at a private residence in Johnson City", "latitude": 42.116358, @@ -4658,7 +4658,7 @@ ] }, { - "id": "1708", + "id": "BCT_1708", "name": "Brocton/Diment", "description": "The stop is located before Diment St across from the Johnson City Senior Center in Johnson City", "latitude": 42.1183879259153, @@ -4672,7 +4672,7 @@ ] }, { - "id": "1710", + "id": "BCT_1710", "name": "Brocton/Lester", "description": "The stop is located before Lester Ave at a private residence in Johnson City", "latitude": 42.1186558966307, @@ -4686,7 +4686,7 @@ ] }, { - "id": "1711", + "id": "BCT_1711", "name": "Floral/Main", "description": "The stop is located on a telephone pole about 150 after Main St near the Johnson City Presbyterian Church Binghamton", "latitude": 42.110809, @@ -4702,7 +4702,7 @@ ] }, { - "id": "1712", + "id": "BCT_1712", "name": "Pavillion/Gannett", "description": "The stop is located at the corner before Gannett Dr near the Visions Credit Union Johnson City", "latitude": 42.116631, @@ -4716,7 +4716,7 @@ ] }, { - "id": "1713", + "id": "BCT_1713", "name": "Floral/West End Ave", "description": "The stop is located on a telephone pole after West End Ave across from Kwik Fill Binghamton", "latitude": 42.109694, @@ -4732,7 +4732,7 @@ ] }, { - "id": "1715", + "id": "BCT_1715", "name": "Floral/Cleveland", "description": "The stop is located on a telephone across from Cleveland Ave near an apartment complex Binghamton", "latitude": 42.109098, @@ -4748,7 +4748,7 @@ ] }, { - "id": "1717", + "id": "BCT_1717", "name": "Floral/Burbank", "description": "The stop is located at the corner before Burbank Ave near the Washtub Laundromat Johnson City", "latitude": 42.108622, @@ -4764,7 +4764,7 @@ ] }, { - "id": "1798", + "id": "BCT_1798", "name": "Johnson City High School", "description": "The stop is located in front of the Johnson City High School", "latitude": 42.134555, @@ -4778,7 +4778,7 @@ ] }, { - "id": "1799", + "id": "BCT_1799", "name": "Johnson City Middle School", "description": "The stop is located in front of the Johnson City Middle School", "latitude": 42.135848, @@ -4792,7 +4792,7 @@ ] }, { - "id": "2301", + "id": "BCT_2301", "name": "Riverside/Banks", "description": "The stop is located on a sign post at the corner after Banks Ave at a private residence Johnson City", "latitude": 42.10492, @@ -4806,7 +4806,7 @@ ] }, { - "id": "2303", + "id": "BCT_2303", "name": "Riverside/Riale", "description": "The stop is located on a sign post at the corner before Riale Ave at a private residence Johnson City", "latitude": 42.103599, @@ -4820,7 +4820,7 @@ ] }, { - "id": "2305", + "id": "BCT_2305", "name": "Riverside/Davis College", "description": "The stop is located on a telephone at the corner before the entrance to Davis College Johnson City", "latitude": 42.101691, @@ -4834,7 +4834,7 @@ ] }, { - "id": "2306", + "id": "BCT_2306", "name": "Washington/Susquehanna", "description": "The stop is located on a sign post across from Susquehanna St in front of the BU Downtown Center Binghamton. A bus shelter is here.", "latitude": 42.095662, @@ -4848,7 +4848,7 @@ ] }, { - "id": "2307", + "id": "BCT_2307", "name": "Riverside/Elfred", "description": "The stop is located on a telephone pole after the entrance to the Susquahanna Nursing Facility Johnson City", "latitude": 42.100243, @@ -4862,7 +4862,7 @@ ] }, { - "id": "2308", + "id": "BCT_2308", "name": "Riverside/Oak", "description": "The stop is located on a sign post 10 feet before Oak St near the Young & Young Law Office Binghamton", "latitude": 42.092733, @@ -4876,7 +4876,7 @@ ] }, { - "id": "2309", + "id": "BCT_2309", "name": "Riverside/Ackley", "description": "The stop is located on a telephone pole across from Ackely Ave near a private residence Johnson City", "latitude": 42.099617, @@ -4890,7 +4890,7 @@ ] }, { - "id": "2310", + "id": "BCT_2310", "name": "Riverside/St John Ave", "description": "The stop is located on a telephone pole at the corner before St John Ave near the Broome Day Services Binghamton", "latitude": 42.092383, @@ -4904,7 +4904,7 @@ ] }, { - "id": "2311", + "id": "BCT_2311", "name": "Riverside/Columbus", "description": "The stop is located on a sign post about 75 after Columbus Pl across from Hatala Orthodontics Johsnon City", "latitude": 42.099302, @@ -4918,7 +4918,7 @@ ] }, { - "id": "2312", + "id": "BCT_2312", "name": "Riverside/Millard", "description": "The stop is located on a telephone pole at the corner before Millard Ave at a private residence Binghamton", "latitude": 42.092247, @@ -4932,7 +4932,7 @@ ] }, { - "id": "2313", + "id": "BCT_2313", "name": "Riverside/Burbank", "description": "The stop is located on sign about 100 feet after Burbank Ave across from Acousticon Hearing Johnson City", "latitude": 42.098758, @@ -4946,7 +4946,7 @@ ] }, { - "id": "2314", + "id": "BCT_2314", "name": "Riverside/Laurel", "description": "The stop is located on a sign post about 20 feet before Laurel Ave at a private residence Binghamton", "latitude": 42.092196, @@ -4960,7 +4960,7 @@ ] }, { - "id": "2315", + "id": "BCT_2315", "name": "Riverside/Margaret", "description": "The stop is located on a sign post across from Margaret St near the entrance to St Patrick's Cemetary Johnson City", "latitude": 42.09806, @@ -4974,7 +4974,7 @@ ] }, { - "id": "2316", + "id": "BCT_2316", "name": "Riverside/Avon", "description": "The stop is located on a sign post about 100 feet after Avon Rd in front of the Lourdes Footcare Center Binghamton", "latitude": 42.0921287006103, @@ -4988,7 +4988,7 @@ ] }, { - "id": "2317", + "id": "BCT_2317", "name": "Riverside/West End", "description": "The stop is located on a telephone pole about 25 feet after West End Ave at a private residence Binghamton", "latitude": 42.096538, @@ -5002,7 +5002,7 @@ ] }, { - "id": "2318", + "id": "BCT_2318", "name": "Lourdes Hospital (Riverside/Beethoven)", "description": "The stop is located about 75 feet after Beethoven St across from Lourdes Hospital Binghamton", "latitude": 42.092569, @@ -5016,7 +5016,7 @@ ] }, { - "id": "2319", + "id": "BCT_2319", "name": "Riverside/Crary", "description": "The stop is located on a sign post across from Crary Ave at a private residence Binghamton", "latitude": 42.095662, @@ -5030,7 +5030,7 @@ ] }, { - "id": "2320", + "id": "BCT_2320", "name": "Riverside/Helen", "description": "The stop is located on a telephone pole at the corner before Helen St at a private residence Binghamton", "latitude": 42.093917, @@ -5044,7 +5044,7 @@ ] }, { - "id": "2321", + "id": "BCT_2321", "name": "Riverside/Matthews", "description": "The stop is located on a sign post across from Matthews St at a private residence Binghamton", "latitude": 42.09484, @@ -5058,7 +5058,7 @@ ] }, { - "id": "2322", + "id": "BCT_2322", "name": "Riverside/Crary", "description": "The stop is located on a sign post at the corner before Crary Ave at a private residence Binghamton", "latitude": 42.095691, @@ -5072,7 +5072,7 @@ ] }, { - "id": "2323", + "id": "BCT_2323", "name": "Lourdes Hospital (Riverside/Rotary)", "description": "The stop is located about 100 feet before Rotary Ave in front of Lourdes Hospital Binghamton. A bus shelter is here.", "latitude": 42.092744, @@ -5088,7 +5088,7 @@ ] }, { - "id": "2324", + "id": "BCT_2324", "name": "Riverside/Westend", "description": "The stop is located on a telephone pole about 10 feet before West End Ave at a private residence Binghamton", "latitude": 42.096615, @@ -5102,7 +5102,7 @@ ] }, { - "id": "2325", + "id": "BCT_2325", "name": "Riverside/Stratford", "description": "The stop is located on a sign post about 25 feet before Stratford Pl at a private residence Binghamton.", "latitude": 42.092146, @@ -5116,7 +5116,7 @@ ] }, { - "id": "2325.1", + "id": "BCT_2325.1", "name": "Riverside/Laurel", "description": "The stop is located on sign post before Laurel Ave- Binghamton", "latitude": 42.092059, @@ -5130,7 +5130,7 @@ ] }, { - "id": "2326", + "id": "BCT_2326", "name": "Riverside/Patricia", "description": "The stop is located on a telephone pole at the corner before Patricia St at a private residence Binghamton", "latitude": 42.097547, @@ -5144,7 +5144,7 @@ ] }, { - "id": "2327", + "id": "BCT_2327", "name": "Riverside/Campbell", "description": "The stop is located on a telephone pole at the corner before Campbell Rd at a private residence Binghamton", "latitude": 42.092152, @@ -5158,7 +5158,7 @@ ] }, { - "id": "2328", + "id": "BCT_2328", "name": "Riverside/Margaret", "description": "The stop is located on a sign post at the corner before Margaret St near Dr Jeffrey King's Medical Office Johnson City.", "latitude": 42.098142, @@ -5172,7 +5172,7 @@ ] }, { - "id": "2329", + "id": "BCT_2329", "name": "Riverside/Oak", "description": "The stop is located on on telehphone pole at the corner before Oak St near the Gottlieb Law Offices Binghamton", "latitude": 42.092576, @@ -5186,7 +5186,7 @@ ] }, { - "id": "2330", + "id": "BCT_2330", "name": "Riverside/Burbank", "description": "The stop is located on a telephone pole about 100 feet before Burbank Ave near Acoustican Hearing Johnson City", "latitude": 42.098847, @@ -5200,7 +5200,7 @@ ] }, { - "id": "2332", + "id": "BCT_2332", "name": "Riverside/Columbus", "description": "The stop is located on a sign post at the corner before Columbus Pl by Hatala Orthodontics Johnson City", "latitude": 42.099471, @@ -5214,7 +5214,7 @@ ] }, { - "id": "2334", + "id": "BCT_2334", "name": "Riverside/Ackley", "description": "The stop is located on a sign post at the corner before Ackely Ave at a private residence Johnson City", "latitude": 42.099686, @@ -5228,7 +5228,7 @@ ] }, { - "id": "2336", + "id": "BCT_2336", "name": "Riverside/Elfred", "description": "The stop is located on a sign post at the corner before Elfred St near Downton Denistry Johnson City", "latitude": 42.10056, @@ -5242,7 +5242,7 @@ ] }, { - "id": "2338", + "id": "BCT_2338", "name": "Riverside/Ethel", "description": "The stop is located on a sign post at the corner before Ethel St at a private residence Johnson City", "latitude": 42.102239, @@ -5256,7 +5256,7 @@ ] }, { - "id": "2340", + "id": "BCT_2340", "name": "Riverside/Brewster", "description": "The stop is located on a telephone pole at the corner before Brewster St near Apple Foods Johnson City", "latitude": 42.103299, @@ -5270,7 +5270,7 @@ ] }, { - "id": "2342", + "id": "BCT_2342", "name": "Riverside/Banks", "description": "The stop is located on a sign post across from Banks St at a private residence Johnson City", "latitude": 42.104993, @@ -5284,7 +5284,7 @@ ] }, { - "id": "2344", + "id": "BCT_2344", "name": "UHS Vestal Inbound", "description": "The flag stop is located by the UHS Primary Care Walk in 4417 Vestal Pkwy.", "latitude": 42.096363, @@ -5298,7 +5298,7 @@ ] }, { - "id": "2344.1", + "id": "BCT_2344.1", "name": "UHS Vestal Outbound", "description": "The flag stop is located by the UHS Primary Care Walk in 4417 Vestal Pkwy", "latitude": 42.096294, @@ -5312,7 +5312,7 @@ ] }, { - "id": "2801", + "id": "BCT_2801", "name": "Robinson/Century", "description": "The stop is located on a street lamp pole about 100 feet after Century Dr Binghamton", "latitude": 42.107761, @@ -5326,7 +5326,7 @@ ] }, { - "id": "2801.1", + "id": "BCT_2801.1", "name": "Children's Home GBHC - 28", "description": "", "latitude": 42.103911, @@ -5340,7 +5340,7 @@ ] }, { - "id": "2802", + "id": "BCT_2802", "name": "BC Junction 28 Robinson St", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 1 Dock A", "latitude": 42.100982, @@ -5354,7 +5354,7 @@ ] }, { - "id": "2803", + "id": "BCT_2803", "name": "Robinson/GBHC", "description": "The stop is located at the exit of the GBHC Binghamton A bus shelter is here", "latitude": 42.10918, @@ -5368,7 +5368,7 @@ ] }, { - "id": "2803.1", + "id": "BCT_2803.1", "name": "Century/Court", "description": "", "latitude": 42.104089, @@ -5382,7 +5382,7 @@ ] }, { - "id": "2804", + "id": "BCT_2804", "name": "Chenango/Eldredge", "description": "The stop is located on a sign post about 100 feet after Eldredge St near Kendrick Tattoo Binghamton", "latitude": 42.105488, @@ -5396,7 +5396,7 @@ ] }, { - "id": "2805", + "id": "BCT_2805", "name": "Robinson/Garden", "description": "The stop is located on sign post after and across from Garden St at a private residence Binghamton", "latitude": 42.109016, @@ -5410,7 +5410,7 @@ ] }, { - "id": "2805.1", + "id": "BCT_2805.1", "name": "Court/Fairview", "description": "", "latitude": 42.104569, @@ -5424,7 +5424,7 @@ ] }, { - "id": "2806", + "id": "BCT_2806", "name": "Chenango/Robinson", "description": "The stop is located on a sign post about 50 feet before Robinson St across from Labor Ready Binghamton", "latitude": 42.107059, @@ -5438,7 +5438,7 @@ ] }, { - "id": "2807", + "id": "BCT_2807", "name": "Robinson/English", "description": "The stop is located on a sign post across from English St at a private residence Binghamton", "latitude": 42.108871, @@ -5452,7 +5452,7 @@ ] }, { - "id": "2807.1", + "id": "BCT_2807.1", "name": "Court/Bigelow", "description": "", "latitude": 42.104541, @@ -5466,7 +5466,7 @@ ] }, { - "id": "2808", + "id": "BCT_2808", "name": "Robinson/Emmett", "description": "The stop is located on a sign post at the corner before Emmett St at a private residence Binghamton", "latitude": 42.106998, @@ -5480,7 +5480,7 @@ ] }, { - "id": "2809", + "id": "BCT_2809", "name": "Robinson/Rubin", "description": "The stop is located on a sign post after the crosswalk with Rubin Ave near the Fairview Park Ball Field Binghamton.", "latitude": 42.108715, @@ -5494,7 +5494,7 @@ ] }, { - "id": "2809.1", + "id": "BCT_2809.1", "name": "Court/Ely", "description": "", "latitude": 42.104271, @@ -5508,7 +5508,7 @@ ] }, { - "id": "2810", + "id": "BCT_2810", "name": "Robinson/Wales", "description": "The stop is located on a telephone pole at the corner before Wales Ave near the Rte 363 overpass Binghamton", "latitude": 42.10685, @@ -5522,7 +5522,7 @@ ] }, { - "id": "2811", + "id": "BCT_2811", "name": "Robinson/Fairview", "description": "The stop is located before Faiview Ave near the Fairview Park Parking Lot Binghamton. A bus shelter is here.", "latitude": 42.108601, @@ -5536,7 +5536,7 @@ ] }, { - "id": "2811.1", + "id": "BCT_2811.1", "name": "Griswold/Silver", "description": "", "latitude": 42.105131, @@ -5550,7 +5550,7 @@ ] }, { - "id": "2812", + "id": "BCT_2812", "name": "Robinson/Whitney", "description": "The stop is located about 50 feet before Whitney Ave before Gallagher's Pub Binghamton", "latitude": 42.107029, @@ -5564,7 +5564,7 @@ ] }, { - "id": "2813", + "id": "BCT_2813", "name": "Robinson/Glen", "description": "The stop is located on a sign post before Glen Ave near Calvin Coolidge School Binghamton.", "latitude": 42.108391, @@ -5578,7 +5578,7 @@ ] }, { - "id": "2814", + "id": "BCT_2814", "name": "Robinson/Griswold", "description": "The stop is located on a telephone pole at the corner before Griswold St near East End Appliances Binghamton", "latitude": 42.107273, @@ -5592,7 +5592,7 @@ ] }, { - "id": "2815", + "id": "BCT_2815", "name": "Robinson/Bigelow", "description": "The stop is located on a sign post before Bigelow St near the Coolidge School crosswalk sign Binghamton", "latitude": 42.108212, @@ -5606,7 +5606,7 @@ ] }, { - "id": "2816", + "id": "BCT_2816", "name": "Robinson/Ely", "description": "The stop is located on a sign post after Ely St and before the entrance to Weis Binghamton", "latitude": 42.107445, @@ -5620,7 +5620,7 @@ ] }, { - "id": "2817", + "id": "BCT_2817", "name": "Robinson/Howard", "description": "The stop is located on a sign post about 75 feet after Howard Ave Binghamton", "latitude": 42.107899, @@ -5634,7 +5634,7 @@ ] }, { - "id": "2818", + "id": "BCT_2818", "name": "Broad/George", "description": "The stop is located on a telephone pole before George St at a private residence Binghamton", "latitude": 42.109406, @@ -5648,7 +5648,7 @@ ] }, { - "id": "2819", + "id": "BCT_2819", "name": "Robinson/Broad", "description": "The stop is located on a sign post before the entrance with KFC about 100 feet before Broad Ave Binghamton.", "latitude": 42.107685, @@ -5662,7 +5662,7 @@ ] }, { - "id": "2820", + "id": "BCT_2820", "name": "Broad/E Frederick", "description": "The stop is located on a sign post about 25 feet before E Fredrick St across from Stockholm Barbershop Binghamton", "latitude": 42.111259, @@ -5676,7 +5676,7 @@ ] }, { - "id": "2821", + "id": "BCT_2821", "name": "Robinson/Ely", "description": "The stop is located on a sign post at the corner before Ely St near the M&T Bank Binghamton", "latitude": 42.107555, @@ -5690,7 +5690,7 @@ ] }, { - "id": "2822", + "id": "BCT_2822", "name": "Broad/Grant", "description": "The stop is located on a telephone pole after Grant St between the two entrances of Manley's Might Mart Binghamton", "latitude": 42.112644, @@ -5704,7 +5704,7 @@ ] }, { - "id": "2823", + "id": "BCT_2823", "name": "Robinson/Griswold", "description": "The stop is located on a sign post about 275 feet after Griswold St- across from Alice St Binghamton", "latitude": 42.107319, @@ -5718,7 +5718,7 @@ ] }, { - "id": "2824", + "id": "BCT_2824", "name": "Broad/Hill", "description": "The stop is located on a telephone pole after the I86 off ramp about 75 feet before Hill St across from Agway Binghamton", "latitude": 42.115826, @@ -5732,7 +5732,7 @@ ] }, { - "id": "2825", + "id": "BCT_2825", "name": "Robinson/Whitney", "description": "The stop is located on a sign post at the corner before Whitney Ave just after the railroad bridge Binghamton", "latitude": 42.107151, @@ -5746,7 +5746,7 @@ ] }, { - "id": "2826", + "id": "BCT_2826", "name": "Spellicy/Moeller-One", "description": "The stop is located on a telephone pole after Moeller St near Carlisle Apts Community Center Binghamton", "latitude": 42.116146, @@ -5760,7 +5760,7 @@ ] }, { - "id": "2827", + "id": "BCT_2827", "name": "Robinson/Liberty", "description": "The stop is located on a sign post at the corner before Liberty St just after the NY 363 overpass Binghamton", "latitude": 42.106979, @@ -5774,7 +5774,7 @@ ] }, { - "id": "2828", + "id": "BCT_2828", "name": "Spellicy/Flower", "description": "The stop is located on a sign post before Flower St near Carlise Apts Bldg 17 Binghamton", "latitude": 42.1167338293255, @@ -5788,7 +5788,7 @@ ] }, { - "id": "2829", + "id": "BCT_2829", "name": "Robinson/Emmet", "description": "The stop is located on a sign post across from Emmett St at a private residence Binghamton", "latitude": 42.107063, @@ -5802,7 +5802,7 @@ ] }, { - "id": "2830", + "id": "BCT_2830", "name": "Spellicy/Leon", "description": "The stop is located on a sign post before Leon Ave near Carlise Apts Bldg 19 Binghamton", "latitude": 42.117821, @@ -5816,7 +5816,7 @@ ] }, { - "id": "2831", + "id": "BCT_2831", "name": "Chenango/Robinson", "description": "The stop is located on sign post after Robinson St near Wilson Dental Binghamton", "latitude": 42.107002, @@ -5832,7 +5832,7 @@ ] }, { - "id": "2832", + "id": "BCT_2832", "name": "Spellicy/Moeller-Two", "description": "The stop is located on a telephone pole at the corner before Moeller St near Carlisle Apts Bldg 4 Binghamton", "latitude": 42.117706, @@ -5846,7 +5846,7 @@ ] }, { - "id": "2833", + "id": "BCT_2833", "name": "Chenango/Eldridge", "description": "The stop is located on a sign post about 75 feet after Eldredge St across from VAR electronics Binghamton", "latitude": 42.104912, @@ -5862,7 +5862,7 @@ ] }, { - "id": "2834", + "id": "BCT_2834", "name": "Moeller/Bevier", "description": "The stop is located on a sign post at the corner before Bevier St near Gates Fabrication Binghamton", "latitude": 42.119286, @@ -5876,7 +5876,7 @@ ] }, { - "id": "2836", + "id": "BCT_2836", "name": "Bevier/Broad", "description": "The stop is located at the intersection of Bevier St and Broad st on sign for the Binghamton Alumni Stadium Binghamton", "latitude": 42.119358, @@ -5890,7 +5890,7 @@ ] }, { - "id": "2838", + "id": "BCT_2838", "name": "Broad/Spellicy", "description": "The stop is located on a sign post across from Spellicy Blvd after the entrance to Agway Binghamton", "latitude": 42.117508, @@ -5904,7 +5904,7 @@ ] }, { - "id": "2844", + "id": "BCT_2844", "name": "Broad/E Frederick", "description": "The stop is located on a sign post about 20 feet before E Frederick near Stockholm Barbershop Binghamton", "latitude": 42.111576, @@ -5918,7 +5918,7 @@ ] }, { - "id": "2846", + "id": "BCT_2846", "name": "Broad/William", "description": "The stop is located on a sign post by the Mental Health Association of the Southern Tier. A bus shelter is here.", "latitude": 42.108682, @@ -5932,7 +5932,7 @@ ] }, { - "id": "2848", + "id": "BCT_2848", "name": "Robinson/Moeller", "description": "The stop is located on a sign post about 75 feet after Moeller St between the exits of the K&P One Stop Binghamton", "latitude": 42.107727, @@ -5946,7 +5946,7 @@ ] }, { - "id": "2850", + "id": "BCT_2850", "name": "Robinson/Mason", "description": "The stop is located on a sign post at the corner before Mason Ave by the Cameo Theater Binghamton", "latitude": 42.107887, @@ -5960,7 +5960,7 @@ ] }, { - "id": "2852", + "id": "BCT_2852", "name": "Robinson/Bigelow", "description": "The stop is located on a sign post about 15 feet before Bigelow St near the Fairview United Methodist Church Binghamton", "latitude": 42.108063, @@ -5974,7 +5974,7 @@ ] }, { - "id": "2854", + "id": "BCT_2854", "name": "Robinson/Milford", "description": "The stop is located on a sign post at the corner before Milford St by the United Church of Christ Binghamton", "latitude": 42.108337, @@ -5988,7 +5988,7 @@ ] }, { - "id": "2856", + "id": "BCT_2856", "name": "Robinson/Fairview", "description": "The stop is located on a sign post at the corner before Fairview Ave at a private residence Binghamton", "latitude": 42.108456, @@ -6002,7 +6002,7 @@ ] }, { - "id": "2858", + "id": "BCT_2858", "name": "Robinson/Rubin", "description": "The stop is located a sign post at the corner after Rubin Ave across from Fairview Park Binghamton", "latitude": 42.108646, @@ -6016,7 +6016,7 @@ ] }, { - "id": "2860", + "id": "BCT_2860", "name": "Robinson/English", "description": "The stop is located on a sign post at the corner before English St at a private residence Binghamton", "latitude": 42.108757, @@ -6030,7 +6030,7 @@ ] }, { - "id": "2862", + "id": "BCT_2862", "name": "Robinson/Garden", "description": "The stop is located on a telephone pole at the corner before Garden St at a private residence Binghamton", "latitude": 42.108936, @@ -6044,7 +6044,7 @@ ] }, { - "id": "2864", + "id": "BCT_2864", "name": "Robinson/GBHC Entrance", "description": "The stop is located on a telephone pole at the entrance to the GBHC Center Binghamton", "latitude": 42.109081, @@ -6058,7 +6058,7 @@ ] }, { - "id": "2866", + "id": "BCT_2866", "name": "Robinson/Century", "description": "The stop is located on the corner before Century Dr near the GBHC Center Binghamton", "latitude": 42.1074402919586, @@ -6072,7 +6072,7 @@ ] }, { - "id": "2868", + "id": "BCT_2868", "name": "GBHC/Garvin", "description": "The stop is located in front of the VA Clinic near the Garvin Bldg GBHC Binghamton", "latitude": 42.1057264285454, @@ -6086,7 +6086,7 @@ ] }, { - "id": "3500", + "id": "BCT_3500", "name": "BC Junction 35 Endicott Binghamton", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 12 Dock B", "latitude": 42.100995, @@ -6100,7 +6100,7 @@ ] }, { - "id": "3501", + "id": "BCT_3501", "name": "E. Perimeter Rd/Glendale Tech Park", "description": "The stop is located on a street lamp pole near the the NYS Department of Labor Endicott.", "latitude": 42.094946, @@ -6116,7 +6116,7 @@ ] }, { - "id": "3502", + "id": "BCT_3502", "name": "Court/Water", "description": "The stop is located on a sign post about 100 feet after Water St in front of Boscov's Binghamton", "latitude": 42.098837, @@ -6136,7 +6136,7 @@ ] }, { - "id": "3503", + "id": "BCT_3503", "name": "Glendale Tech Park/Perimeter Rd", "description": "The stop is located on a sign post near an office building at the Glendale Technology Park Endicott", "latitude": 42.093063, @@ -6152,7 +6152,7 @@ ] }, { - "id": "3504", + "id": "BCT_3504", "name": "Main/Front", "description": "The stop is located on a sign post about 125 feet after Front St by the 1st Congregational Church Binghamton", "latitude": 42.0989597654341, @@ -6170,7 +6170,7 @@ ] }, { - "id": "3505", + "id": "BCT_3505", "name": "Main /S. Grippen", "description": "The stop is located on a sign post near the crosswalk at the corner before Grippen Ave across from Our Lady of Good Council Church Endicott", "latitude": 42.0923446831768, @@ -6184,7 +6184,7 @@ ] }, { - "id": "3507", + "id": "BCT_3507", "name": "Main /Bassett", "description": "The stop is located on a sign post by the crosswalk before Bassett Ave at a private residence Endicott", "latitude": 42.092734, @@ -6198,7 +6198,7 @@ ] }, { - "id": "3508", + "id": "BCT_3508", "name": "Main/Chapin", "description": "The is located on a sign post about 130 feet before Chapin St by the CVS Binghamton. A bus shelter is here.", "latitude": 42.09967, @@ -6214,7 +6214,7 @@ ] }, { - "id": "3509", + "id": "BCT_3509", "name": "Main /Page", "description": "The stop is located across from S Page Ave Endicott. There is a bus shelter here.", "latitude": 42.09362, @@ -6228,7 +6228,7 @@ ] }, { - "id": "3510", + "id": "BCT_3510", "name": "Main/Mather", "description": "The stop is located on a telephone pole about 125 feet after Mather St by the Westside Mini-Mart Binghamton", "latitude": 42.100603, @@ -6244,7 +6244,7 @@ ] }, { - "id": "3511", + "id": "BCT_3511", "name": "Main/DeHart", "description": "The is stop is located at the corner before DeHart Ave. There is a bus shelter here.", "latitude": 42.094661, @@ -6258,7 +6258,7 @@ ] }, { - "id": "3512", + "id": "BCT_3512", "name": "Main/Crandall", "description": "The stop is located on a sign post at the corner before Crandall St by the Horizon's Credit Union Binghamton.", "latitude": 42.101586, @@ -6274,7 +6274,7 @@ ] }, { - "id": "3513", + "id": "BCT_3513", "name": "Main /Badger", "description": "The stop is located on a sign post about 75 feet after Badger Ave near Babcock Endicott", "latitude": 42.095069, @@ -6288,7 +6288,7 @@ ] }, { - "id": "3514", + "id": "BCT_3514", "name": "Main/Cedar", "description": "The stop is located on a sign post across from Cedar St by AudioMan Binghamton", "latitude": 42.102408, @@ -6304,7 +6304,7 @@ ] }, { - "id": "3515", + "id": "BCT_3515", "name": "Main /Liberty", "description": "The stop is located about 50 feet before Liberty St near the Rite Aid Endicott. There is a bus shelter here.", "latitude": 42.094997, @@ -6318,7 +6318,7 @@ ] }, { - "id": "3516", + "id": "BCT_3516", "name": "Main/Jarvis", "description": "The stop is located on a sign post about 175 feet after Jarvis St near Wendy's Binghamton", "latitude": 42.1032666713242, @@ -6334,7 +6334,7 @@ ] }, { - "id": "3517", + "id": "BCT_3517", "name": "Main /Mersereau", "description": "The is stop is located at the corner before Mersereau St near the Village West Apts. There is a bus shelter here.", "latitude": 42.094867, @@ -6348,7 +6348,7 @@ ] }, { - "id": "3518", + "id": "BCT_3518", "name": "Main/Schiller", "description": "The stop is located on a telephone pole about 185 feet after Hamilton St before the AutoZone Binghamton", "latitude": 42.105134, @@ -6364,7 +6364,7 @@ ] }, { - "id": "3519", + "id": "BCT_3519", "name": "Main /Vestal", "description": "The stop is located on a telephone pole about 75 feet after Vestal Ave across from the Hess Express Endicott", "latitude": 42.095098, @@ -6378,7 +6378,7 @@ ] }, { - "id": "3520", + "id": "BCT_3520", "name": "Main/Orton", "description": "The stop is located on a sign post across from Orton Ave in front of Catholic Charities Binghamton. A bus shelter is here.", "latitude": 42.106294, @@ -6394,7 +6394,7 @@ ] }, { - "id": "3521", + "id": "BCT_3521", "name": "Main /Booth", "description": "The stop is located on a telephone pole at the corner before Booth Ave by the BCT Credit Union Endicott", "latitude": 42.096599, @@ -6408,7 +6408,7 @@ ] }, { - "id": "3522", + "id": "BCT_3522", "name": "Main/Glenwood", "description": "The stop is located on a sign post about 135 feet after Glenwood Ave across from CVS Binghamton", "latitude": 42.1074222535089, @@ -6424,7 +6424,7 @@ ] }, { - "id": "3523", + "id": "BCT_3523", "name": "Main /Lincoln", "description": "The stop is located on a telephone pole about 15 feet before Lincoln Ave near the Union-Endicott Board of Education Endicott", "latitude": 42.097054, @@ -6438,7 +6438,7 @@ ] }, { - "id": "3524", + "id": "BCT_3524", "name": "Main/Crestmont", "description": "The stop is located on a sign post across from Crestmont Rd in front of Burger King Binghamton", "latitude": 42.108985, @@ -6454,7 +6454,7 @@ ] }, { - "id": "3525", + "id": "BCT_3525", "name": "Washington /Main", "description": "The stop is located on a sign post about 50 feet after Main St in front of Wendy's Endicott", "latitude": 42.099258, @@ -6470,7 +6470,7 @@ ] }, { - "id": "3526", + "id": "BCT_3526", "name": "Main/Crary", "description": "The stop is located on a sign post at the crosswalk across from Crary Ave near Cole Muffler Binghamton", "latitude": 42.10997, @@ -6486,7 +6486,7 @@ ] }, { - "id": "3527", + "id": "BCT_3527", "name": "Washington /Broad", "description": "The stop is located at the corner before Broad St near St Ambrose Church across from the Post Office Endicott", "latitude": 42.10051, @@ -6502,7 +6502,7 @@ ] }, { - "id": "3528", + "id": "BCT_3528", "name": "Main/Floral", "description": "The stop is located on a sign post after Floral Ave near the Johnson City Arch Johnson City", "latitude": 42.111462, @@ -6516,7 +6516,7 @@ ] }, { - "id": "3529", + "id": "BCT_3529", "name": "North/Garfield", "description": "The stop is located on a utility pole about 150 feet after Garfield Ave Endicott", "latitude": 42.104999, @@ -6530,7 +6530,7 @@ ] }, { - "id": "3530", + "id": "BCT_3530", "name": "Main/Lester", "description": "The stop is located on a street lamp pole about 160 feet before Lester Ave by Your Home Library Johnson City", "latitude": 42.11302, @@ -6546,7 +6546,7 @@ ] }, { - "id": "3531.1", + "id": "BCT_3531.1", "name": "North/Kentucky", "description": "The stop is located across from Gault Toyota Endicott", "latitude": 42.106552, @@ -6560,7 +6560,7 @@ ] }, { - "id": "3531.2", + "id": "BCT_3531.2", "name": "North/S. Willis", "description": "The stop is located near the Endwell Plaza", "latitude": 42.106596, @@ -6574,7 +6574,7 @@ ] }, { - "id": "3534", + "id": "BCT_3534", "name": "Main/Willow", "description": "The stop is located on a sign post at the corner before Avenue C by Blue Wireless Johnson City", "latitude": 42.114861, @@ -6590,7 +6590,7 @@ ] }, { - "id": "3535.1", + "id": "BCT_3535.1", "name": "Main/Jackson", "description": "The stop is located about 125 feet after Jackson Ave Endicott", "latitude": 42.10245, @@ -6604,7 +6604,7 @@ ] }, { - "id": "3536", + "id": "BCT_3536", "name": "Main/N Broad", "description": "The stop is located on a sign post about 100 feet after Broad St in front The Gold Mine Johnson City", "latitude": 42.115636, @@ -6620,7 +6620,7 @@ ] }, { - "id": "3537", + "id": "BCT_3537", "name": "Main/Maryland", "description": "The stop is located on a telephone pole before Maryland Ave across from the Laser Car Wash Endicott", "latitude": 42.103448, @@ -6634,7 +6634,7 @@ ] }, { - "id": "3538", + "id": "BCT_3538", "name": "Main/Harrison", "description": "The stop is located on a telephone pole between the Post Office and Walgreens Johnson City", "latitude": 42.115885, @@ -6648,7 +6648,7 @@ ] }, { - "id": "3539", + "id": "BCT_3539", "name": "Main/Louisianna", "description": "The stop is located on a sign post at the corner before Louisiana Ave across from Tony's Grill Endicott", "latitude": 42.103821, @@ -6662,7 +6662,7 @@ ] }, { - "id": "3540", + "id": "BCT_3540", "name": "Main/NY Penn", "description": "The stop is located on a telephone pole across from Allen St by the Southern Tier Spine and Medical Johnson City", "latitude": 42.115787, @@ -6676,7 +6676,7 @@ ] }, { - "id": "3541", + "id": "BCT_3541", "name": "Main/Frances", "description": "The stop is located on a sign post at the corner before Frances Ave across from AutoZone Endicott", "latitude": 42.105106, @@ -6690,7 +6690,7 @@ ] }, { - "id": "3543", + "id": "BCT_3543", "name": "Main/Marion", "description": "The stop is located on a telephone pole about 100 feet after Marion Ave across from Little Caeser's Pizza Endwell", "latitude": 42.105749, @@ -6704,7 +6704,7 @@ ] }, { - "id": "3544", + "id": "BCT_3544", "name": "Main/Third (old)", "description": "The stop is located on a sign post about 100 feet after 3rd St by UHS Primary Care Johnson City", "latitude": 42.115745, @@ -6718,7 +6718,7 @@ ] }, { - "id": "3545", + "id": "BCT_3545", "name": "Main/Chaumont", "description": "The stop is located on a sign post at the corner before Chaumont Dr by KFC Endwell", "latitude": 42.106235, @@ -6732,7 +6732,7 @@ ] }, { - "id": "3546", + "id": "BCT_3546", "name": "Main/Westover Plaza", "description": "The stop is located on a sign post by Aldi's Johnson City", "latitude": 42.115584, @@ -6746,7 +6746,7 @@ ] }, { - "id": "3547", + "id": "BCT_3547", "name": "Main/Shady", "description": "The stop is located on a sign post about 20 feet before Shady Dr near R&M Engine Repair Endwell", "latitude": 42.106425, @@ -6760,7 +6760,7 @@ ] }, { - "id": "3549", + "id": "BCT_3549", "name": "Main/Davis", "description": "The stop is located on a telephone pole about 200 feet after Davis Ave by Burger King Endwell", "latitude": 42.106541, @@ -6774,7 +6774,7 @@ ] }, { - "id": "3550", + "id": "BCT_3550", "name": "Main/Oakdale", "description": "The stop is located on a sign post at the corner before Oakdale Rd by the The Pharmacy Johnson City.", "latitude": 42.116169, @@ -6788,7 +6788,7 @@ ] }, { - "id": "3550.1", + "id": "BCT_3550.1", "name": "Main/Endwell", "description": "The stop is located by the Window Broker", "latitude": 42.116845, @@ -6802,7 +6802,7 @@ ] }, { - "id": "3551", + "id": "BCT_3551", "name": "Hooper/Prospect", "description": "The stop is located on a sign post about 20 feet Prospect St at a private residence Endwell", "latitude": 42.109913, @@ -6816,7 +6816,7 @@ ] }, { - "id": "3552", + "id": "BCT_3552", "name": "Oakdale/Endwell", "description": "The stop is located on a telephone pole at the corner before Endwell St near Murray Appraisel Johnson City", "latitude": 42.117505, @@ -6830,7 +6830,7 @@ ] }, { - "id": "3554", + "id": "BCT_3554", "name": "Oakdale/Azon", "description": "The stop is located on a sign post at the corner before Azon Rd near Klemmt Orthopaedic Johnson City", "latitude": 42.1194952707882, @@ -6844,7 +6844,7 @@ ] }, { - "id": "3555.1", + "id": "BCT_3555.1", "name": "Watson/Hill", "description": "The stop is located at the intersection before Hill Ave Endicott", "latitude": 42.109238, @@ -6858,7 +6858,7 @@ ] }, { - "id": "3556", + "id": "BCT_3556", "name": "Oakdale/Fields", "description": "The stop is located on a sign post about 20 feet after Field St across from Vingelis Lee Denistry Johnson City", "latitude": 42.1209828112102, @@ -6872,7 +6872,7 @@ ] }, { - "id": "3557", + "id": "BCT_3557", "name": "Watson/N. Adams", "description": "The stop is located on a telephone pole about 25 feet after N Adams Ave at a private residence Endicott", "latitude": 42.109407, @@ -6886,7 +6886,7 @@ ] }, { - "id": "3558", + "id": "BCT_3558", "name": "Oakdale/Evert", "description": "The stop is located about on a sign post 50 feet after Evert St across from Croteau's Transmission Johnson City", "latitude": 42.122662, @@ -6900,7 +6900,7 @@ ] }, { - "id": "3559", + "id": "BCT_3559", "name": "Watson/Hayes", "description": "The stop is located at the corner before Hayes Av on yellow crosswalk sign Endicott.", "latitude": 42.1095, @@ -6914,7 +6914,7 @@ ] }, { - "id": "3560", + "id": "BCT_3560", "name": "Oakdale/Harry L", "description": "The stop is located about on a sign post 150 feet before Harry L Drive between Hand Therapy and Hussar Insurance Johnson City", "latitude": 42.123657, @@ -6928,7 +6928,7 @@ ] }, { - "id": "3561", + "id": "BCT_3561", "name": "Watson/Taylor", "description": "The stop is located on a telephone pole about 100 feet after Taylor Ave at a private residence Endicott", "latitude": 42.1096, @@ -6942,7 +6942,7 @@ ] }, { - "id": "3562.2", + "id": "BCT_3562.2", "name": "Oakdale Commons/Oakdale Pizza", "description": "The stop is located by JC Penney", "latitude": 42.127732, @@ -6964,7 +6964,7 @@ ] }, { - "id": "3562.1", + "id": "BCT_3562.1", "name": "Career and Community Services Center", "description": "This stop is located on the buidling on the northwest side of the Oakdale Mall", "latitude": 42.129811, @@ -6986,7 +6986,7 @@ ] }, { - "id": "3562", + "id": "BCT_3562", "name": "Dave and Buster's", "description": "The stop is located by Dave and Buster's", "latitude": 42.129443, @@ -7008,7 +7008,7 @@ ] }, { - "id": "3563", + "id": "BCT_3563", "name": "Watson/Wilson", "description": "The stop is located across from Wilson Ave on a telephone pole by Baked Euphoria Endwell", "latitude": 42.109659, @@ -7022,7 +7022,7 @@ ] }, { - "id": "3564", + "id": "BCT_3564", "name": "Harry L/Oakdale", "description": "The stop is located on a sign post about 250 feet after Oakdale Rd in front of the Valero Might Mart Johnson City.", "latitude": 42.123795, @@ -7036,7 +7036,7 @@ ] }, { - "id": "3565", + "id": "BCT_3565", "name": "Watson/Seward", "description": "The stop is located at the corner before Seward Ave on a sign post near the theWatson Blvd Apts Endwell", "latitude": 42.110214, @@ -7050,7 +7050,7 @@ ] }, { - "id": "3566", + "id": "BCT_3566", "name": "Harry L/Valley Plaza", "description": "The stop is located on a telephone pole about 250 feet before Valley Plaza Dr across from Calvary Church Johnson City", "latitude": 42.12177, @@ -7064,7 +7064,7 @@ ] }, { - "id": "3567", + "id": "BCT_3567", "name": "N Willis/Watson", "description": "The stop is located about 100 feet afterWatson Blvd on a sign post at a private residence Endwell", "latitude": 42.110814, @@ -7078,7 +7078,7 @@ ] }, { - "id": "3568", + "id": "BCT_3568", "name": "Watson /Heritage Country Club 1", "description": "The stop is located on a sign post by the Traditions at the Glen Parking Lot across from Gates Doors and Blind Tiger Pub Johnson City", "latitude": 42.120134, @@ -7092,7 +7092,7 @@ ] }, { - "id": "3569", + "id": "BCT_3569", "name": "N Willis/King", "description": "The stop is located at the corner before King St on a sign post at a private residence Endwell", "latitude": 42.113452, @@ -7106,7 +7106,7 @@ ] }, { - "id": "3570", + "id": "BCT_3570", "name": "Watson /Heritage Country Club 2", "description": "The stop is located on a sign post before the entrance to the Traditions at the Glen Johnson City", "latitude": 42.120341, @@ -7120,7 +7120,7 @@ ] }, { - "id": "3571", + "id": "BCT_3571", "name": "Center St/Country Club", "description": "The stop is located on a telephone pole before Country Club Rd at a private residence Endwell", "latitude": 42.11553, @@ -7134,7 +7134,7 @@ ] }, { - "id": "3572", + "id": "BCT_3572", "name": "Watson /Poplar", "description": "The stop is located on a sign post at the corner before Poplar St across from Friedman Electric Binghamton", "latitude": 42.119088, @@ -7148,7 +7148,7 @@ ] }, { - "id": "3573", + "id": "BCT_3573", "name": "Country Club/Knightlee", "description": "The stop is located on a telephone pole about 20 feet before Knightlee Ave at a private residence Endwell", "latitude": 42.115741, @@ -7164,7 +7164,7 @@ ] }, { - "id": "3574", + "id": "BCT_3574", "name": "Watson /Country Club", "description": "The stop is located on a sign post about 100 feet before Country Club Rd Johnson City", "latitude": 42.11596, @@ -7178,7 +7178,7 @@ ] }, { - "id": "3575", + "id": "BCT_3575", "name": "Country Club/Beckwith", "description": "The stop is located on a telephone pole at the corner before Beckwith Ave at a private residence Endwell.", "latitude": 42.115945, @@ -7194,7 +7194,7 @@ ] }, { - "id": "3576", + "id": "BCT_3576", "name": "Watson /Groveland", "description": "The stop is located on a sign post about 75 feet after Groveland Ave by a private residence Endwell", "latitude": 42.112237, @@ -7208,7 +7208,7 @@ ] }, { - "id": "3577", + "id": "BCT_3577", "name": "Country Club/Norton", "description": "The stop is located on a sign post at the corner before Norton Ave at a private residence Endwell", "latitude": 42.116054, @@ -7224,7 +7224,7 @@ ] }, { - "id": "3578", + "id": "BCT_3578", "name": "Hooper/Mary", "description": "The stop is located on a sign post about 10 feet before Mary St at a private residence Endwell", "latitude": 42.109847, @@ -7238,7 +7238,7 @@ ] }, { - "id": "3579", + "id": "BCT_3579", "name": "Country Club/Doyleson", "description": "The stop is located on a telephone pole at the corner before Doyleson Ave across from Dunkin Donuts Endwell", "latitude": 42.11612, @@ -7254,7 +7254,7 @@ ] }, { - "id": "3580", + "id": "BCT_3580", "name": "Main /Brookside", "description": "The stop is located on a sign post about 160 feet after Brookside Ave before the exit to McDonald's Endwell", "latitude": 42.106708, @@ -7268,7 +7268,7 @@ ] }, { - "id": "3581", + "id": "BCT_3581", "name": "Hopper/Rath", "description": "The stop is located on a sign post across from Rath Ave by the Veterinary Medical Center.", "latitude": 42.113288, @@ -7282,7 +7282,7 @@ ] }, { - "id": "3582", + "id": "BCT_3582", "name": "Main /Avenue B", "description": "The stop is located on a sign post near Jay's One Stop in Endwell", "latitude": 42.106641, @@ -7296,7 +7296,7 @@ ] }, { - "id": "3583", + "id": "BCT_3583", "name": "Main/Endwell", "description": "The stop is located near the Johnson City YMCA", "latitude": 42.116738, @@ -7310,7 +7310,7 @@ ] }, { - "id": "3584", + "id": "BCT_3584", "name": "Main /S Kelly", "description": "The stop is located on a sign post about 10 feet before S Kelly Ave near Pullano Physical Therpay Endicott", "latitude": 42.106535, @@ -7324,7 +7324,7 @@ ] }, { - "id": "3585", + "id": "BCT_3585", "name": "Watson/Hooper", "description": "The stop is located about 25 feet after Hooper Rd by the Welcome to Endwell sign Endwell", "latitude": 42.1109354235885, @@ -7338,7 +7338,7 @@ ] }, { - "id": "3586", + "id": "BCT_3586", "name": "Main /Chaumont", "description": "The stop is located on a sign post about 70 feet before Chaumont Ave in front of the Town of Union Office Bldg Endicott", "latitude": 42.106408, @@ -7352,7 +7352,7 @@ ] }, { - "id": "3586.1", + "id": "BCT_3586.1", "name": "North/S Willis", "description": "The stop is located about 125 feet after S Willis Ave Endicott", "latitude": 42.106727, @@ -7366,7 +7366,7 @@ ] }, { - "id": "3586.2", + "id": "BCT_3586.2", "name": "North/Hayes", "description": "The stop is located at the corner before Gault Toyota", "latitude": 42.106635, @@ -7380,7 +7380,7 @@ ] }, { - "id": "3587", + "id": "BCT_3587", "name": "Watson/Valley", "description": "The stop is located on a sign post at the corner before Valley St at a priavte residence Endwell", "latitude": 42.111675, @@ -7394,7 +7394,7 @@ ] }, { - "id": "3588", + "id": "BCT_3588", "name": "Main /Marion", "description": "The stop is located on a sign post before Marion Ave by the entrance to A-Z Vacuum near Little Caeser's Pizza Endicott", "latitude": 42.105817, @@ -7408,7 +7408,7 @@ ] }, { - "id": "3589", + "id": "BCT_3589", "name": "Watson/Country Club", "description": "The stop is located on a sign post across from Country Club Rd Endwell", "latitude": 42.115818, @@ -7422,7 +7422,7 @@ ] }, { - "id": "3590", + "id": "BCT_3590", "name": "Main /Moore", "description": "The stop is located on a sign post at the corner before Moore Ave near the Autozone Endicott", "latitude": 42.105082, @@ -7436,7 +7436,7 @@ ] }, { - "id": "3591", + "id": "BCT_3591", "name": "Watson/Poplar", "description": "The stop is located on a sign post across from Poplar St by Friedman Electric Johnson City.", "latitude": 42.1189305729996, @@ -7450,7 +7450,7 @@ ] }, { - "id": "3592", + "id": "BCT_3592", "name": "Main /Nebraska", "description": "The stop is located on a telephone pole about 100 feet after Nebraska Ave near Tony's Grill Endicott", "latitude": 42.104142, @@ -7464,7 +7464,7 @@ ] }, { - "id": "3593", + "id": "BCT_3593", "name": "Watson/Wilkans Way", "description": "The stop is located on a sign post about 200 feet before Wilkans Way before the Blind Tiger Pub Johnson City", "latitude": 42.11996, @@ -7478,7 +7478,7 @@ ] }, { - "id": "3594", + "id": "BCT_3594", "name": "Main /Delaware", "description": "The stop is located on a telephone pole at the corner before Delaware Ave near the Laser Car Wash Endicott", "latitude": 42.103342, @@ -7492,7 +7492,7 @@ ] }, { - "id": "3595", + "id": "BCT_3595", "name": "Harry L/Valley Plaza", "description": "The stop is located on a sign post about 100 feet before Valley Plaza Dr near the Calvary Church Johnson City", "latitude": 42.121467, @@ -7506,7 +7506,7 @@ ] }, { - "id": "3596", + "id": "BCT_3596", "name": "Main /Jackson", "description": "The stop is located on a sign post on the corner before Jackson Ave near Broome County Central Foods Endicott", "latitude": 42.1025, @@ -7520,7 +7520,7 @@ ] }, { - "id": "3597", + "id": "BCT_3597", "name": "Harry L/Oakdale", "description": "The stop is located about 150 feet before Oakdale Rd by Monroe Muffler Johnson City", "latitude": 42.123412, @@ -7534,7 +7534,7 @@ ] }, { - "id": "3598", + "id": "BCT_3598", "name": "Main /Adams", "description": "The stop is located on a sign post about 10 feet before Adams Ave at a private residence Endicott", "latitude": 42.10162, @@ -7548,7 +7548,7 @@ ] }, { - "id": "3599", + "id": "BCT_3599", "name": "Oakdale/Evert", "description": "The stop is located on a sign post across from Evert St near Croteau's Transmission Johnson City", "latitude": 42.122413, @@ -7562,7 +7562,7 @@ ] }, { - "id": "3600", + "id": "BCT_3600", "name": "Roosevelt /Monroe", "description": "The stop is located on a sign post at the corner before Monroe St at a private residence Endicott", "latitude": 42.102661, @@ -7576,7 +7576,7 @@ ] }, { - "id": "3601", + "id": "BCT_3601", "name": "Oakdale/Valley Plaza", "description": "The stop is located on a sign post at the corner after Field St near the NY 17 overpass Johnson City", "latitude": 42.1206591112218, @@ -7590,7 +7590,7 @@ ] }, { - "id": "3602", + "id": "BCT_3602", "name": "Hooper /Hoover", "description": "The stop is located on a sign post about 100 feet before Hoover Ave at a private residence Endwell", "latitude": 42.111579, @@ -7604,7 +7604,7 @@ ] }, { - "id": "3603", + "id": "BCT_3603", "name": "Oakdale/Azon", "description": "The stop is located on a sign post across from Azon Rd near the former Visions Credit Union Johnson City", "latitude": 42.119536, @@ -7618,7 +7618,7 @@ ] }, { - "id": "3604", + "id": "BCT_3604", "name": "Hooper /Rath", "description": "The stop is located on a sign post at the corner before Rath Ave across from Vetrinary Medical Center Endwell", "latitude": 42.113266, @@ -7632,7 +7632,7 @@ ] }, { - "id": "3605", + "id": "BCT_3605", "name": "Oakdale/Endwell", "description": "The stop is located on a sign about 40 feet after Endwell St across from Jim Murray's Appraisal Service Johnson City", "latitude": 42.117459, @@ -7646,7 +7646,7 @@ ] }, { - "id": "3606", + "id": "BCT_3606", "name": "Country Club/Doyleson", "description": "The stop is located on a telephone pole across from Doyleson Ave near Dunkin Donuts Endwell", "latitude": 42.1162802602033, @@ -7662,7 +7662,7 @@ ] }, { - "id": "3607", + "id": "BCT_3607", "name": "Main/Evelyn", "description": "The stop is located on a sign post about 150 feet after Evelyn St across from the Westover Plaza Johnson City", "latitude": 42.115439, @@ -7676,7 +7676,7 @@ ] }, { - "id": "3608", + "id": "BCT_3608", "name": "Country Club/Patterson", "description": "The stop is located on a telephone pole at the corner before Patterson Ct at a private residence Endwell", "latitude": 42.116223, @@ -7692,7 +7692,7 @@ ] }, { - "id": "3609", + "id": "BCT_3609", "name": "Main/Baker", "description": "The stop is located before Baker St in front of the Johnson City Learning Center Johnson City. There is a bus shelter here.", "latitude": 42.115603, @@ -7710,7 +7710,7 @@ ] }, { - "id": "3610", + "id": "BCT_3610", "name": "Country Club/Beckwith", "description": "The stop is located on a sign post about 150 feet after Beckwith Ave near Visions Credit Union Endwell", "latitude": 42.116066, @@ -7726,7 +7726,7 @@ ] }, { - "id": "3611", + "id": "BCT_3611", "name": "Main/Allen", "description": "The stop is located on a sign post before Allen St near the Barber Funeral Home parking lot Johnson City.", "latitude": 42.115676, @@ -7744,7 +7744,7 @@ ] }, { - "id": "3612", + "id": "BCT_3612", "name": "Country Club/University", "description": "The stop is located on a sign post across from Knigtlee Ave about 100 feet after University Ave at a private residence Endwell", "latitude": 42.115869, @@ -7760,7 +7760,7 @@ ] }, { - "id": "3613", + "id": "BCT_3613", "name": "Main/Harrison", "description": "The stop is located on a sign post about 50 before Harrison St across the street from Walgreens Johnson City", "latitude": 42.115782, @@ -7778,7 +7778,7 @@ ] }, { - "id": "3614", + "id": "BCT_3614", "name": "Center/Country Club", "description": "The stop is located on a sign post about 50 feet after Country Club Rd at a private residence Endwell", "latitude": 42.1153842174282, @@ -7792,7 +7792,7 @@ ] }, { - "id": "3616", + "id": "BCT_3616", "name": "Crescent /King", "description": "The stop is located on a telephone pole at the corner before King St at a private residence Endwell", "latitude": 42.1136949189848, @@ -7806,7 +7806,7 @@ ] }, { - "id": "3617", + "id": "BCT_3617", "name": "Main/N Broad", "description": "The stop is located before Broad St near Red Robin", "latitude": 42.115534, @@ -7824,7 +7824,7 @@ ] }, { - "id": "3618", + "id": "BCT_3618", "name": "N Willis/Hall", "description": "The stop is located on a sign post at the corner before Hall St at a private residence Endwell", "latitude": 42.111688, @@ -7838,7 +7838,7 @@ ] }, { - "id": "3619", + "id": "BCT_3619", "name": "Main/Willow", "description": "The stop is located by Save A Lot", "latitude": 42.114391, @@ -7856,7 +7856,7 @@ ] }, { - "id": "3620", + "id": "BCT_3620", "name": "N Willis/Watson", "description": "The stop is located on a sign post about 10 feet beforeWatson Blvd acoss from the Allan Court Apts Endwell", "latitude": 42.110584, @@ -7870,7 +7870,7 @@ ] }, { - "id": "3621", + "id": "BCT_3621", "name": "Main/Park", "description": "The stop is located on a sign post before Park St and across the street from St James Church Johnson City", "latitude": 42.113305, @@ -7888,7 +7888,7 @@ ] }, { - "id": "3622", + "id": "BCT_3622", "name": "Watson/Allen", "description": "The stop is located about across from Allan Court at a private residence Endwell", "latitude": 42.110342, @@ -7902,7 +7902,7 @@ ] }, { - "id": "3623", + "id": "BCT_3623", "name": "Main/Floral", "description": "The stop is located on a sign post before Floral Ave by the Johnson City Presbyterian Church Binghamton", "latitude": 42.111213, @@ -7918,7 +7918,7 @@ ] }, { - "id": "3624", + "id": "BCT_3624", "name": "Watson/Wilson", "description": "The stop is located about 10 feet before Wilson Ave across from Baked Euphora Endwell", "latitude": 42.109776, @@ -7932,7 +7932,7 @@ ] }, { - "id": "3625", + "id": "BCT_3625", "name": "Main/Crary", "description": "The stop is located on a sign post before Crary Ave and near the Lourdes Center for Family Health Binghamton", "latitude": 42.109986, @@ -7948,7 +7948,7 @@ ] }, { - "id": "3626", + "id": "BCT_3626", "name": "Watson/Taylor", "description": "The stop is located about 10 feet before Taylor Ave near the Village of Endicott sign in Endicott", "latitude": 42.109711, @@ -7962,7 +7962,7 @@ ] }, { - "id": "3627", + "id": "BCT_3627", "name": "Main/Crestmont", "description": "The stop is located on a sign post before Crestmont Rd and near the Weis Binghamton.", "latitude": 42.108281, @@ -7978,7 +7978,7 @@ ] }, { - "id": "3628", + "id": "BCT_3628", "name": "Watson/Hayes", "description": "The stop is located on a sign post about 20 feet after Hayes Ave near the Pucedo Funeral Home Endicott", "latitude": 42.1096393523919, @@ -7992,7 +7992,7 @@ ] }, { - "id": "3629", + "id": "BCT_3629", "name": "Main/Helen", "description": "The stop is located on a sign post about 100 feet after Helen St in front of KFC Binghamton", "latitude": 42.106894, @@ -8008,7 +8008,7 @@ ] }, { - "id": "3630", + "id": "BCT_3630", "name": "Watson/N Adams.", "description": "The stop is located at the corner before N Adams Ave at a private residence Endicott", "latitude": 42.10952, @@ -8022,7 +8022,7 @@ ] }, { - "id": "3630.1", + "id": "BCT_3630.1", "name": "Watson/N McKinley", "description": "The stop is located about 150 feet before N McKinley Endicott", "latitude": 42.109482, @@ -8036,7 +8036,7 @@ ] }, { - "id": "3631", + "id": "BCT_3631", "name": "Main/Orton", "description": "The stop is located on a sign post about 150 feet before Orton Ave between Binghamton Fluorescent and Reliable Auto Sales Binghamton", "latitude": 42.106175, @@ -8052,7 +8052,7 @@ ] }, { - "id": "3632.1", + "id": "BCT_3632.1", "name": "Watson/Hill", "description": "The stop in located at the corner before Hill Ave Endicott", "latitude": 42.109351, @@ -8066,7 +8066,7 @@ ] }, { - "id": "3633", + "id": "BCT_3633", "name": "Main/Schiller", "description": "The stop is located on a sign post at the corner before Schiller St near the Duncan Donuts Binghamton", "latitude": 42.105323, @@ -8082,7 +8082,7 @@ ] }, { - "id": "3634", + "id": "BCT_3634", "name": "North/N McKinley", "description": "The stop is located in a street lamp pole about 200 feet after N McKinley Ave near IBM Endicott", "latitude": 42.105327, @@ -8098,7 +8098,7 @@ ] }, { - "id": "3635", + "id": "BCT_3635", "name": "Main/Hamilton", "description": "The stop is located on a sign post across from Hamilton St in front of Aarons Binghamton", "latitude": 42.104748, @@ -8114,7 +8114,7 @@ ] }, { - "id": "3637", + "id": "BCT_3637", "name": "Main/Cedar", "description": "The stop is located on a sign post at the corner after Cedar St near the Osburn Law Offices Binghamton", "latitude": 42.102094, @@ -8130,7 +8130,7 @@ ] }, { - "id": "3637.1", + "id": "BCT_3637.1", "name": "Main/Chestnut", "description": "The stop is located on a sing post about 110 feet before Chestnust St Binghamton", "latitude": 42.101518, @@ -8144,7 +8144,7 @@ ] }, { - "id": "3636", + "id": "BCT_3636", "name": "Washington/North", "description": "The stop is located on a sign post about 150 feet after North St", "latitude": 42.104166, @@ -8160,7 +8160,7 @@ ] }, { - "id": "3638", + "id": "BCT_3638", "name": "Washington/Main", "description": "The stop is located on a sign post after the Endicott Post Office- Endicott", "latitude": 42.099542, @@ -8176,7 +8176,7 @@ ] }, { - "id": "3639", + "id": "BCT_3639", "name": "Main/Arthur", "description": "The stop is located on a telephone pole before Arthur St by the Belmar Binghamton", "latitude": 42.100392, @@ -8192,7 +8192,7 @@ ] }, { - "id": "3641", + "id": "BCT_3641", "name": "Main/Chapin", "description": "The stop is located on a sign post about 20 feet before Chapin St in front Parsons Funeral Home Binghamton", "latitude": 42.09969, @@ -8208,7 +8208,7 @@ ] }, { - "id": "3642", + "id": "BCT_3642", "name": "Main/Lincoln", "description": "The stop is located on a street lamp pole at the corner before Lincoln Ave across from the Union Endicott School District Offices Endicott", "latitude": 42.097394, @@ -8224,7 +8224,7 @@ ] }, { - "id": "3643", + "id": "BCT_3643", "name": "Main/Oak", "description": "The stop is located on a sign post about 20 feet before Oak St across from Family Dollar Binghamton", "latitude": 42.099268, @@ -8240,7 +8240,7 @@ ] }, { - "id": "3644", + "id": "BCT_3644", "name": "Main/Medical Arts", "description": "The stop is located on a sign post about 120 after Harrison Ave near the Medical Arts Bldg Endicott", "latitude": 42.096135, @@ -8256,7 +8256,7 @@ ] }, { - "id": "3645", + "id": "BCT_3645", "name": "Court/Washington", "description": "The stop is located on a sign post about 20 feet before the Washington St near China One", "latitude": 42.0986420918152, @@ -8274,7 +8274,7 @@ ] }, { - "id": "3646", + "id": "BCT_3646", "name": "Main/Vestal", "description": "The stop is located on a street lamp pole about 75 feet before Vestal Ave before the entrance to Hess Express Endicott.", "latitude": 42.095277, @@ -8288,7 +8288,7 @@ ] }, { - "id": "3648", + "id": "BCT_3648", "name": "Main/Mercereau", "description": "The stop is located on a sign post across from Merserau Ave near the Graydon Apts Endicott", "latitude": 42.094979, @@ -8302,7 +8302,7 @@ ] }, { - "id": "3650", + "id": "BCT_3650", "name": "Main/Liberty", "description": "The stop is located on a sign post about 10 feet after Liberty St across from the Rite Aid Endicott", "latitude": 42.095124, @@ -8316,7 +8316,7 @@ ] }, { - "id": "3652", + "id": "BCT_3652", "name": "Main/S. Duane", "description": "The stop is located on a sign post about 20 feet before S Duane Ave near DeMarco's Auto Service Endicott", "latitude": 42.09497, @@ -8330,7 +8330,7 @@ ] }, { - "id": "3654", + "id": "BCT_3654", "name": "Main/S. Page", "description": "The stop is located on a sign post about 90 feet before S Page Ave by the Sunoco Fuel Station Endicott", "latitude": 42.093973, @@ -8344,7 +8344,7 @@ ] }, { - "id": "3656", + "id": "BCT_3656", "name": "Main/Bassett", "description": "The stop is located on a sign post by the crosswalk across from Bassett Ave Endicott", "latitude": 42.092912, @@ -8358,7 +8358,7 @@ ] }, { - "id": "3658", + "id": "BCT_3658", "name": "Main/S. Grippen", "description": "The stop is located on a sign post about 100 feet before S Grippen Ave near the the Lady of Good Counsel Endicott", "latitude": 42.092492, @@ -8372,7 +8372,7 @@ ] }, { - "id": "4002", + "id": "BCT_4002", "name": "BC Junction 40 Chenango St", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 3 Dock A", "latitude": 42.101635, @@ -8386,7 +8386,7 @@ ] }, { - "id": "4003", + "id": "BCT_4003", "name": "W Service/East Niles", "description": "The stop is located on a sign post at the corner before E. Niles Rd near Trucks R Us.", "latitude": 42.164555, @@ -8400,7 +8400,7 @@ ] }, { - "id": "4004", + "id": "BCT_4004", "name": "State/Eldridge", "description": "The stop is located on a telephone pole about 200 feet after Eldridge St near Bennedum's Lock Binghamton", "latitude": 42.105659, @@ -8414,7 +8414,7 @@ ] }, { - "id": "4005", + "id": "BCT_4005", "name": "W Service/Ivan", "description": "The stop is located on a sign post about 100 before Ivan Ln at private residence Fenton", "latitude": 42.16275, @@ -8428,7 +8428,7 @@ ] }, { - "id": "4006", + "id": "BCT_4006", "name": "State/Lupo's", "description": "The stop is located on a telephone pole before the entrance to Lupo's Char Pit Binghamton", "latitude": 42.107731, @@ -8442,7 +8442,7 @@ ] }, { - "id": "4007", + "id": "BCT_4007", "name": "Chenango/Prentice", "description": "The stop is located on a telephone pole about 75 feet before Prentice Blvd Fenton", "latitude": 42.158688, @@ -8456,7 +8456,7 @@ ] }, { - "id": "4008", + "id": "BCT_4008", "name": "W State/Colonial Plaza", "description": "The stop is located on a telephone pole before the entrance to CVS Binghamton", "latitude": 42.10947, @@ -8470,7 +8470,7 @@ ] }, { - "id": "4009", + "id": "BCT_4009", "name": "Chenango/Mead", "description": "The stop is located on a sign post across from Mead Rd at private residence Fenton", "latitude": 42.157314, @@ -8484,7 +8484,7 @@ ] }, { - "id": "4010", + "id": "BCT_4010", "name": "Binghamton Plaza/Kmart", "description": "The stop is located near Rent a Center Binghamton Plaza Binghamton", "latitude": 42.110573, @@ -8498,7 +8498,7 @@ ] }, { - "id": "4011", + "id": "BCT_4011", "name": "Chenango/Hinds", "description": "The stop is located on a telephone pole at the corner before Hinds St Binghamton", "latitude": 42.155083, @@ -8512,7 +8512,7 @@ ] }, { - "id": "4012", + "id": "BCT_4012", "name": "Binghamton Plaza/New York Pizzeria", "description": "The stop is located near the New York Pizzeria Binghamton Plaza Binghamton", "latitude": 42.109234, @@ -8526,7 +8526,7 @@ ] }, { - "id": "4013", + "id": "BCT_4013", "name": "Chenango/Hadsell", "description": "The stop is located on a sign post about 25 feet after Hadsell Rd at private residence Fenton", "latitude": 42.1535, @@ -8540,7 +8540,7 @@ ] }, { - "id": "4014", + "id": "BCT_4014", "name": "Chenango/Frederick St", "description": "The stop is located on a sign post at the corner before the intersection near Town & Country Apts.", "latitude": 42.110638, @@ -8554,7 +8554,7 @@ ] }, { - "id": "4015", + "id": "BCT_4015", "name": "Chenango/Hotchkiss", "description": "The stop is located on a sign post about 150 feet before Hotchkiss Ave across from the Children's Home of the Wyoming Conference Fenton", "latitude": 42.151081, @@ -8568,7 +8568,7 @@ ] }, { - "id": "4016", + "id": "BCT_4016", "name": "Chenango/State", "description": "The stop is located on a telephone pole about 75 feet after State St near the Cenentary Chenango St Chuch Binghamton", "latitude": 42.111679, @@ -8582,7 +8582,7 @@ ] }, { - "id": "4017", + "id": "BCT_4017", "name": "Chenango/Alida", "description": "The stop is located on a telephone pole across from Alida Ave at a private residence Fenton", "latitude": 42.149643, @@ -8596,7 +8596,7 @@ ] }, { - "id": "4018", + "id": "BCT_4018", "name": "Chenango/Morgan", "description": "The stop is located on a telephone pole at the corner before Morgan St Binghamton", "latitude": 42.113174, @@ -8610,7 +8610,7 @@ ] }, { - "id": "4019", + "id": "BCT_4019", "name": "Chenango/Nowlan", "description": "The stop is located on a sign post about 125 after Nowland Rd just after Lois Av near Country Additions Fenton", "latitude": 42.147705, @@ -8624,7 +8624,7 @@ ] }, { - "id": "4020", + "id": "BCT_4020", "name": "Chenango/Moffatt", "description": "The stop is located on a on a sign post at the corner before Moffat Ave by Calvary Baptist Church", "latitude": 42.11414, @@ -8638,7 +8638,7 @@ ] }, { - "id": "4021", + "id": "BCT_4021", "name": "Chenango/Franklin", "description": "The stop is located on a telephone pole across from Franklin Ave near St Francis of Assisi Port Dickinson", "latitude": 42.145039, @@ -8652,7 +8652,7 @@ ] }, { - "id": "4022", + "id": "BCT_4022", "name": "Chenango/Sturges", "description": "The stop is located on a telephone pole before the entrance to Kriener and Furlong Binghamton", "latitude": 42.115471, @@ -8666,7 +8666,7 @@ ] }, { - "id": "4023", + "id": "BCT_4023", "name": "Chenango/Dickinson", "description": "The stop is located on a sign post about 75 feet before Dickinson Ave across from Shear Designz Port Dickinson", "latitude": 42.143452, @@ -8680,7 +8680,7 @@ ] }, { - "id": "4024", + "id": "BCT_4024", "name": "Chenango/Green", "description": "The stop is located on a telephone pole opposite Green St near the entrance of Xtra Mart Binghamton", "latitude": 42.117783, @@ -8694,7 +8694,7 @@ ] }, { - "id": "4025", + "id": "BCT_4025", "name": "Chenango/Grant", "description": "The stop is located on a sign post about 20 feet after Grant St from FMK Karate Port Dickinson", "latitude": 42.138008, @@ -8708,7 +8708,7 @@ ] }, { - "id": "4026", + "id": "BCT_4026", "name": "Chenango/Linden", "description": "The stop is located on a sign post next to a fire hydrant before Linden St Binghamton", "latitude": 42.120275, @@ -8722,7 +8722,7 @@ ] }, { - "id": "4027", + "id": "BCT_4027", "name": "Chenango/Mill", "description": "The stop is located on a sign post before Mill St by the crosswalk across from Port Dickinson Elementary School Port Dickinson", "latitude": 42.136879, @@ -8736,7 +8736,7 @@ ] }, { - "id": "4028", + "id": "BCT_4028", "name": "Chenango/Blanchard", "description": "The stop is located on a sign post at a private residence before Blanchard Ave Binghamton", "latitude": 42.1227, @@ -8750,7 +8750,7 @@ ] }, { - "id": "4029", + "id": "BCT_4029", "name": "Chenango/Church", "description": "The stop is located on a sign post at the corner before Church St near the Community Baptist Church Port Dickinson", "latitude": 42.134423, @@ -8764,7 +8764,7 @@ ] }, { - "id": "4030", + "id": "BCT_4030", "name": "Chenango/Baird", "description": "The stop is located on a telephone pole about 100 feet after Baird Ave Binghamton", "latitude": 42.124882, @@ -8778,7 +8778,7 @@ ] }, { - "id": "4031", + "id": "BCT_4031", "name": "Chenango/Terry", "description": "The stop is located on a sign post about 30 feet before Terry Ave at private residence Port Dickinson", "latitude": 42.131071, @@ -8792,7 +8792,7 @@ ] }, { - "id": "4032", + "id": "BCT_4032", "name": "Chenango/Bromley", "description": "The stop is located on a sign post about 50 feet after Bromley Ave near the the Village Coin Laundry Binghamton.", "latitude": 42.126308, @@ -8806,7 +8806,7 @@ ] }, { - "id": "4033", + "id": "BCT_4033", "name": "Chenango/Old State", "description": "The stop is located on a sign post about 25 feet before State Rd at private residence Port Dickinson", "latitude": 42.128757, @@ -8820,7 +8820,7 @@ ] }, { - "id": "4034", + "id": "BCT_4034", "name": "Chenango/Old State", "description": "The stop is located on a sign post before Old State Rd Port Dickinson", "latitude": 42.128422, @@ -8834,7 +8834,7 @@ ] }, { - "id": "4035", + "id": "BCT_4035", "name": "Chenango/Bromley", "description": "The stop is located on a sign post across from Bromley Ave across from the Coin Laundry Binghamton", "latitude": 42.126022, @@ -8848,7 +8848,7 @@ ] }, { - "id": "4036", + "id": "BCT_4036", "name": "Chenango/Terry", "description": "The stop is located on a sign post at private residence across from Terry Ave Port Dickinson", "latitude": 42.130749, @@ -8862,7 +8862,7 @@ ] }, { - "id": "4037", + "id": "BCT_4037", "name": "Chenango/Baird", "description": "The stop is located on a sign post across from Baird Ave across Community Baptist Church Binghamton", "latitude": 42.124489, @@ -8876,7 +8876,7 @@ ] }, { - "id": "4038", + "id": "BCT_4038", "name": "Chenango/James", "description": "The stop is located on a telephone pole after James St across from Chase & DeMarco Funeral Home Port Dickinson", "latitude": 42.133686, @@ -8890,7 +8890,7 @@ ] }, { - "id": "4039", + "id": "BCT_4039", "name": "Chenango/Blanchard", "description": "The stop is located on a telephone pole across from Blancard Ave Binghamton. A bus shelter is here.", "latitude": 42.122799, @@ -8904,7 +8904,7 @@ ] }, { - "id": "4040", + "id": "BCT_4040", "name": "Chenango/Mill", "description": "The stop is located on a sign post after Mill St near Port Dickinson Elementary School Port Dickinson", "latitude": 42.136761, @@ -8918,7 +8918,7 @@ ] }, { - "id": "4041", + "id": "BCT_4041", "name": "Chenango/Dennison", "description": "The stop is located on a sign post across from Dennison Ave near Immmanuel Presbyterian Church Binghamton", "latitude": 42.119484, @@ -8932,7 +8932,7 @@ ] }, { - "id": "4042", + "id": "BCT_4042", "name": "Chenango/Phelps", "description": "The stop is located on a sign post before Phelps St near FMK Karate Port Dickinson", "latitude": 42.137993, @@ -8946,7 +8946,7 @@ ] }, { - "id": "4043", + "id": "BCT_4043", "name": "Chenango/Green", "description": "The stop is located on a sign post at the corner after Green St near Courtesy Cars Binghamton", "latitude": 42.11779, @@ -8960,7 +8960,7 @@ ] }, { - "id": "4044", + "id": "BCT_4044", "name": "Chenango/Dickinson", "description": "The stop is located on a telephone pole before Dickinson Ave near Superior Auto Port Dickinson", "latitude": 42.143021, @@ -8974,7 +8974,7 @@ ] }, { - "id": "4045", + "id": "BCT_4045", "name": "Chenango/Truesdell", "description": "The stop is located on a sign post about 15 feet before Truesdell St across from Calvary Baptist Church Binghamton", "latitude": 42.114189, @@ -8988,7 +8988,7 @@ ] }, { - "id": "4046", + "id": "BCT_4046", "name": "Chenango/Franklin", "description": "The stop is located on a sign post at the corner before Franklin Ave across from St Francis of Assisi Fenton", "latitude": 42.144917, @@ -9002,7 +9002,7 @@ ] }, { - "id": "4047", + "id": "BCT_4047", "name": "Chenango/Pleasant", "description": "The stop is located on a sign post at the corner before Pleasant St at a private residence Binghamton", "latitude": 42.112598, @@ -9016,7 +9016,7 @@ ] }, { - "id": "4048", + "id": "BCT_4048", "name": "Chenango/Nowlan", "description": "The stop is located on a sign post before Nowlan Rd across from Subway Fenton", "latitude": 42.147881, @@ -9030,7 +9030,7 @@ ] }, { - "id": "4050", + "id": "BCT_4050", "name": "Chenango/Alida", "description": "The stop is located on a sign post after Alida Ave at a private residence Fenton", "latitude": 42.149738, @@ -9044,7 +9044,7 @@ ] }, { - "id": "4052", + "id": "BCT_4052", "name": "Chenango/Hotchkiss", "description": "The stop is located on a sign post after Hotchkiss Ave near the Children's Home of the Wyoming Conference Fenton", "latitude": 42.151241, @@ -9058,7 +9058,7 @@ ] }, { - "id": "4053", + "id": "BCT_4053", "name": "Chenango/State", "description": "The stop is located about 150 feet after State St in front of CVS Binghamton. There is a bus bus shelter here.", "latitude": 42.109493, @@ -9072,7 +9072,7 @@ ] }, { - "id": "4054", + "id": "BCT_4054", "name": "Chenango/Ronan", "description": "The stop is located on a sign post before Ronan St Fenton", "latitude": 42.153591, @@ -9086,7 +9086,7 @@ ] }, { - "id": "4056", + "id": "BCT_4056", "name": "Chenango/Hinds", "description": "The stop is located on a sign post across from Hinds St at private residence Fenton", "latitude": 42.155186, @@ -9100,7 +9100,7 @@ ] }, { - "id": "4058", + "id": "BCT_4058", "name": "Chenango/Mead", "description": "The stop is located on a sign post before Mead Rd near the First Church of the Nazarene Fenton", "latitude": 42.157307, @@ -9114,7 +9114,7 @@ ] }, { - "id": "4060", + "id": "BCT_4060", "name": "Chenango/Cornish", "description": "The stop is located on a sign post about 200 feet after Cornish Ave Fenton", "latitude": 42.158958, @@ -9128,7 +9128,7 @@ ] }, { - "id": "4062", + "id": "BCT_4062", "name": "W Service/East Niles", "description": "The stop is located on a sign post before E Niles Rd across from Trucks R Us Fenton", "latitude": 42.164261, @@ -9142,7 +9142,7 @@ ] }, { - "id": "4064", + "id": "BCT_4064", "name": "River/Kattelville", "description": "The stop is located on a sign post about 50 feet after Kattelville Rd near the Red White Chenango Bridge", "latitude": 42.168858, @@ -9156,7 +9156,7 @@ ] }, { - "id": "4066", + "id": "BCT_4066", "name": "River/Palmer", "description": "The stop is located on a sign post across from Palmer St near the Chenango Valley Nursery Chenango Bridge", "latitude": 42.168297, @@ -9170,7 +9170,7 @@ ] }, { - "id": "4068", + "id": "BCT_4068", "name": "River/Clarendon", "description": "The stop is located on a sign post across from Clarendon Dr near St Mark's Church Chenango Bridge.", "latitude": 42.167484, @@ -9184,7 +9184,7 @@ ] }, { - "id": "4070", + "id": "BCT_4070", "name": "River/Mountainview", "description": "The stop is located on a sign post about 20 feet before at the corner before Mountainview Dr at private residence Chenango Bridge.", "latitude": 42.166763, @@ -9198,7 +9198,7 @@ ] }, { - "id": "4072", + "id": "BCT_4072", "name": "River/Everett", "description": "The stop is located on a sign post at the corner before Everett Rd at a private residence Chenango Bridge", "latitude": 42.166561, @@ -9212,7 +9212,7 @@ ] }, { - "id": "4074", + "id": "BCT_4074", "name": "N Wisconsin/Hodge", "description": "The stop is located before Hodge Rd Chenango Bridge. This is a flag stop.", "latitude": 42.168224, @@ -9226,7 +9226,7 @@ ] }, { - "id": "4076", + "id": "BCT_4076", "name": "River/Poplar Hill", "description": "The stop is located on a telephone pole about 100 feet after Poplar Hill at a private residence Chenango Bridge", "latitude": 42.166325, @@ -9242,7 +9242,7 @@ ] }, { - "id": "4078", + "id": "BCT_4078", "name": "River/Norman", "description": "The stop is located on a telephone pole about 40 feet passed Norman Rd at a private residence Chenango Bridge", "latitude": 42.166683, @@ -9258,7 +9258,7 @@ ] }, { - "id": "4080", + "id": "BCT_4080", "name": "River/Mountainview", "description": "The stop is located on a sign post across from Mountainview Dr at a private residence Chenangon Bridge", "latitude": 42.166893, @@ -9274,7 +9274,7 @@ ] }, { - "id": "4082", + "id": "BCT_4082", "name": "River/Clarendon", "description": "The stop is located on a sign post about 10 feet before Clarendon Dr at a private residence Chenango Bridge.", "latitude": 42.1675, @@ -9290,7 +9290,7 @@ ] }, { - "id": "4084", + "id": "BCT_4084", "name": "River/Palmer", "description": "The stop is located on a sign post at the corner before Palmer St at a private residence Chenango Bridge.", "latitude": 42.168346, @@ -9306,7 +9306,7 @@ ] }, { - "id": "4086", + "id": "BCT_4086", "name": "River/Kattelville", "description": "The stop is located on a sign post about 250 feet Kattelville Rd near the M&T Bank Chenango Bridge.", "latitude": 42.168934, @@ -9322,7 +9322,7 @@ ] }, { - "id": "4096", + "id": "BCT_4096", "name": "Chenango/Lyon", "description": "The stop is located on a sign post before Lyon St near the former North Presbyterian Church Binghamton", "latitude": 42.108273, @@ -9332,7 +9332,7 @@ "route_ids": [] }, { - "id": "4098", + "id": "BCT_4098", "name": "Chenago/State", "description": "The stop is located on a sign post before the intersection across from the CVS Binghamton", "latitude": 42.10963, @@ -9342,7 +9342,7 @@ "route_ids": [] }, { - "id": "4701", + "id": "BCT_4701", "name": "African/Vestal Pkwy", "description": "The stop is located on a sign post about 200 feet after the Vestal Pkwy across from the Shoppes of Vestal Vestal", "latitude": 42.094837, @@ -9356,7 +9356,7 @@ ] }, { - "id": "4702", + "id": "BCT_4702", "name": "Vestal Pkwy E/University Square", "description": "The stop is located on a telephone pole near the Fed Ex sign after University Square Plaza Vestal", "latitude": 42.096066, @@ -9374,7 +9374,7 @@ ] }, { - "id": "4703", + "id": "BCT_4703", "name": "Sycamore/Vestal", "description": "The stop is located on a sign post 250 after Vestal Rd by Sam's Club Vestal", "latitude": 42.098797, @@ -9388,7 +9388,7 @@ ] }, { - "id": "4704", + "id": "BCT_4704", "name": "Campus Plaza", "description": "The stop is located in front of Rite Aid in the Campus Plaza Vestal", "latitude": 42.098342, @@ -9402,7 +9402,7 @@ ] }, { - "id": "4705", + "id": "BCT_4705", "name": "Parkway Plaza/Target", "description": "The stop is located betweenTarget and Bed Bath & Beyond in the Parkway Plaza Vestal", "latitude": 42.094188, @@ -9418,7 +9418,7 @@ ] }, { - "id": "4705.1", + "id": "BCT_4705.1", "name": "Across from Target Flag Stop", "description": "", "latitude": 42.0942971762309, @@ -9432,7 +9432,7 @@ ] }, { - "id": "4706", + "id": "BCT_4706", "name": "Vestal/Gates", "description": "The stop is located on a sign post on the corner before Gates Rd near the Grace Point Chuch Vestal", "latitude": 42.1008285336005, @@ -9448,7 +9448,7 @@ ] }, { - "id": "4707", + "id": "BCT_4707", "name": "Parkway Plaza/Price Rite", "description": "The stop is located by Price Rite in the Parkway Plaza Vestal", "latitude": 42.094212, @@ -9464,7 +9464,7 @@ ] }, { - "id": "4707.1", + "id": "BCT_4707.1", "name": "Across from Price Rite Flag Stop", "description": "", "latitude": 42.0942927660783, @@ -9478,7 +9478,7 @@ ] }, { - "id": "4708", + "id": "BCT_4708", "name": "Vestal/Commerce", "description": "The stop is located on a telephone pole after Commerce Rd near National Pipe Vestal.", "latitude": 42.102848, @@ -9494,7 +9494,7 @@ ] }, { - "id": "4709", + "id": "BCT_4709", "name": "Parkway Plaza/PetSmart", "description": "The stop is located by PetSmart in the Parkway Plaza Vestal", "latitude": 42.094286, @@ -9510,7 +9510,7 @@ ] }, { - "id": "4709.1", + "id": "BCT_4709.1", "name": "Across from Pet Smart Flag Stop", "description": "", "latitude": 42.09436, @@ -9524,7 +9524,7 @@ ] }, { - "id": "4710", + "id": "BCT_4710", "name": "Jensen/Vestal Rd", "description": "The stop is located on a sign post about 100 feet after the Vestal Rd across from the Mirabito Fuel Station Vestal", "latitude": 42.103104, @@ -9540,7 +9540,7 @@ ] }, { - "id": "4711", + "id": "BCT_4711", "name": "Rano/Anthos Apts", "description": "The stop is located on a sign post at the corner before the entrance to Anthos Apts Vestal", "latitude": 42.092793, @@ -9554,7 +9554,7 @@ ] }, { - "id": "4712", + "id": "BCT_4712", "name": "Jensen/Brentwood", "description": "The stop is located on a sign post across from Brentwood Place by Broome County Building Supply Vestal", "latitude": 42.101162, @@ -9570,7 +9570,7 @@ ] }, { - "id": "4713", + "id": "BCT_4713", "name": "Burris/Rano", "description": "The stop is located on a sign post about 20 feet after Rano Blvd at a private residence Vestal", "latitude": 42.0914, @@ -9584,7 +9584,7 @@ ] }, { - "id": "4714", + "id": "BCT_4714", "name": "Jensen/Stewart", "description": "The stop is located on a sign post about 350 feet before Stewart Rd across from Puglisi Tax Svc", "latitude": 42.099384, @@ -9600,7 +9600,7 @@ ] }, { - "id": "4715", + "id": "BCT_4715", "name": "Burris / Royal", "description": "The stop is located on a sign post at the corner after Royal St at a private residence Vestal", "latitude": 42.09166, @@ -9614,7 +9614,7 @@ ] }, { - "id": "4716", + "id": "BCT_4716", "name": "Jensen/NY 434", "description": "The stop is located on a telephone pole about 370 feet before NY 434 near Best Buy Vestal", "latitude": 42.097813, @@ -9630,7 +9630,7 @@ ] }, { - "id": "4717", + "id": "BCT_4717", "name": "Burris/Jensen", "description": "The stop is located on a sign post across from Riviera Ridge Apts Vestal.", "latitude": 42.091877, @@ -9644,7 +9644,7 @@ ] }, { - "id": "4718", + "id": "BCT_4718", "name": "Jensen/Parkway Plaza East Entrance", "description": "The stop is located on a sign post after the entrance to Parkway Plaza on the backside of Kohls Vestal", "latitude": 42.095242, @@ -9658,7 +9658,7 @@ ] }, { - "id": "4719", + "id": "BCT_4719", "name": "Jensen/Chalburn", "description": "The stop is located on a sign post about 20 feet after Chalburn Rd at a private residence Vestal", "latitude": 42.093845, @@ -9672,7 +9672,7 @@ ] }, { - "id": "4720", + "id": "BCT_4720", "name": "Burris/Riviera Ridge", "description": "The stop is located on a sign post after the entrance to Riviera Ridge Apartments Vestal", "latitude": 42.091923, @@ -9686,7 +9686,7 @@ ] }, { - "id": "4721", + "id": "BCT_4721", "name": "Jensen/NY 434", "description": "The stop is located on a sign post about 330 feet before NY 434 after the entrance to the United Way.", "latitude": 42.0956, @@ -9700,7 +9700,7 @@ ] }, { - "id": "4722", + "id": "BCT_4722", "name": "Burris/Royal", "description": "The stop is located on a sign post before the entrance to Holly Brook Apts Vestal", "latitude": 42.091705, @@ -9714,7 +9714,7 @@ ] }, { - "id": "4723", + "id": "BCT_4723", "name": "Jensen/Stewart", "description": "The stop is located on a telephone pole after Stewart Rd near Green Acres Garden Center Vestal", "latitude": 42.098568, @@ -9728,7 +9728,7 @@ ] }, { - "id": "4724", + "id": "BCT_4724", "name": "Burris/Rano", "description": "The stop is located on a sign post at the corner before Rano Blvd at a private residence Vestal", "latitude": 42.091484, @@ -9742,7 +9742,7 @@ ] }, { - "id": "4725", + "id": "BCT_4725", "name": "Jensen", "description": "The stop is located on a sign post by Puglisi Tax Svc Vestal", "latitude": 42.099243, @@ -9756,7 +9756,7 @@ ] }, { - "id": "4726", + "id": "BCT_4726", "name": "Rano/Parkway Plaza", "description": "The stop is located on a sign post about 25 before the entrance to Parkway Plaza Vestal", "latitude": 42.093201, @@ -9770,7 +9770,7 @@ ] }, { - "id": "4727", + "id": "BCT_4727", "name": "Jensen/Brentwood", "description": "The stop is located on a sign post at the corner after Brentwood Pl near the Bethel Baptist Church Vestal", "latitude": 42.101284, @@ -9784,7 +9784,7 @@ ] }, { - "id": "4729", + "id": "BCT_4729", "name": "Jensen/Vestal", "description": "The stop is located on a telephone pole before Vestal Rd near the Mirabito Fuel Station Vestal", "latitude": 42.103325, @@ -9798,7 +9798,7 @@ ] }, { - "id": "4730", + "id": "BCT_4730", "name": "Sycamore/Stewart", "description": "The stop is located on a sign post about 150 feet before Steward Rd in front of Burger King Vestal", "latitude": 42.09663, @@ -9816,7 +9816,7 @@ ] }, { - "id": "4731", + "id": "BCT_4731", "name": "Vestal/Schubmehl", "description": "The stop is located on a sign post at the corner before Schnubmehl Rdacross from Audio Classics Binghamton.", "latitude": 42.102551, @@ -9830,7 +9830,7 @@ ] }, { - "id": "4732", + "id": "BCT_4732", "name": "Lourdes Vestal", "description": "The stop is located at the front entrace of Lourdes Vestal on Shippers Rd Vestal", "latitude": 42.1002357247816, @@ -9844,7 +9844,7 @@ ] }, { - "id": "4733", + "id": "BCT_4733", "name": "Vestal/Gates", "description": "The stop is located across from Gates Rd in front of the Willow Point Nursing Home", "latitude": 42.100704, @@ -9858,7 +9858,7 @@ ] }, { - "id": "4734", + "id": "BCT_4734", "name": "Town Square Mall/Barnes&Noble", "description": "The stop is located between Barnes & Noble and Sam's Club in the Town Square Mall. There is a bus shelter here.", "latitude": 42.097069, @@ -9876,7 +9876,7 @@ ] }, { - "id": "4735", + "id": "BCT_4735", "name": "Vestal/Andrea", "description": "The stop is located on a sign post after the entrance to Westminster Apartments Vestal", "latitude": 42.099369, @@ -9890,7 +9890,7 @@ ] }, { - "id": "4736", + "id": "BCT_4736", "name": "Town Square Mall/Walmart", "description": "The stop is located by the Walmart Gardnen Center, Town Square Mall Vestal", "latitude": 42.096136, @@ -9908,7 +9908,7 @@ ] }, { - "id": "4737", + "id": "BCT_4737", "name": "Campus Plaza/Rite Aid", "description": "The stop is located in front of Rite Aid in the Campus Plaza Vestal", "latitude": 42.0984337941919, @@ -9922,7 +9922,7 @@ ] }, { - "id": "5200", + "id": "BCT_5200", "name": "BC Junction 51 and 53", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 8 Dock B", "latitude": 42.101931, @@ -9938,7 +9938,7 @@ ] }, { - "id": "5512", + "id": "BCT_5512", "name": "North/Oak Hill", "description": "The stop is located on a sign post about 100 feet before Oak Hill Ave across from Crown Fried Chicken Endicott", "latitude": 42.104645, @@ -9954,7 +9954,7 @@ ] }, { - "id": "5514", + "id": "BCT_5514", "name": "Oak Hill / Clarke", "description": "The stop is located on telephone pole after Clarke St across from NCI Endicot", "latitude": 42.108017, @@ -9970,7 +9970,7 @@ ] }, { - "id": "5516", + "id": "BCT_5516", "name": "Oak Hill/Witherall", "description": "The stop is located on a sign post after Witherall St near Joey's Pizza Endicott", "latitude": 42.111164, @@ -9986,7 +9986,7 @@ ] }, { - "id": "5518", + "id": "BCT_5518", "name": "Oak Hill/Jenkins", "description": "The stop is located on a sign post about 50 feet after Jenkins St near the Learning Center of St Anthony Endicott", "latitude": 42.112988, @@ -10002,7 +10002,7 @@ ] }, { - "id": "5520", + "id": "BCT_5520", "name": "Oak Hill/Pine", "description": "The stop is located on a telephone pole at the corner before Pine St near Rossi's Pizza Endicott", "latitude": 42.114761, @@ -10018,7 +10018,7 @@ ] }, { - "id": "5522", + "id": "BCT_5522", "name": "Pine/Hill", "description": "The stop is located on a sign post at the corner before Hill Ave near a private residence Endicott", "latitude": 42.114887, @@ -10034,7 +10034,7 @@ ] }, { - "id": "5524", + "id": "BCT_5524", "name": "Pine/Rogers", "description": "The stop is located on a sign post at the corner before Rogers Ave near United Artists Hair Salon Endicott", "latitude": 42.115017, @@ -10050,7 +10050,7 @@ ] }, { - "id": "5526", + "id": "BCT_5526", "name": "Newell/Pine", "description": "The stop is located on a 30 MPH road sign about 75ft after Pine- Endicott", "latitude": 42.115578, @@ -10066,7 +10066,7 @@ ] }, { - "id": "5528", + "id": "BCT_5528", "name": "Newell/Woodrow", "description": "The stop is located on a sign post across from Woodrow Ave at a private residence Endicott", "latitude": 42.11739, @@ -10082,7 +10082,7 @@ ] }, { - "id": "5530", + "id": "BCT_5530", "name": "Newell/Taft", "description": "The stop is located on a sign post about 20 feet before Taft Ave acoss from an apartment complex Endicott", "latitude": 42.118652, @@ -10098,7 +10098,7 @@ ] }, { - "id": "5532", + "id": "BCT_5532", "name": "Taft/Smith Rd", "description": "The stop is located on telephone pole across from Smith Rd- Endicott", "latitude": 42.117165, @@ -10114,7 +10114,7 @@ ] }, { - "id": "5534", + "id": "BCT_5534", "name": "Taft/Country Club", "description": "The stop is located on a sign post about 50 feet before Country Club Rd at a private residence Endicott", "latitude": 42.115547, @@ -10130,7 +10130,7 @@ ] }, { - "id": "5536", + "id": "BCT_5536", "name": "Country Club/Pierce", "description": "The stop is located on a sign post at the corner before Pierce Ave at a private residence Endicott", "latitude": 42.1153703746527, @@ -10146,7 +10146,7 @@ ] }, { - "id": "5538", + "id": "BCT_5538", "name": "Country Club/Center", "description": "The stop is located on a telephone pole about 50 ft before Center St near a private residence Endicott", "latitude": 42.115601, @@ -10162,7 +10162,7 @@ ] }, { - "id": "5540", + "id": "BCT_5540", "name": "Hooper/Pruyne (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post about 50 feet after Pruyne St near the M & T Bank Endwell", "latitude": 42.119389, @@ -10178,7 +10178,7 @@ ] }, { - "id": "5542", + "id": "BCT_5542", "name": "Hooper/Pheasant (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post about 75 feet before Pheasant Ln at a private residence Endwell", "latitude": 42.122437, @@ -10194,7 +10194,7 @@ ] }, { - "id": "5544", + "id": "BCT_5544", "name": "Hooper /Farm to Market (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post about 200 feet after Farm to Market Rd Endwell", "latitude": 42.126076, @@ -10210,7 +10210,7 @@ ] }, { - "id": "5551", + "id": "BCT_5551", "name": "Hooper Rd/Weis Plaza (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located at the entrance of Park Manor Plaza Endwell", "latitude": 42.128045, @@ -10226,7 +10226,7 @@ ] }, { - "id": "5553", + "id": "BCT_5553", "name": "Plaza/Manor Dr (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post about 50 feet before Manor Dr at a private residence Endwell", "latitude": 42.129539, @@ -10242,7 +10242,7 @@ ] }, { - "id": "5555", + "id": "BCT_5555", "name": "Hooper/Marian Apts (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post at the second entrance to Marian Apts Endwell", "latitude": 42.125381, @@ -10258,7 +10258,7 @@ ] }, { - "id": "5557", + "id": "BCT_5557", "name": "Hooper /Pheasant (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post across from Pheasant St at a private residence Endwell", "latitude": 42.1227993823475, @@ -10274,7 +10274,7 @@ ] }, { - "id": "5559", + "id": "BCT_5559", "name": "Hooper /Pruyne (call for service (607)763-4464 or (607)778-1692)", "description": "The stop is located on a sign post across from Pruyne St near the M&T Bank Endwell", "latitude": 42.119221, @@ -10290,7 +10290,7 @@ ] }, { - "id": "5561", + "id": "BCT_5561", "name": "Country Club/Colgate", "description": "The stop is located on a telephone pole about 50 feet before Colgate Dr at a private residence Endwell.", "latitude": 42.115658, @@ -10304,7 +10304,7 @@ ] }, { - "id": "5563", + "id": "BCT_5563", "name": "Country Club/Taft", "description": "The stop is located on a telephone pole about 100 feet before Taft Ave near A Class Act Salon Endwell.", "latitude": 42.115448, @@ -10318,7 +10318,7 @@ ] }, { - "id": "5573", + "id": "BCT_5573", "name": "Pine/Squires", "description": "The stop is located on a sing post at the corner before Squires Ave near the Close Quarters Restaurant Endicott", "latitude": 42.11507, @@ -10332,7 +10332,7 @@ ] }, { - "id": "5575", + "id": "BCT_5575", "name": "Pine/Hill", "description": "The stop is located on a telephone pole about 50 feet before Hill Ave at a private residence Endicott", "latitude": 42.115021, @@ -10346,7 +10346,7 @@ ] }, { - "id": "5577", + "id": "BCT_5577", "name": "Pine/Oak Hill Rd", "description": "The stop is located on a sign post about 10 feet before Oak Hill Ave near Rossi's Pizza Endicott", "latitude": 42.114922, @@ -10360,7 +10360,7 @@ ] }, { - "id": "5579", + "id": "BCT_5579", "name": "Oak Hill/Jenkins", "description": "The stop is located about 25 feet before Jenkins St at a private residence Endicott", "latitude": 42.112976, @@ -10374,7 +10374,7 @@ ] }, { - "id": "5581", + "id": "BCT_5581", "name": "Oak Hill/Witherall", "description": "The stop is located on a telephone pole at the cross walk before Witherall St near the Northside Park Endicott", "latitude": 42.111137, @@ -10388,7 +10388,7 @@ ] }, { - "id": "5583", + "id": "BCT_5583", "name": "Oak Hill/Clarke", "description": "The stop is located on a sign post about 100 feet before Clarke St near NCI Endicott", "latitude": 42.107725, @@ -10404,7 +10404,7 @@ ] }, { - "id": "5583.1", + "id": "BCT_5583.1", "name": "Oak Hill/Plaza", "description": "New bus stop near the Price Chopper plaza effective 2-6-17", "latitude": 42.105175, @@ -10418,7 +10418,7 @@ ] }, { - "id": "5585", + "id": "BCT_5585", "name": "Vestal Ave/ River Terrace", "description": "The stop is located on a sign post at the corner before River Terrace by the Riverview Apts Endicott", "latitude": 42.093224, @@ -10432,7 +10432,7 @@ ] }, { - "id": "5587", + "id": "BCT_5587", "name": "Vestal Ave/Stage Rd", "description": "The stop is located on a sign post about 20 feet before Commercial Plaza Dr across from Advanced Auto Parts Vestal", "latitude": 42.087836, @@ -10446,7 +10446,7 @@ ] }, { - "id": "5589", + "id": "BCT_5589", "name": "434 E/Clayton", "description": "The stop is located on a telephone pole about 75 feet Clayton Ave by the Magic City Carwash Vestal NY", "latitude": 42.086988, @@ -10460,7 +10460,7 @@ ] }, { - "id": "5593", + "id": "BCT_5593", "name": "434 E/Ridgehaven", "description": "The stop is located about 200 feet before Ridgehaven Dr by American Family Fitness Vestal. A bus shelter is here.", "latitude": 42.092913, @@ -10474,7 +10474,7 @@ ] }, { - "id": "5702", + "id": "BCT_5702", "name": "BC Junction 57 Shoppers Special", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 8 Dock B", "latitude": 42.102015, @@ -10488,7 +10488,7 @@ ] }, { - "id": "5704", + "id": "BCT_5704", "name": "Bunn Hill/Bunn Hill Access Rd", "description": "The stop is located on Bunn Hill near the BU Campus. A bus shelter is here", "latitude": 42.094433, @@ -10506,7 +10506,7 @@ ] }, { - "id": "5706", + "id": "BCT_5706", "name": "Vestal Pkwy/Bao Bao", "description": "The stop is located on a telephone pole near the Bao Bao Restaurant Vestal NY", "latitude": 42.0964581, @@ -10522,7 +10522,7 @@ ] }, { - "id": "5710", + "id": "BCT_5710", "name": "Vestal Pkwy/Arby's", "description": "The stop is located on a telephone pole between the Mirabito and Arby's Vestal A bus shelter is here.", "latitude": 42.0961273000715, @@ -10538,7 +10538,7 @@ ] }, { - "id": "5712", + "id": "BCT_5712", "name": "Vestal Pkwy/Parkway Plaza", "description": "The stop is located after the entrance to Parkway Plaza Vestal.", "latitude": 42.0957972, @@ -10554,7 +10554,7 @@ ] }, { - "id": "5714", + "id": "BCT_5714", "name": "Wegmans", "description": "The stop is located on the east side of the Wegman's store entrance Johnson City", "latitude": 42.123251341297, @@ -10572,7 +10572,7 @@ ] }, { - "id": "5716", + "id": "BCT_5716", "name": "Front/Leroy", "description": "The stop is located on a sign post about 75 feet after Leroy St near Renaissance Plaza Binghamton", "latitude": 42.0952092, @@ -10586,7 +10586,7 @@ ] }, { - "id": "5718", + "id": "BCT_5718", "name": "Front/Main", "description": "The stop is located on a telephone pole about 60 feet before Main St near Thai Time Binghamton", "latitude": 42.098319, @@ -10600,7 +10600,7 @@ ] }, { - "id": "5902", + "id": "BCT_5902", "name": "Vestal Rd/African", "description": "The stop is located after the intersection between Take a Break and Pete's Legacy Diner", "latitude": 42.096966, @@ -10614,7 +10614,7 @@ ] }, { - "id": "5904", + "id": "BCT_5904", "name": "Vestal Rd /Maple", "description": "The stop is located after the intersection.", "latitude": 42.097149, @@ -10628,7 +10628,7 @@ ] }, { - "id": "5905", + "id": "BCT_5905", "name": "Day Hallow/ NY 26", "description": "The stop is located across the street from Weis before the instersection.", "latitude": 42.11087, @@ -10644,7 +10644,7 @@ ] }, { - "id": "5906", + "id": "BCT_5906", "name": "Vestal Rd /Oak", "description": "The stop is located after the intersection.", "latitude": 42.097187, @@ -10658,7 +10658,7 @@ ] }, { - "id": "5916", + "id": "BCT_5916", "name": "North/Nanticoke", "description": "The stop is located before the intersection", "latitude": 42.098129, @@ -10672,7 +10672,7 @@ ] }, { - "id": "5918", + "id": "BCT_5918", "name": "Day Hallow/ NY 26", "description": "The stop is located on telephone before the entrance to Weis", "latitude": 42.1108839093283, @@ -10686,7 +10686,7 @@ ] }, { - "id": "6000", + "id": "BCT_6000", "name": "BU Union", "description": "The stop is located at the Universisty Union Bus Lane Vestal", "latitude": 42.087051, @@ -10708,7 +10708,7 @@ ] }, { - "id": "6001", + "id": "BCT_6001", "name": "BU Mohawk Bldg", "description": "The stop is located on East Dr by the BU Mohawk Hall Vestal. There is a bus shelter here.", "latitude": 42.086918, @@ -10728,7 +10728,7 @@ ] }, { - "id": "6002", + "id": "BCT_6002", "name": "BU School of Management", "description": "The stop is located at the bus lane off East Dr at the BU Union Vestal", "latitude": 42.088721, @@ -10746,7 +10746,7 @@ ] }, { - "id": "6003", + "id": "BCT_6003", "name": "BU/Power Plant", "description": "The stop is located on a sign post near Lot I across from the Tennis Courts at Binghamton University.", "latitude": 42.091752, @@ -10766,7 +10766,7 @@ ] }, { - "id": "6004", + "id": "BCT_6004", "name": "BU/Tennis Courts", "description": "The stop is located near the BU Event Center/Tennis Courts in Vestal. There is a bus shelter here.", "latitude": 42.090981, @@ -10790,7 +10790,7 @@ ] }, { - "id": "6010", + "id": "BCT_6010", "name": "BU/Digman", "description": "BU Stop for 57", "latitude": 42.08728, @@ -10804,7 +10804,7 @@ ] }, { - "id": "6011", + "id": "BCT_6011", "name": "BU/Admission", "description": "BU Stop for 16 and 17", "latitude": 42.087045, @@ -10820,7 +10820,7 @@ ] }, { - "id": "8001", + "id": "BCT_8001", "name": "Achieve", "description": "This is a flag stop near Achieve Binghamton", "latitude": 42.129569, @@ -10834,7 +10834,7 @@ ] }, { - "id": "8098", + "id": "BCT_8098", "name": "Carroll/Hawley", "description": "This is a flag stop located at Carroll and Hawley", "latitude": 42.098173, @@ -10848,7 +10848,7 @@ ] }, { - "id": "8099", + "id": "BCT_8099", "name": "Hawley/Myrtle", "description": "This is a flag stop located at Hawley and Myrtle", "latitude": 42.097706, @@ -10862,7 +10862,7 @@ ] }, { - "id": "8802", + "id": "BCT_8802", "name": "BC Junction 8X", "description": "The stop is located at the Greater Binghamton Transportation Center BC Junction Bay 6 Dock A", "latitude": 42.101815, @@ -10878,7 +10878,7 @@ ] }, { - "id": "95101", + "id": "BCT_95101", "name": "Frito Lay", "description": "This is a flag stop area.", "latitude": 42.096852, @@ -10892,7 +10892,7 @@ ] }, { - "id": "95102", + "id": "BCT_95102", "name": "Felchar Bldg 3", "description": "This is a flag stop area.", "latitude": 42.094688, @@ -10906,7 +10906,7 @@ ] }, { - "id": "95103", + "id": "BCT_95103", "name": "Pilot", "description": "This is a flag stop area.", "latitude": 42.101991, @@ -10922,7 +10922,7 @@ ] }, { - "id": "95104", + "id": "BCT_95104", "name": "Felchar Mfg 1&2", "description": "This is a flag stop area.", "latitude": 42.10493, @@ -10936,7 +10936,7 @@ ] }, { - "id": "95105", + "id": "BCT_95105", "name": "TCMF", "description": "This is a flag stop area.", "latitude": 42.10282, @@ -10950,7 +10950,7 @@ ] }, { - "id": "95106", + "id": "BCT_95106", "name": "FedEx", "description": "This is a flag stop area.", "latitude": 42.101115, @@ -10964,7 +10964,7 @@ ] }, { - "id": "95107", + "id": "BCT_95107", "name": "Harris Assembly", "description": "This is a flag stop area.", "latitude": 42.09576, @@ -10978,7 +10978,7 @@ ] }, { - "id": "95108", + "id": "BCT_95108", "name": "Southern Tier Plastics", "description": "This is a flag stop area.", "latitude": 42.099055, @@ -10992,7 +10992,7 @@ ] }, { - "id": "95109", + "id": "BCT_95109", "name": "American Pipe and Plastics", "description": "This is a flag stop area.", "latitude": 42.087078, @@ -11006,7 +11006,7 @@ ] }, { - "id": "95110", + "id": "BCT_95110", "name": "Willow Run", "description": "This is a flag stop area.", "latitude": 42.08508, @@ -11020,7 +11020,7 @@ ] }, { - "id": "95112", + "id": "BCT_95112", "name": "American Pipe", "description": "This is a flag stop area.", "latitude": 42.08714, @@ -11034,7 +11034,7 @@ ] }, { - "id": "95113", + "id": "BCT_95113", "name": "Del Motel", "description": "This is a flag stop area.", "latitude": 42.104718, @@ -11048,7 +11048,7 @@ ] }, { - "id": "95114", + "id": "BCT_95114", "name": "Rocket Plaza", "description": "This is a flag stop area.", "latitude": 42.104507, @@ -11062,7 +11062,7 @@ ] }, { - "id": "95301", + "id": "BCT_95301", "name": "Conklin/Chambers", "description": "This is a flag stop area.", "latitude": 42.100649, @@ -11076,7 +11076,7 @@ ] }, { - "id": "95302", + "id": "BCT_95302", "name": "Conklin/Eureka Tent", "description": "This is a flag stop area.", "latitude": 42.1003758, @@ -11090,7 +11090,7 @@ ] }, { - "id": "95303", + "id": "BCT_95303", "name": "Conklin/Hobart Stone", "description": "This is a flag stop area.", "latitude": 42.0978085, @@ -11104,7 +11104,7 @@ ] }, { - "id": "95304", + "id": "BCT_95304", "name": "Conklin/Colesville Rd Ext", "description": "This is a flag stop area.", "latitude": 42.0945444, @@ -11118,7 +11118,7 @@ ] }, { - "id": "95305", + "id": "BCT_95305", "name": "Conklin/Terrace", "description": "This is a flag stop area.", "latitude": 42.0903487, @@ -11132,7 +11132,7 @@ ] }, { - "id": "95306", + "id": "BCT_95306", "name": "Conklin/Shaw", "description": "This is a flag stop area.", "latitude": 42.0798264, @@ -11146,7 +11146,7 @@ ] }, { - "id": "95307", + "id": "BCT_95307", "name": "Conklin/Susquehanna", "description": "This is a flag stop area.", "latitude": 42.076313, @@ -11160,7 +11160,7 @@ ] }, { - "id": "95308", + "id": "BCT_95308", "name": "Powers Rd", "description": "This is a flag stop area.", "latitude": 42.064484, @@ -11174,7 +11174,7 @@ ] }, { - "id": "95309", + "id": "BCT_95309", "name": "Broome Corporate Park", "description": "This is a flag stop area.", "latitude": 42.063261, @@ -11188,7 +11188,7 @@ ] }, { - "id": "95310", + "id": "BCT_95310", "name": "Broome Corporate Park", "description": "This is a flag stop area.", "latitude": 42.061556, @@ -11202,7 +11202,7 @@ ] }, { - "id": "95310.1", + "id": "BCT_95310.1", "name": "Broome Corporate Park", "description": "This is a flag stop area.", "latitude": 42.060006, @@ -11216,7 +11216,7 @@ ] }, { - "id": "95311", + "id": "BCT_95311", "name": "Broome Corporate Park", "description": "This is a flag stop area.", "latitude": 42.056664, @@ -11230,7 +11230,7 @@ ] }, { - "id": "95311.1", + "id": "BCT_95311.1", "name": "Broome Corporate Park", "description": "This is a flag stop area.", "latitude": 42.055235, @@ -11244,7 +11244,7 @@ ] }, { - "id": "95312", + "id": "BCT_95312", "name": "Broome Corporate Park", "description": "This is a flag stop area.", "latitude": 42.052711, @@ -11258,7 +11258,7 @@ ] }, { - "id": "95312.1", + "id": "BCT_95312.1", "name": "Broome Corporate Park", "description": "This is a flag stop area.", "latitude": 42.048886, @@ -11272,7 +11272,7 @@ ] }, { - "id": "95312.2", + "id": "BCT_95312.2", "name": "Broome Corporate Park", "description": "This is a flag stop area.", "latitude": 42.045778, @@ -11286,7 +11286,7 @@ ] }, { - "id": "95313", + "id": "BCT_95313", "name": "Broome Corp Park", "description": "This is a flag stop area.", "latitude": 42.041166, @@ -11300,7 +11300,7 @@ ] }, { - "id": "95314", + "id": "BCT_95314", "name": "Universal Instruments", "description": "This is a flag stop area.", "latitude": 42.03772, @@ -11314,7 +11314,7 @@ ] }, { - "id": "95314.1", + "id": "BCT_95314.1", "name": "Corporate Dr/Conklin", "description": "This is a flag stop area.", "latitude": 42.035993, @@ -11328,7 +11328,7 @@ ] }, { - "id": "95314.2", + "id": "BCT_95314.2", "name": "Conklin/Millburn", "description": "This is a flag stop area.", "latitude": 42.038639, @@ -11342,7 +11342,7 @@ ] }, { - "id": "95314.3", + "id": "BCT_95314.3", "name": "Dick's Warehouse", "description": "This is a flag stop area.", "latitude": 42.040886, @@ -11356,7 +11356,7 @@ ] }, { - "id": "95315", + "id": "BCT_95315", "name": "Conklin/Walter", "description": "This is a flag stop area.", "latitude": 42.050263, @@ -11370,7 +11370,7 @@ ] }, { - "id": "95316", + "id": "BCT_95316", "name": "Donnelly Elementary School", "description": "This is a flag stop area.", "latitude": 42.061584, @@ -11384,7 +11384,7 @@ ] }, { - "id": "95317", + "id": "BCT_95317", "name": "Conklin/Fairlane", "description": "This is a flag stop area.", "latitude": 42.0702262, @@ -11398,7 +11398,7 @@ ] }, { - "id": "95318", + "id": "BCT_95318", "name": "Conklin/Eva", "description": "This is a flag stop area.", "latitude": 42.0771388, @@ -11412,7 +11412,7 @@ ] }, { - "id": "95319", + "id": "BCT_95319", "name": "Conklin/Shaw", "description": "This is a flag stop area.", "latitude": 42.0799658, @@ -11426,7 +11426,7 @@ ] }, { - "id": "95320", + "id": "BCT_95320", "name": "Conklin/Terrace", "description": "This is a flag stop area.", "latitude": 42.090293, @@ -11440,7 +11440,7 @@ ] }, { - "id": "95321", + "id": "BCT_95321", "name": "Conklin/Colesville Rd Ext", "description": "This is a flag stop area.", "latitude": 42.0947196, @@ -11454,7 +11454,7 @@ ] }, { - "id": "95322", + "id": "BCT_95322", "name": "Conklin/Hobart Stone", "description": "This is a flag stop area.", "latitude": 42.0981269, @@ -11468,7 +11468,7 @@ ] }, { - "id": "95323", + "id": "BCT_95323", "name": "Conklin/Eureka Tent", "description": "This is a flag stop area.", "latitude": 42.1006026, @@ -11482,7 +11482,7 @@ ] }, { - "id": "95565", + "id": "BCT_95565", "name": "Taft/Smith", "description": "This is a flag stops located near Taft/Smith (on request only)", "latitude": 42.117149, @@ -11496,7 +11496,7 @@ ] }, { - "id": "95567", + "id": "BCT_95567", "name": "Newell/Taft", "description": "This is a flag stops located near Newell/Taft (on request only)", "latitude": 42.118736, @@ -11510,7 +11510,7 @@ ] }, { - "id": "95569", + "id": "BCT_95569", "name": "Newell/Woodrow", "description": "This is a flag stops located near Newell/Woodrow (on request only)", "latitude": 42.117493, @@ -11524,7 +11524,7 @@ ] }, { - "id": "95571", + "id": "BCT_95571", "name": "Newell/Pine", "description": "This is a flag stops located near Newell/Pine (on request only)", "latitude": 42.11544, @@ -11538,7 +11538,7 @@ ] }, { - "id": "95591", + "id": "BCT_95591", "name": "434 E/Airborne", "description": "This flag stop is located before Brady Ln in front of the former Lourdes Medical Bldg", "latitude": 42.089847, @@ -11552,7 +11552,7 @@ ] }, { - "id": "95799", + "id": "BCT_95799", "name": "Vestal Pkwy/Roberts Eye Care", "description": "This is a flag stop area.", "latitude": 42.0969043, @@ -11568,7 +11568,7 @@ ] }, { - "id": "95907", + "id": "BCT_95907", "name": "North/Nanticoke", "description": "This is a flag stop on North St near the Cider Mill", "latitude": 42.098019, @@ -11582,7 +11582,7 @@ ] }, { - "id": "95907.1", + "id": "BCT_95907.1", "name": "Nanticoke/North", "description": "This is a flag stop on North St near the Cider Mill", "latitude": 42.09825, @@ -11596,7 +11596,7 @@ ] }, { - "id": "95909", + "id": "BCT_95909", "name": "North/Madison", "description": "This is a flag stop that is located before the insection and across from CVS", "latitude": 42.104443, @@ -11610,7 +11610,7 @@ ] }, { - "id": "95911", + "id": "BCT_95911", "name": "Cornell/Jenkins", "description": "This is a flag stop located near Absolute Nursing Endicott", "latitude": 42.112663, @@ -11624,7 +11624,7 @@ ] }, { - "id": "95920", + "id": "BCT_95920", "name": "Glendale/Jane Lacey", "description": "This is a flag stop near Summit Chase Apts heading south", "latitude": 42.102264, @@ -11638,7 +11638,7 @@ ] }, { - "id": "95921", + "id": "BCT_95921", "name": "Glendale/Jane Lacey", "description": "This is a flag stop near Summit Chase Apts heading north", "latitude": 42.101997430431, @@ -11654,7 +11654,7 @@ ] }, { - "id": "1554a", + "id": "BCT_1554a", "name": "Baldwin/Pleasant", "description": "The stop is located after the intersection with Pleasant St in Johnson City.", "latitude": 42.111159, @@ -11668,7 +11668,7 @@ ] }, { - "id": "1554b", + "id": "BCT_1554b", "name": "BU Pharmacy School", "description": "The stop is located near the BU Pharmacy School", "latitude": 42.113027, @@ -11682,7 +11682,7 @@ ] }, { - "id": "1554c", + "id": "BCT_1554c", "name": "Willow/Grand", "description": "The stop is located at the corner before Grand Ave- Johnson City", "latitude": 42.111044, @@ -11696,7 +11696,7 @@ ] }, { - "id": "bcj", + "id": "BCT_bcj", "name": "BC Junction", "description": "BC Junction Bus Station", "latitude": 42.1015658403894, @@ -11706,7 +11706,7 @@ "route_ids": [] }, { - "id": "3", + "id": "OCCT_3", "name": "Denny's (OB)", "description": null, "latitude": 42.0944709777832, @@ -11728,7 +11728,7 @@ ] }, { - "id": "5", + "id": "OCCT_5", "name": "Floral & Ackley (OB)", "description": null, "latitude": 42.1073417663574, @@ -11742,7 +11742,7 @@ ] }, { - "id": "9", + "id": "OCCT_9", "name": "Floral & Burbank (OB)", "description": null, "latitude": 42.1084480285645, @@ -11756,7 +11756,7 @@ ] }, { - "id": "10", + "id": "OCCT_10", "name": "Floral & Cleveland (OB)", "description": null, "latitude": 42.1089553833008, @@ -11770,7 +11770,7 @@ ] }, { - "id": "6", + "id": "OCCT_6", "name": "Floral & Harrison (OB)", "description": null, "latitude": 42.1075897216797, @@ -11784,7 +11784,7 @@ ] }, { - "id": "11", + "id": "OCCT_11", "name": "Floral & Main (OB)", "description": null, "latitude": 42.1110305786133, @@ -11798,7 +11798,7 @@ ] }, { - "id": "4", + "id": "OCCT_4", "name": "Floral & New York (OB)", "description": null, "latitude": 42.1070404052734, @@ -11812,7 +11812,7 @@ ] }, { - "id": "7", + "id": "OCCT_7", "name": "Floral & Roberts (OB)", "description": null, "latitude": 42.1078758239746, @@ -11826,7 +11826,7 @@ ] }, { - "id": "8", + "id": "OCCT_8", "name": "Floral & Willow (OB)", "description": null, "latitude": 42.1081123352051, @@ -11840,7 +11840,7 @@ ] }, { - "id": "20", + "id": "OCCT_20", "name": "Hawley & Court (OB)", "description": null, "latitude": 42.098560333252, @@ -11854,7 +11854,7 @@ ] }, { - "id": "17", + "id": "OCCT_17", "name": "Main & Arthur (OB)", "description": null, "latitude": 42.1003913879395, @@ -11870,7 +11870,7 @@ ] }, { - "id": "16", + "id": "OCCT_16", "name": "Main & Cedar (OB)", "description": null, "latitude": 42.1022415161133, @@ -11886,7 +11886,7 @@ ] }, { - "id": "15", + "id": "OCCT_15", "name": "Main & Clarke (OB)", "description": null, "latitude": 42.1031761169434, @@ -11902,7 +11902,7 @@ ] }, { - "id": "132", + "id": "OCCT_132", "name": "Main & Crestmont (OB)", "description": null, "latitude": 42.1082992553711, @@ -11918,7 +11918,7 @@ ] }, { - "id": "19", + "id": "OCCT_19", "name": "Main & Front (OB)", "description": null, "latitude": 42.098762512207, @@ -11934,7 +11934,7 @@ ] }, { - "id": "13", + "id": "OCCT_13", "name": "Main & Helen (OB)", "description": null, "latitude": 42.10693359375, @@ -11950,7 +11950,7 @@ ] }, { - "id": "12", + "id": "OCCT_12", "name": "Main & Matthews (OB)", "description": null, "latitude": 42.1095199584961, @@ -11966,7 +11966,7 @@ ] }, { - "id": "18", + "id": "OCCT_18", "name": "Main & Murray (OB)", "description": null, "latitude": 42.0994873046875, @@ -11982,7 +11982,7 @@ ] }, { - "id": "14", + "id": "OCCT_14", "name": "Main & Schiller (OB)", "description": null, "latitude": 42.1053428649902, @@ -11998,7 +11998,7 @@ ] }, { - "id": "2", + "id": "OCCT_2", "name": "Physical Facilities (OB)", "description": null, "latitude": 42.0913124084473, @@ -12020,7 +12020,7 @@ ] }, { - "id": "21", + "id": "OCCT_21", "name": "University Downtown Center (South)", "description": null, "latitude": 42.0956192016602, @@ -12044,7 +12044,7 @@ ] }, { - "id": "1", + "id": "OCCT_1", "name": "University Union", "description": null, "latitude": 42.0870208740234, @@ -12082,7 +12082,7 @@ ] }, { - "id": "32", + "id": "OCCT_32", "name": "Academic A", "description": null, "latitude": 42.0887184143066, @@ -12106,7 +12106,7 @@ ] }, { - "id": "43", + "id": "OCCT_43", "name": "Court & Hawley (IB)", "description": null, "latitude": 42.0988121032715, @@ -12122,7 +12122,7 @@ ] }, { - "id": "55", + "id": "OCCT_55", "name": "Floral & Burbank (IB)", "description": null, "latitude": 42.1086578369141, @@ -12136,7 +12136,7 @@ ] }, { - "id": "54", + "id": "OCCT_54", "name": "Floral & Cleveland (IB)", "description": null, "latitude": 42.1091613769531, @@ -12150,7 +12150,7 @@ ] }, { - "id": "60", + "id": "OCCT_60", "name": "Floral & Cook (IB)", "description": null, "latitude": 42.1071891784668, @@ -12164,7 +12164,7 @@ ] }, { - "id": "58", + "id": "OCCT_58", "name": "Floral & Harrison (IB)", "description": null, "latitude": 42.1078033447266, @@ -12178,7 +12178,7 @@ ] }, { - "id": "53", + "id": "OCCT_53", "name": "Floral & Main (IB)", "description": null, "latitude": 42.1107978820801, @@ -12192,7 +12192,7 @@ ] }, { - "id": "57", + "id": "OCCT_57", "name": "Floral & Roberts (IB)", "description": null, "latitude": 42.1080780029297, @@ -12206,7 +12206,7 @@ ] }, { - "id": "59", + "id": "OCCT_59", "name": "Floral & St Charles (IB)", "description": null, "latitude": 42.1075286865234, @@ -12220,7 +12220,7 @@ ] }, { - "id": "56", + "id": "OCCT_56", "name": "Floral & Willow (IB)", "description": null, "latitude": 42.1083488464356, @@ -12234,7 +12234,7 @@ ] }, { - "id": "47", + "id": "OCCT_47", "name": "Main & Cedar (IB)", "description": null, "latitude": 42.1024131774902, @@ -12250,7 +12250,7 @@ ] }, { - "id": "48", + "id": "OCCT_48", "name": "Main & Clarke (IB)", "description": null, "latitude": 42.1032600402832, @@ -12266,7 +12266,7 @@ ] }, { - "id": "52", + "id": "OCCT_52", "name": "Main & Crary (IB)", "description": null, "latitude": 42.1099548339844, @@ -12280,7 +12280,7 @@ ] }, { - "id": "51", + "id": "OCCT_51", "name": "Main & Crestmont (IB)", "description": null, "latitude": 42.1090469360352, @@ -12296,7 +12296,7 @@ ] }, { - "id": "44", + "id": "OCCT_44", "name": "Main & Front (IB)", "description": null, "latitude": 42.0989456176758, @@ -12312,7 +12312,7 @@ ] }, { - "id": "50", + "id": "OCCT_50", "name": "Main & Helen (IB)", "description": null, "latitude": 42.1074371337891, @@ -12328,7 +12328,7 @@ ] }, { - "id": "46", + "id": "OCCT_46", "name": "Main & Mather (IB)", "description": null, "latitude": 42.1005592346191, @@ -12344,7 +12344,7 @@ ] }, { - "id": "45", + "id": "OCCT_45", "name": "Main & Murray (IB)", "description": null, "latitude": 42.0996780395508, @@ -12360,7 +12360,7 @@ ] }, { - "id": "49", + "id": "OCCT_49", "name": "Main & Schiller (IB)", "description": null, "latitude": 42.1051940917969, @@ -12376,7 +12376,7 @@ ] }, { - "id": "61", + "id": "OCCT_61", "name": "Mohawk", "description": null, "latitude": 42.0869369506836, @@ -12406,7 +12406,7 @@ ] }, { - "id": "118", + "id": "OCCT_118", "name": "Rafuse", "description": null, "latitude": 42.0874557495117, @@ -12428,7 +12428,7 @@ ] }, { - "id": "42", + "id": "OCCT_42", "name": "University Downtown Center (North)", "description": null, "latitude": 42.0952110290527, @@ -12448,7 +12448,7 @@ ] }, { - "id": "39", + "id": "OCCT_39", "name": "Leroy & Chestnut (OB)", "description": null, "latitude": 42.0956840515137, @@ -12462,7 +12462,7 @@ ] }, { - "id": "38", + "id": "OCCT_38", "name": "Leroy & Laurel (OB)", "description": null, "latitude": 42.0954780578613, @@ -12476,7 +12476,7 @@ ] }, { - "id": "40", + "id": "OCCT_40", "name": "Leroy & Murray (OB)", "description": null, "latitude": 42.0954551696777, @@ -12490,7 +12490,7 @@ ] }, { - "id": "37", + "id": "OCCT_37", "name": "Riverside & Beethoven (OB)", "description": null, "latitude": 42.0927467346191, @@ -12504,7 +12504,7 @@ ] }, { - "id": "35", + "id": "OCCT_35", "name": "Riverside & Columbus (OB)", "description": null, "latitude": 42.099292755127, @@ -12518,7 +12518,7 @@ ] }, { - "id": "34", + "id": "OCCT_34", "name": "Riverside & Elfred (OB)", "description": null, "latitude": 42.1003227233887, @@ -12532,7 +12532,7 @@ ] }, { - "id": "33", + "id": "OCCT_33", "name": "Riverside & Ethel (OB)", "description": null, "latitude": 42.1020736694336, @@ -12546,7 +12546,7 @@ ] }, { - "id": "41", + "id": "OCCT_41", "name": "Riverside & Front (OB)", "description": null, "latitude": 42.0928115844727, @@ -12560,7 +12560,7 @@ ] }, { - "id": "36", + "id": "OCCT_36", "name": "Riverside & Margaret (OB)", "description": null, "latitude": 42.0980491638184, @@ -12574,7 +12574,7 @@ ] }, { - "id": "26", + "id": "OCCT_26", "name": "Leroy & Beethoven (IB)", "description": null, "latitude": 42.0954360961914, @@ -12588,7 +12588,7 @@ ] }, { - "id": "24", + "id": "OCCT_24", "name": "Leroy & Chestnut (IB)", "description": null, "latitude": 42.095817565918, @@ -12602,7 +12602,7 @@ ] }, { - "id": "22", + "id": "OCCT_22", "name": "Leroy & Front (IB)", "description": null, "latitude": 42.0950965881348, @@ -12616,7 +12616,7 @@ ] }, { - "id": "25", + "id": "OCCT_25", "name": "Leroy & Laurel (IB)", "description": null, "latitude": 42.0956192016602, @@ -12630,7 +12630,7 @@ ] }, { - "id": "23", + "id": "OCCT_23", "name": "Leroy & Murray (IB)", "description": null, "latitude": 42.0955696105957, @@ -12644,7 +12644,7 @@ ] }, { - "id": "27", + "id": "OCCT_27", "name": "Riverside & Beethoven (IB)", "description": null, "latitude": 42.0925369262695, @@ -12658,7 +12658,7 @@ ] }, { - "id": "29", + "id": "OCCT_29", "name": "Riverside & Columbus (IB)", "description": null, "latitude": 42.0994644165039, @@ -12672,7 +12672,7 @@ ] }, { - "id": "30", + "id": "OCCT_30", "name": "Riverside & Elfred (IB)", "description": null, "latitude": 42.1005401611328, @@ -12686,7 +12686,7 @@ ] }, { - "id": "31", + "id": "OCCT_31", "name": "Riverside & Ethel (IB)", "description": null, "latitude": 42.102222442627, @@ -12700,7 +12700,7 @@ ] }, { - "id": "28", + "id": "OCCT_28", "name": "Riverside & Margaret (IB)", "description": null, "latitude": 42.0981483459473, @@ -12714,7 +12714,7 @@ ] }, { - "id": "64", + "id": "OCCT_64", "name": "Couper Administration", "description": null, "latitude": 42.0896911621094, @@ -12732,7 +12732,7 @@ ] }, { - "id": "65", + "id": "OCCT_65", "name": "East Gym", "description": null, "latitude": 42.0909729003906, @@ -12750,7 +12750,7 @@ ] }, { - "id": "68", + "id": "OCCT_68", "name": "Hayes", "description": null, "latitude": 42.0882949829102, @@ -12766,7 +12766,7 @@ ] }, { - "id": "67", + "id": "OCCT_67", "name": "Meadows", "description": null, "latitude": 42.0893135070801, @@ -12782,7 +12782,7 @@ ] }, { - "id": "63", + "id": "OCCT_63", "name": "Newing", "description": null, "latitude": 42.0884552001953, @@ -12800,7 +12800,7 @@ ] }, { - "id": "134", + "id": "OCCT_134", "name": "Oxford & Murray Hill", "description": null, "latitude": 42.0882606506348, @@ -12816,7 +12816,7 @@ ] }, { - "id": "66", + "id": "OCCT_66", "name": "UCLUB", "description": null, "latitude": 42.0924949645996, @@ -12832,7 +12832,7 @@ ] }, { - "id": "69", + "id": "OCCT_69", "name": "Washington & Lehigh", "description": null, "latitude": 42.0825347900391, @@ -12848,7 +12848,7 @@ ] }, { - "id": "112", + "id": "OCCT_112", "name": "Clearview", "description": null, "latitude": 42.0890884399414, @@ -12862,7 +12862,7 @@ ] }, { - "id": "62", + "id": "OCCT_62", "name": "Dickinson", "description": null, "latitude": 42.0872459411621, @@ -12876,7 +12876,7 @@ ] }, { - "id": "117", + "id": "OCCT_117", "name": "Engineering Building", "description": null, "latitude": 42.0868263244629, @@ -12890,7 +12890,7 @@ ] }, { - "id": "114", + "id": "OCCT_114", "name": "Hillside", "description": null, "latitude": 42.0871200561523, @@ -12904,7 +12904,7 @@ ] }, { - "id": "116", + "id": "OCCT_116", "name": "Hinman", "description": null, "latitude": 42.0883369445801, @@ -12918,7 +12918,7 @@ ] }, { - "id": "115", + "id": "OCCT_115", "name": "Mountainview", "description": null, "latitude": 42.0840263366699, @@ -12932,7 +12932,7 @@ ] }, { - "id": "111", + "id": "OCCT_111", "name": "Physical Facilities (CS)", "description": null, "latitude": 42.0915908813477, @@ -12946,7 +12946,7 @@ ] }, { - "id": "113", + "id": "OCCT_113", "name": "Susquehanna", "description": null, "latitude": 42.0862503051758, @@ -12960,7 +12960,7 @@ ] }, { - "id": "110", + "id": "OCCT_110", "name": "West Gym", "description": null, "latitude": 42.091724395752, @@ -12974,7 +12974,7 @@ ] }, { - "id": "125", + "id": "OCCT_125", "name": "Barnes & Noble", "description": null, "latitude": 42.0970573425293, @@ -12988,7 +12988,7 @@ ] }, { - "id": "123", + "id": "OCCT_123", "name": "Burris & Rano", "description": null, "latitude": 42.0915031433106, @@ -13002,7 +13002,7 @@ ] }, { - "id": "119", + "id": "OCCT_119", "name": "Chuck E. Cheese", "description": null, "latitude": 42.0961303710938, @@ -13016,7 +13016,7 @@ ] }, { - "id": "127", + "id": "OCCT_127", "name": "Denny's (IB)", "description": null, "latitude": 42.0949859619141, @@ -13030,7 +13030,7 @@ ] }, { - "id": "122", + "id": "OCCT_122", "name": "Hollybrook", "description": null, "latitude": 42.0917320251465, @@ -13044,7 +13044,7 @@ ] }, { - "id": "128", + "id": "OCCT_128", "name": "Physical Facilities (IB)", "description": null, "latitude": 42.0917854309082, @@ -13058,7 +13058,7 @@ ] }, { - "id": "120", + "id": "OCCT_120", "name": "Riviera Ridge 1", "description": null, "latitude": 42.0938186645508, @@ -13072,7 +13072,7 @@ ] }, { - "id": "121", + "id": "OCCT_121", "name": "Riviera Ridge 2", "description": null, "latitude": 42.0919227600098, @@ -13086,7 +13086,7 @@ ] }, { - "id": "124", + "id": "OCCT_124", "name": "Target", "description": null, "latitude": 42.0932884216309, @@ -13100,7 +13100,7 @@ ] }, { - "id": "126", + "id": "OCCT_126", "name": "Walmart", "description": null, "latitude": 42.0965156555176, @@ -13114,7 +13114,7 @@ ] }, { - "id": "129", + "id": "OCCT_129", "name": "Oakdale Commons", "description": null, "latitude": 42.1278686523438, @@ -13128,7 +13128,7 @@ ] }, { - "id": "130", + "id": "OCCT_130", "name": "Wegman's", "description": null, "latitude": 42.1232643127441, @@ -13142,7 +13142,7 @@ ] }, { - "id": "133", + "id": "OCCT_133", "name": "Stone Fox Courtyard", "description": null, "latitude": 42.0972938537598, @@ -13152,7 +13152,7 @@ "route_ids": [] }, { - "id": "155", + "id": "OCCT_155", "name": "Gannett Building", "description": null, "latitude": 42.1168785095215, @@ -13168,7 +13168,7 @@ ] }, { - "id": "76", + "id": "OCCT_76", "name": "Jennison & Main (OB)", "description": null, "latitude": 42.1139984130859, @@ -13182,7 +13182,7 @@ ] }, { - "id": "71", + "id": "OCCT_71", "name": "Main & Albert (OB)", "description": null, "latitude": 42.115650177002, @@ -13196,7 +13196,7 @@ ] }, { - "id": "70", + "id": "OCCT_70", "name": "Main & Baker (OB)", "description": null, "latitude": 42.1155662536621, @@ -13210,7 +13210,7 @@ ] }, { - "id": "73", + "id": "OCCT_73", "name": "Main & Baldwin (OB)", "description": null, "latitude": 42.1157684326172, @@ -13224,7 +13224,7 @@ ] }, { - "id": "78", + "id": "OCCT_78", "name": "Main & Floral (OB)", "description": null, "latitude": 42.1114006042481, @@ -13238,7 +13238,7 @@ ] }, { - "id": "77", + "id": "OCCT_77", "name": "Main & Lester (OB)", "description": null, "latitude": 42.113338470459, @@ -13252,7 +13252,7 @@ ] }, { - "id": "72", + "id": "OCCT_72", "name": "Main & St Charles (OB)", "description": null, "latitude": 42.1156997680664, @@ -13266,7 +13266,7 @@ ] }, { - "id": "75", + "id": "OCCT_75", "name": "Nursing School", "description": null, "latitude": 42.1131401062012, @@ -13280,7 +13280,7 @@ ] }, { - "id": "74", + "id": "OCCT_74", "name": "Pharmacy School (OB)", "description": null, "latitude": 42.1130180358887, @@ -13294,7 +13294,7 @@ ] }, { - "id": "85", + "id": "OCCT_85", "name": "Main & 1st (IB)", "description": null, "latitude": 42.1157722473145, @@ -13308,7 +13308,7 @@ ] }, { - "id": "83", + "id": "OCCT_83", "name": "Main & Baldwin (IB)", "description": null, "latitude": 42.1159133911133, @@ -13322,7 +13322,7 @@ ] }, { - "id": "79", + "id": "OCCT_79", "name": "Main & Floral (IB)", "description": null, "latitude": 42.1114387512207, @@ -13336,7 +13336,7 @@ ] }, { - "id": "80", + "id": "OCCT_80", "name": "Main & Lester (IB)", "description": null, "latitude": 42.1134567260742, @@ -13350,7 +13350,7 @@ ] }, { - "id": "84", + "id": "OCCT_84", "name": "Main & St Charles (IB)", "description": null, "latitude": 42.1158065795898, @@ -13364,7 +13364,7 @@ ] }, { - "id": "81", + "id": "OCCT_81", "name": "Nursing School (IB)", "description": null, "latitude": 42.1133270263672, @@ -13378,7 +13378,7 @@ ] }, { - "id": "82", + "id": "OCCT_82", "name": "Pharmacy School (IB)", "description": null, "latitude": 42.113166809082, @@ -13392,7 +13392,7 @@ ] }, { - "id": "109", + "id": "OCCT_109", "name": "Innovative Technology Center", "description": null, "latitude": 42.0933609008789, @@ -13406,7 +13406,7 @@ ] }, { - "id": "151", + "id": "OCCT_151", "name": "BC Junction", "description": null, "latitude": 42.100715637207, @@ -13420,7 +13420,7 @@ ] }, { - "id": "145", + "id": "OCCT_145", "name": "Conklin Ave & Alfred St", "description": null, "latitude": 42.0942420959473, @@ -13434,7 +13434,7 @@ ] }, { - "id": "142", + "id": "OCCT_142", "name": "Conklin Ave & Livingston St", "description": null, "latitude": 42.0926666259766, @@ -13448,7 +13448,7 @@ ] }, { - "id": "140", + "id": "OCCT_140", "name": "Conklin Ave & S Washington St", "description": null, "latitude": 42.0913009643555, @@ -13462,7 +13462,7 @@ ] }, { - "id": "144", + "id": "OCCT_144", "name": "Conklin Ave & Telegraph St", "description": null, "latitude": 42.0936088562012, @@ -13476,7 +13476,7 @@ ] }, { - "id": "141", + "id": "OCCT_141", "name": "Conklin Ave & Tremont Ave", "description": null, "latitude": 42.0924530029297, @@ -13490,7 +13490,7 @@ ] }, { - "id": "148", + "id": "OCCT_148", "name": "Conklin Ave & Webster St", "description": null, "latitude": 42.0991363525391, @@ -13504,7 +13504,7 @@ ] }, { - "id": "154", + "id": "OCCT_154", "name": "Henry St & Liberty St", "description": null, "latitude": 42.1034736633301, @@ -13518,7 +13518,7 @@ ] }, { - "id": "150", + "id": "OCCT_150", "name": "Henry St & Mirabito Stadium", "description": null, "latitude": 42.1019439697266, @@ -13532,7 +13532,7 @@ ] }, { - "id": "143", + "id": "OCCT_143", "name": "Park Diner East", "description": null, "latitude": 42.0928993225098, @@ -13546,7 +13546,7 @@ ] }, { - "id": "153", + "id": "OCCT_153", "name": "State St & Court St", "description": null, "latitude": 42.0988464355469, @@ -13560,7 +13560,7 @@ ] }, { - "id": "147", + "id": "OCCT_147", "name": "Tomkins St & Jackson St", "description": null, "latitude": 42.0978393554688, @@ -13574,7 +13574,7 @@ ] }, { - "id": "146", + "id": "OCCT_146", "name": "Tompkins St & Conklin Ave", "description": null, "latitude": 42.0953330993652, @@ -13588,7 +13588,7 @@ ] }, { - "id": "138", + "id": "OCCT_138", "name": "Vestal Ave & Brookfield", "description": null, "latitude": 42.0857315063477, @@ -13602,7 +13602,7 @@ ] }, { - "id": "137", + "id": "OCCT_137", "name": "Vestal Ave & Hawthorne", "description": null, "latitude": 42.0860786437988, @@ -13616,7 +13616,7 @@ ] }, { - "id": "136", + "id": "OCCT_136", "name": "Vestal Ave & Larchmont", "description": null, "latitude": 42.0891876220703, @@ -13630,7 +13630,7 @@ ] }, { - "id": "139", + "id": "OCCT_139", "name": "Vestal Ave & Rush Ave", "description": null, "latitude": 42.0871887207031, diff --git a/src/server/GET_routes.json b/src/server/GET_routes.json index fe8faef..e01ec43 100644 --- a/src/server/GET_routes.json +++ b/src/server/GET_routes.json @@ -5,48 +5,48 @@ "full_name": "3) Park Ave", "short_name": "3", "stops": [ - "302", - "304", - "306", - "504", - "506", - "508", - "510", - "512", - "514", - "516", - "308", - "310", - "312", - "314", - "316", - "318", - "320", - "322", - "324", - "326", - "328", - "301", - "303", - "305", - "307", - "309", - "311", - "313", - "315", - "317", - "319", - "321", - "323", - "535", - "325.1", - "325.2", - "329", - "331", - "553", - "1.1", - "22", - "1" + "BCT_302", + "BCT_304", + "BCT_306", + "BCT_504", + "BCT_506", + "BCT_508", + "BCT_510", + "BCT_512", + "BCT_514", + "BCT_516", + "BCT_308", + "BCT_310", + "BCT_312", + "BCT_314", + "BCT_316", + "BCT_318", + "BCT_320", + "BCT_322", + "BCT_324", + "BCT_326", + "BCT_328", + "BCT_301", + "BCT_303", + "BCT_305", + "BCT_307", + "BCT_309", + "BCT_311", + "BCT_313", + "BCT_315", + "BCT_317", + "BCT_319", + "BCT_321", + "BCT_323", + "BCT_535", + "BCT_325.1", + "BCT_325.2", + "BCT_329", + "BCT_331", + "BCT_553", + "BCT_1.1", + "BCT_22", + "BCT_1" ] }, { @@ -55,39 +55,39 @@ "full_name": "5) Vestal Ave", "short_name": "5", "stops": [ - "500", - "502", - "504", - "506", - "508", - "510", - "512", - "514", - "516", - "518", - "520", - "522", - "524", - "526", - "528", - "530", - "532", - "534", - "536", - "538", - "540", - "542", - "544", - "546", - "548", - "550", - "552", - "554", - "556", - "558", - "560", - "562", - "6000" + "BCT_500", + "BCT_502", + "BCT_504", + "BCT_506", + "BCT_508", + "BCT_510", + "BCT_512", + "BCT_514", + "BCT_516", + "BCT_518", + "BCT_520", + "BCT_522", + "BCT_524", + "BCT_526", + "BCT_528", + "BCT_530", + "BCT_532", + "BCT_534", + "BCT_536", + "BCT_538", + "BCT_540", + "BCT_542", + "BCT_544", + "BCT_546", + "BCT_548", + "BCT_550", + "BCT_552", + "BCT_554", + "BCT_556", + "BCT_558", + "BCT_560", + "BCT_562", + "BCT_6000" ] }, { @@ -96,57 +96,57 @@ "full_name": "7) Clinton St", "short_name": "7", "stops": [ - "702", - "3502", - "806", - "808", - "704", - "706", - "708", - "710", - "712", - "714", - "716", - "718", - "720", - "722", - "724", - "726", - "728", - "730", - "732", - "734", - "736", - "738", - "740", - "742", - "744", - "746", - "748", - "750", - "752", - "754", - "756", - "758", - "760", - "762", - "764", - "766", - "768", - "770", - "772", - "774", - "776", - "778", - "780", - "782", - "784", - "786", - "788", - "790", - "792", - "794", - "3562.2" + "BCT_702", + "BCT_3502", + "BCT_806", + "BCT_808", + "BCT_704", + "BCT_706", + "BCT_708", + "BCT_710", + "BCT_712", + "BCT_714", + "BCT_716", + "BCT_718", + "BCT_720", + "BCT_722", + "BCT_724", + "BCT_726", + "BCT_728", + "BCT_730", + "BCT_732", + "BCT_734", + "BCT_736", + "BCT_738", + "BCT_740", + "BCT_742", + "BCT_744", + "BCT_746", + "BCT_748", + "BCT_750", + "BCT_752", + "BCT_754", + "BCT_756", + "BCT_758", + "BCT_760", + "BCT_762", + "BCT_764", + "BCT_766", + "BCT_768", + "BCT_770", + "BCT_772", + "BCT_774", + "BCT_776", + "BCT_778", + "BCT_780", + "BCT_782", + "BCT_784", + "BCT_786", + "BCT_788", + "BCT_790", + "BCT_792", + "BCT_794", + "BCT_3562.2" ] }, { @@ -155,47 +155,47 @@ "full_name": "8) Front St", "short_name": "8", "stops": [ - "802", - "3502", - "806", - "808", - "810", - "812", - "814", - "818", - "8001", - "822", - "824", - "826", - "826.1", - "828", - "830", - "832", - "834", - "836", - "838", - "838.1", - "840", - "842", - "844", - "846", - "848", - "850", - "852", - "854", - "4064", - "4066", - "4068", - "4070", - "4072", - "4074", - "4076", - "4078", - "4080", - "4082", - "4084", - "4086", - "801" + "BCT_802", + "BCT_3502", + "BCT_806", + "BCT_808", + "BCT_810", + "BCT_812", + "BCT_814", + "BCT_818", + "BCT_8001", + "BCT_822", + "BCT_824", + "BCT_826", + "BCT_826.1", + "BCT_828", + "BCT_830", + "BCT_832", + "BCT_834", + "BCT_836", + "BCT_838", + "BCT_838.1", + "BCT_840", + "BCT_842", + "BCT_844", + "BCT_846", + "BCT_848", + "BCT_850", + "BCT_852", + "BCT_854", + "BCT_4064", + "BCT_4066", + "BCT_4068", + "BCT_4070", + "BCT_4072", + "BCT_4074", + "BCT_4076", + "BCT_4078", + "BCT_4080", + "BCT_4082", + "BCT_4084", + "BCT_4086", + "BCT_801" ] }, { @@ -204,25 +204,25 @@ "full_name": "12) Conkin Av", "short_name": "12", "stops": [ - "1201", - "1203", - "1205", - "1207", - "1209", - "1211", - "1213", - "1215", - "1217", - "1219", - "1221", - "1223", - "1225", - "1227", - "1229", - "1231", - "1233", - "22", - "1" + "BCT_1201", + "BCT_1203", + "BCT_1205", + "BCT_1207", + "BCT_1209", + "BCT_1211", + "BCT_1213", + "BCT_1215", + "BCT_1217", + "BCT_1219", + "BCT_1221", + "BCT_1223", + "BCT_1225", + "BCT_1227", + "BCT_1229", + "BCT_1231", + "BCT_1233", + "BCT_22", + "BCT_1" ] }, { @@ -231,45 +231,45 @@ "full_name": "15) Leroy St", "short_name": "15", "stops": [ - "1500", - "1502", - "3504", - "1508", - "1510", - "1512", - "1514", - "1516", - "1518", - "1520", - "1522", - "1524", - "1526", - "1528", - "1530", - "1532", - "1534", - "1536", - "1538", - "1540", - "1542", - "1544", - "1546", - "1548", - "1550", - "1552", - "1554", - "1554a", - "1554b", - "1554c", - "1556", - "1558", - "1560", - "1562", - "1564", - "1566", - "6003", - "6002", - "6000" + "BCT_1500", + "BCT_1502", + "BCT_3504", + "BCT_1508", + "BCT_1510", + "BCT_1512", + "BCT_1514", + "BCT_1516", + "BCT_1518", + "BCT_1520", + "BCT_1522", + "BCT_1524", + "BCT_1526", + "BCT_1528", + "BCT_1530", + "BCT_1532", + "BCT_1534", + "BCT_1536", + "BCT_1538", + "BCT_1540", + "BCT_1542", + "BCT_1544", + "BCT_1546", + "BCT_1548", + "BCT_1550", + "BCT_1552", + "BCT_1554", + "BCT_1554a", + "BCT_1554b", + "BCT_1554c", + "BCT_1556", + "BCT_1558", + "BCT_1560", + "BCT_1562", + "BCT_1564", + "BCT_1566", + "BCT_6003", + "BCT_6002", + "BCT_6000" ] }, { @@ -278,29 +278,29 @@ "full_name": "16) BU Express", "short_name": "16", "stops": [ - "3504", - "3508", - "3510", - "3512", - "3514", - "3516", - "3518", - "3520", - "3522", - "3524", - "3526", - "1711", - "1713", - "1715", - "1717", - "1552", - "1554", - "1556", - "1558", - "1560", - "6011", - "3502", - "3504" + "BCT_3504", + "BCT_3508", + "BCT_3510", + "BCT_3512", + "BCT_3514", + "BCT_3516", + "BCT_3518", + "BCT_3520", + "BCT_3522", + "BCT_3524", + "BCT_3526", + "BCT_1711", + "BCT_1713", + "BCT_1715", + "BCT_1717", + "BCT_1552", + "BCT_1554", + "BCT_1556", + "BCT_1558", + "BCT_1560", + "BCT_6011", + "BCT_3502", + "BCT_3504" ] }, { @@ -309,44 +309,44 @@ "full_name": "17) Johnson City", "short_name": "17", "stops": [ - "748", - "750", - "752", - "754", - "756", - "758", - "760", - "762", - "764", - "766", - "768", - "772", - "776", - "1701", - "1703", - "1705", - "1707", - "3619", - "3621", - "1711", - "1713", - "1715", - "1717", - "1552", - "1554", - "1556", - "1558", - "1560", - "1562", - "4706", - "4708", - "4710", - "4712", - "4714", - "4716", - "1566", - "6003", - "6011" + "BCT_748", + "BCT_750", + "BCT_752", + "BCT_754", + "BCT_756", + "BCT_758", + "BCT_760", + "BCT_762", + "BCT_764", + "BCT_766", + "BCT_768", + "BCT_772", + "BCT_776", + "BCT_1701", + "BCT_1703", + "BCT_1705", + "BCT_1707", + "BCT_3619", + "BCT_3621", + "BCT_1711", + "BCT_1713", + "BCT_1715", + "BCT_1717", + "BCT_1552", + "BCT_1554", + "BCT_1556", + "BCT_1558", + "BCT_1560", + "BCT_1562", + "BCT_4706", + "BCT_4708", + "BCT_4710", + "BCT_4712", + "BCT_4714", + "BCT_4716", + "BCT_1566", + "BCT_6003", + "BCT_6011" ] }, { @@ -355,56 +355,56 @@ "full_name": "28) Robinson St", "short_name": "28", "stops": [ - "2802", - "2804", - "2806", - "2808", - "2810", - "2812", - "2814", - "2816", - "2818", - "2820", - "2822", - "2824", - "2826", - "2828", - "2830", - "2832", - "2834", - "2836", - "2838", - "2844", - "2846", - "2848", - "2850", - "2852", - "2854", - "2856", - "2858", - "2860", - "2862", - "2864", - "2866", - "2868", - "2801", - "2803", - "2805", - "2807", - "2809", - "2811", - "2813", - "2815", - "2817", - "2819", - "2821", - "2823", - "2825", - "2827", - "2829", - "2831", - "2833", - "1" + "BCT_2802", + "BCT_2804", + "BCT_2806", + "BCT_2808", + "BCT_2810", + "BCT_2812", + "BCT_2814", + "BCT_2816", + "BCT_2818", + "BCT_2820", + "BCT_2822", + "BCT_2824", + "BCT_2826", + "BCT_2828", + "BCT_2830", + "BCT_2832", + "BCT_2834", + "BCT_2836", + "BCT_2838", + "BCT_2844", + "BCT_2846", + "BCT_2848", + "BCT_2850", + "BCT_2852", + "BCT_2854", + "BCT_2856", + "BCT_2858", + "BCT_2860", + "BCT_2862", + "BCT_2864", + "BCT_2866", + "BCT_2868", + "BCT_2801", + "BCT_2803", + "BCT_2805", + "BCT_2807", + "BCT_2809", + "BCT_2811", + "BCT_2813", + "BCT_2815", + "BCT_2817", + "BCT_2819", + "BCT_2821", + "BCT_2823", + "BCT_2825", + "BCT_2827", + "BCT_2829", + "BCT_2831", + "BCT_2833", + "BCT_1" ] }, { @@ -413,74 +413,74 @@ "full_name": "35) Endicott-Binghamton", "short_name": "35", "stops": [ - "3500", - "3502", - "3504", - "3508", - "3510", - "3512", - "3514", - "3516", - "3518", - "3520", - "3522", - "3524", - "3526", - "3528", - "3530", - "3534", - "3536", - "3538", - "3540", - "3544", - "3546", - "3550", - "3552", - "3554", - "3556", - "3558", - "3560", - "3562.2", - "3562.1", - "3562", - "3564", - "3566", - "3568", - "3570", - "3572", - "3574", - "3576", - "3602", - "3604", - "3606", - "3608", - "3610", - "3612", - "3614", - "3616", - "3618", - "3620", - "3622", - "3624", - "3626", - "3628", - "3630", - "3630.1", - "3632.1", - "5583", - "5583.1", - "3636", - "3638", - "3642", - "3644", - "3646", - "3648", - "3650", - "3652", - "3654", - "3656", - "3658", - "3501" + "BCT_3500", + "BCT_3502", + "BCT_3504", + "BCT_3508", + "BCT_3510", + "BCT_3512", + "BCT_3514", + "BCT_3516", + "BCT_3518", + "BCT_3520", + "BCT_3522", + "BCT_3524", + "BCT_3526", + "BCT_3528", + "BCT_3530", + "BCT_3534", + "BCT_3536", + "BCT_3538", + "BCT_3540", + "BCT_3544", + "BCT_3546", + "BCT_3550", + "BCT_3552", + "BCT_3554", + "BCT_3556", + "BCT_3558", + "BCT_3560", + "BCT_3562.2", + "BCT_3562.1", + "BCT_3562", + "BCT_3564", + "BCT_3566", + "BCT_3568", + "BCT_3570", + "BCT_3572", + "BCT_3574", + "BCT_3576", + "BCT_3602", + "BCT_3604", + "BCT_3606", + "BCT_3608", + "BCT_3610", + "BCT_3612", + "BCT_3614", + "BCT_3616", + "BCT_3618", + "BCT_3620", + "BCT_3622", + "BCT_3624", + "BCT_3626", + "BCT_3628", + "BCT_3630", + "BCT_3630.1", + "BCT_3632.1", + "BCT_5583", + "BCT_5583.1", + "BCT_3636", + "BCT_3638", + "BCT_3642", + "BCT_3644", + "BCT_3646", + "BCT_3648", + "BCT_3650", + "BCT_3652", + "BCT_3654", + "BCT_3656", + "BCT_3658", + "BCT_3501" ] }, { @@ -489,40 +489,40 @@ "full_name": "40) Chenango St", "short_name": "40", "stops": [ - "4076", - "4078", - "4080", - "4082", - "4084", - "4086", - "801", - "4003", - "4005", - "4007", - "4009", - "4011", - "4013", - "4015", - "4017", - "4019", - "4021", - "4023", - "4025", - "4027", - "4029", - "4031", - "4033", - "4035", - "4037", - "4039", - "4041", - "4043", - "4045", - "4047", - "4053", - "2831", - "2833", - "1" + "BCT_4076", + "BCT_4078", + "BCT_4080", + "BCT_4082", + "BCT_4084", + "BCT_4086", + "BCT_801", + "BCT_4003", + "BCT_4005", + "BCT_4007", + "BCT_4009", + "BCT_4011", + "BCT_4013", + "BCT_4015", + "BCT_4017", + "BCT_4019", + "BCT_4021", + "BCT_4023", + "BCT_4025", + "BCT_4027", + "BCT_4029", + "BCT_4031", + "BCT_4033", + "BCT_4035", + "BCT_4037", + "BCT_4039", + "BCT_4041", + "BCT_4043", + "BCT_4045", + "BCT_4047", + "BCT_4053", + "BCT_2831", + "BCT_2833", + "BCT_1" ] }, { @@ -531,40 +531,40 @@ "full_name": ") 40/8 Combo", "short_name": "", "stops": [ - "4002", - "2804", - "2806", - "4096", - "4098", - "4010", - "4012", - "4014", - "4016", - "4018", - "4020", - "4022", - "4024", - "818", - "822", - "824", - "826", - "826.1", - "828", - "830", - "832", - "834", - "836", - "838", - "838.1", - "840", - "842", - "844", - "846", - "848", - "850", - "852", - "854", - "801" + "BCT_4002", + "BCT_2804", + "BCT_2806", + "BCT_4096", + "BCT_4098", + "BCT_4010", + "BCT_4012", + "BCT_4014", + "BCT_4016", + "BCT_4018", + "BCT_4020", + "BCT_4022", + "BCT_4024", + "BCT_818", + "BCT_822", + "BCT_824", + "BCT_826", + "BCT_826.1", + "BCT_828", + "BCT_830", + "BCT_832", + "BCT_834", + "BCT_836", + "BCT_838", + "BCT_838.1", + "BCT_840", + "BCT_842", + "BCT_844", + "BCT_846", + "BCT_848", + "BCT_850", + "BCT_852", + "BCT_854", + "BCT_801" ] }, { @@ -573,60 +573,60 @@ "full_name": "47) Vestal", "short_name": "47", "stops": [ - "5551", - "5553", - "5555", - "5557", - "5559", - "3606", - "3608", - "3610", - "3612", - "5561", - "5563", - "95565", - "95567", - "95569", - "95571", - "5573", - "5575", - "5577", - "5579", - "5581", - "5583", - "3636", - "3638", - "3642", - "3644", - "5585", - "5587", - "5589", - "95591", - "5593", - "4736", - "4701", - "4703", - "4709.1", - "4707.1", - "4705.1", - "4711", - "4713", - "4715", - "4717", - "4719", - "4721", - "4723", - "4725", - "4727", - "4729", - "4731", - "4733", - "4735", - "4737", - "1566", - "6003", - "6002", - "6000" + "BCT_5551", + "BCT_5553", + "BCT_5555", + "BCT_5557", + "BCT_5559", + "BCT_3606", + "BCT_3608", + "BCT_3610", + "BCT_3612", + "BCT_5561", + "BCT_5563", + "BCT_95565", + "BCT_95567", + "BCT_95569", + "BCT_95571", + "BCT_5573", + "BCT_5575", + "BCT_5577", + "BCT_5579", + "BCT_5581", + "BCT_5583", + "BCT_3636", + "BCT_3638", + "BCT_3642", + "BCT_3644", + "BCT_5585", + "BCT_5587", + "BCT_5589", + "BCT_95591", + "BCT_5593", + "BCT_4736", + "BCT_4701", + "BCT_4703", + "BCT_4709.1", + "BCT_4707.1", + "BCT_4705.1", + "BCT_4711", + "BCT_4713", + "BCT_4715", + "BCT_4717", + "BCT_4719", + "BCT_4721", + "BCT_4723", + "BCT_4725", + "BCT_4727", + "BCT_4729", + "BCT_4731", + "BCT_4733", + "BCT_4735", + "BCT_4737", + "BCT_1566", + "BCT_6003", + "BCT_6002", + "BCT_6000" ] }, { @@ -635,11 +635,11 @@ "full_name": "48) Shoppers Express Oakdale Mall", "short_name": "48", "stops": [ - "3562.2", - "3562.1", - "3562", - "5714", - "6000" + "BCT_3562.2", + "BCT_3562.1", + "BCT_3562", + "BCT_5714", + "BCT_6000" ] }, { @@ -648,21 +648,21 @@ "full_name": "51) K Commuter", "short_name": "51", "stops": [ - "5200", - "1204", - "1206", - "1208", - "95114", - "95101", - "95102", - "95103", - "95104", - "95105", - "95106", - "95107", - "95108", - "95109", - "95110" + "BCT_5200", + "BCT_1204", + "BCT_1206", + "BCT_1208", + "BCT_95114", + "BCT_95101", + "BCT_95102", + "BCT_95103", + "BCT_95104", + "BCT_95105", + "BCT_95106", + "BCT_95107", + "BCT_95108", + "BCT_95109", + "BCT_95110" ] }, { @@ -671,37 +671,37 @@ "full_name": "53) Corporate Park", "short_name": "53", "stops": [ - "95309", - "95310", - "95310.1", - "95311", - "95311.1", - "95312", - "95312.1", - "95312.2", - "95313", - "95314", - "95314.1", - "95314.2", - "95314.3", - "95315", - "95316", - "95317", - "95318", - "95319", - "95320", - "95103", - "95321", - "95322", - "95323", - "1209", - "1211", - "1213", - "1215", - "1217", - "1219", - "549", - "1" + "BCT_95309", + "BCT_95310", + "BCT_95310.1", + "BCT_95311", + "BCT_95311.1", + "BCT_95312", + "BCT_95312.1", + "BCT_95312.2", + "BCT_95313", + "BCT_95314", + "BCT_95314.1", + "BCT_95314.2", + "BCT_95314.3", + "BCT_95315", + "BCT_95316", + "BCT_95317", + "BCT_95318", + "BCT_95319", + "BCT_95320", + "BCT_95103", + "BCT_95321", + "BCT_95322", + "BCT_95323", + "BCT_1209", + "BCT_1211", + "BCT_1213", + "BCT_1215", + "BCT_1217", + "BCT_1219", + "BCT_549", + "BCT_1" ] }, { @@ -710,39 +710,39 @@ "full_name": "57) Shoppers Special", "short_name": "57", "stops": [ - "8802", - "4702", - "5706", - "95799", - "5710", - "4730", - "4734", - "4736", - "5712", - "3562.2", - "3562.1", - "3562", - "5714", - "2301", - "2303", - "2305", - "2307", - "2309", - "2311", - "2313", - "2315", - "2317", - "2319", - "2321", - "2323", - "2325", - "2325.1", - "2327", - "2329", - "5716", - "5718", - "3645", - "1" + "BCT_8802", + "BCT_4702", + "BCT_5706", + "BCT_95799", + "BCT_5710", + "BCT_4730", + "BCT_4734", + "BCT_4736", + "BCT_5712", + "BCT_3562.2", + "BCT_3562.1", + "BCT_3562", + "BCT_5714", + "BCT_2301", + "BCT_2303", + "BCT_2305", + "BCT_2307", + "BCT_2309", + "BCT_2311", + "BCT_2313", + "BCT_2315", + "BCT_2317", + "BCT_2319", + "BCT_2321", + "BCT_2323", + "BCT_2325", + "BCT_2325.1", + "BCT_2327", + "BCT_2329", + "BCT_5716", + "BCT_5718", + "BCT_3645", + "BCT_1" ] }, { @@ -751,16 +751,16 @@ "full_name": "91) Shoppers Special Express", "short_name": "91", "stops": [ - "6000", - "6004", - "5704", - "4702", - "5706", - "95799", - "5710", - "4730", - "4734", - "4736" + "BCT_6000", + "BCT_6004", + "BCT_5704", + "BCT_4702", + "BCT_5706", + "BCT_95799", + "BCT_5710", + "BCT_4730", + "BCT_4734", + "BCT_4736" ] }, { @@ -769,69 +769,69 @@ "full_name": ") 28/40 Combo", "short_name": "", "stops": [ - "2802", - "2804", - "2806", - "2808", - "2810", - "2812", - "2814", - "2816", - "2818", - "2820", - "2822", - "2824", - "2826", - "2828", - "2830", - "2832", - "2834", - "2836", - "2838", - "2844", - "2846", - "2848", - "2850", - "2852", - "2854", - "2856", - "2858", - "2860", - "2862", - "2864", - "2866", - "2868", - "2801", - "2803", - "2805", - "2807", - "2809", - "2811", - "2813", - "2815", - "2817", - "2819", - "2821", - "2823", - "2825", - "2827", - "2829", - "4096", - "4098", - "4010", - "4012", - "4014", - "4016", - "4018", - "4020", - "4022", - "4024", - "4026", - "4028", - "4030", - "4032", - "4034", - "1" + "BCT_2802", + "BCT_2804", + "BCT_2806", + "BCT_2808", + "BCT_2810", + "BCT_2812", + "BCT_2814", + "BCT_2816", + "BCT_2818", + "BCT_2820", + "BCT_2822", + "BCT_2824", + "BCT_2826", + "BCT_2828", + "BCT_2830", + "BCT_2832", + "BCT_2834", + "BCT_2836", + "BCT_2838", + "BCT_2844", + "BCT_2846", + "BCT_2848", + "BCT_2850", + "BCT_2852", + "BCT_2854", + "BCT_2856", + "BCT_2858", + "BCT_2860", + "BCT_2862", + "BCT_2864", + "BCT_2866", + "BCT_2868", + "BCT_2801", + "BCT_2803", + "BCT_2805", + "BCT_2807", + "BCT_2809", + "BCT_2811", + "BCT_2813", + "BCT_2815", + "BCT_2817", + "BCT_2819", + "BCT_2821", + "BCT_2823", + "BCT_2825", + "BCT_2827", + "BCT_2829", + "BCT_4096", + "BCT_4098", + "BCT_4010", + "BCT_4012", + "BCT_4014", + "BCT_4016", + "BCT_4018", + "BCT_4020", + "BCT_4022", + "BCT_4024", + "BCT_4026", + "BCT_4028", + "BCT_4030", + "BCT_4032", + "BCT_4034", + "BCT_1" ] }, { @@ -840,92 +840,92 @@ "full_name": ") 12/28/40 Combo", "short_name": "", "stops": [ - "1202", - "1204", - "1206", - "1208", - "1210", - "1212", - "1214", - "1216", - "1218", - "1220", - "1222", - "1224", - "1226", - "1228", - "1230", - "1201", - "1203", - "1205", - "1207", - "1209", - "1211", - "1213", - "1215", - "1217", - "1219", - "1221", - "1223", - "1225", - "2812", - "2814", - "2816", - "2818", - "2820", - "2822", - "2824", - "2826", - "2828", - "2830", - "2832", - "2834", - "2836", - "2838", - "2844", - "2846", - "2848", - "2850", - "2852", - "2854", - "2856", - "2858", - "2860", - "2862", - "2864", - "2866", - "2868", - "2801", - "2803", - "2805", - "2807", - "2809", - "2811", - "2813", - "2815", - "2817", - "2819", - "2821", - "2823", - "2825", - "2827", - "2829", - "4096", - "4098", - "4010", - "4012", - "4014", - "4016", - "4018", - "4020", - "4022", - "4024", - "4026", - "4028", - "4030", - "4032", - "4034", - "1" + "BCT_1202", + "BCT_1204", + "BCT_1206", + "BCT_1208", + "BCT_1210", + "BCT_1212", + "BCT_1214", + "BCT_1216", + "BCT_1218", + "BCT_1220", + "BCT_1222", + "BCT_1224", + "BCT_1226", + "BCT_1228", + "BCT_1230", + "BCT_1201", + "BCT_1203", + "BCT_1205", + "BCT_1207", + "BCT_1209", + "BCT_1211", + "BCT_1213", + "BCT_1215", + "BCT_1217", + "BCT_1219", + "BCT_1221", + "BCT_1223", + "BCT_1225", + "BCT_2812", + "BCT_2814", + "BCT_2816", + "BCT_2818", + "BCT_2820", + "BCT_2822", + "BCT_2824", + "BCT_2826", + "BCT_2828", + "BCT_2830", + "BCT_2832", + "BCT_2834", + "BCT_2836", + "BCT_2838", + "BCT_2844", + "BCT_2846", + "BCT_2848", + "BCT_2850", + "BCT_2852", + "BCT_2854", + "BCT_2856", + "BCT_2858", + "BCT_2860", + "BCT_2862", + "BCT_2864", + "BCT_2866", + "BCT_2868", + "BCT_2801", + "BCT_2803", + "BCT_2805", + "BCT_2807", + "BCT_2809", + "BCT_2811", + "BCT_2813", + "BCT_2815", + "BCT_2817", + "BCT_2819", + "BCT_2821", + "BCT_2823", + "BCT_2825", + "BCT_2827", + "BCT_2829", + "BCT_4096", + "BCT_4098", + "BCT_4010", + "BCT_4012", + "BCT_4014", + "BCT_4016", + "BCT_4018", + "BCT_4020", + "BCT_4022", + "BCT_4024", + "BCT_4026", + "BCT_4028", + "BCT_4030", + "BCT_4032", + "BCT_4034", + "BCT_1" ] }, { @@ -934,106 +934,106 @@ "full_name": ") 12/28/40/5 Combo", "short_name": "", "stops": [ - "1202", - "2804", - "2806", - "4096", - "4098", - "4010", - "4012", - "4014", - "4016", - "4018", - "4020", - "4022", - "4024", - "4026", - "4028", - "4030", - "4032", - "4034", - "2826", - "2828", - "2830", - "2832", - "2834", - "2836", - "2838", - "2844", - "2846", - "2848", - "2850", - "2852", - "2854", - "2856", - "2858", - "2860", - "2862", - "2864", - "2866", - "2868", - "2801", - "2803", - "2805", - "2807", - "2809", - "2811", - "2813", - "2815", - "2817", - "2819", - "2821", - "2823", - "2825", - "1210", - "1212", - "1214", - "1216", - "1218", - "1220", - "1222", - "1224", - "1226", - "1228", - "1230", - "1201", - "1203", - "1205", - "1207", - "1209", - "1211", - "1213", - "1215", - "1217", - "1219", - "510", - "512", - "514", - "516", - "518", - "520", - "522", - "524", - "526", - "528", - "530", - "532", - "534", - "536", - "538", - "540", - "542", - "544", - "546", - "548", - "550", - "552", - "554", - "556", - "558", - "560", - "562", - "6000" + "BCT_1202", + "BCT_2804", + "BCT_2806", + "BCT_4096", + "BCT_4098", + "BCT_4010", + "BCT_4012", + "BCT_4014", + "BCT_4016", + "BCT_4018", + "BCT_4020", + "BCT_4022", + "BCT_4024", + "BCT_4026", + "BCT_4028", + "BCT_4030", + "BCT_4032", + "BCT_4034", + "BCT_2826", + "BCT_2828", + "BCT_2830", + "BCT_2832", + "BCT_2834", + "BCT_2836", + "BCT_2838", + "BCT_2844", + "BCT_2846", + "BCT_2848", + "BCT_2850", + "BCT_2852", + "BCT_2854", + "BCT_2856", + "BCT_2858", + "BCT_2860", + "BCT_2862", + "BCT_2864", + "BCT_2866", + "BCT_2868", + "BCT_2801", + "BCT_2803", + "BCT_2805", + "BCT_2807", + "BCT_2809", + "BCT_2811", + "BCT_2813", + "BCT_2815", + "BCT_2817", + "BCT_2819", + "BCT_2821", + "BCT_2823", + "BCT_2825", + "BCT_1210", + "BCT_1212", + "BCT_1214", + "BCT_1216", + "BCT_1218", + "BCT_1220", + "BCT_1222", + "BCT_1224", + "BCT_1226", + "BCT_1228", + "BCT_1230", + "BCT_1201", + "BCT_1203", + "BCT_1205", + "BCT_1207", + "BCT_1209", + "BCT_1211", + "BCT_1213", + "BCT_1215", + "BCT_1217", + "BCT_1219", + "BCT_510", + "BCT_512", + "BCT_514", + "BCT_516", + "BCT_518", + "BCT_520", + "BCT_522", + "BCT_524", + "BCT_526", + "BCT_528", + "BCT_530", + "BCT_532", + "BCT_534", + "BCT_536", + "BCT_538", + "BCT_540", + "BCT_542", + "BCT_544", + "BCT_546", + "BCT_548", + "BCT_550", + "BCT_552", + "BCT_554", + "BCT_556", + "BCT_558", + "BCT_560", + "BCT_562", + "BCT_6000" ] }, { @@ -1042,32 +1042,32 @@ "full_name": ") 12/53 Combo", "short_name": "", "stops": [ - "1202", - "1204", - "1206", - "1208", - "1210", - "1212", - "1214", - "1216", - "1218", - "1220", - "1222", - "1224", - "1226", - "1228", - "1230", - "1201", - "95301", - "95302", - "95303", - "95304", - "95103", - "95305", - "95306", - "95307", - "95308", - "95309" + "BCT_1202", + "BCT_1204", + "BCT_1206", + "BCT_1208", + "BCT_1210", + "BCT_1212", + "BCT_1214", + "BCT_1216", + "BCT_1218", + "BCT_1220", + "BCT_1222", + "BCT_1224", + "BCT_1226", + "BCT_1228", + "BCT_1230", + "BCT_1201", + "BCT_95301", + "BCT_95302", + "BCT_95303", + "BCT_95304", + "BCT_95103", + "BCT_95305", + "BCT_95306", + "BCT_95307", + "BCT_95308", + "BCT_95309" ] }, { @@ -1076,65 +1076,65 @@ "full_name": ") 12/3 Combo", "short_name": "", "stops": [ - "1202", - "1204", - "1206", - "1208", - "1210", - "1212", - "1214", - "1216", - "1218", - "1220", - "1222", - "1224", - "1226", - "1228", - "1230", - "1201", - "1203", - "1205", - "1207", - "1209", - "1211", - "1213", - "1215", - "1217", - "1219", - "510", - "512", - "514", - "516", - "308", - "310", - "312", - "314", - "316", - "318", - "320", - "322", - "324", - "326", - "328", - "301", - "303", - "305", - "307", - "309", - "311", - "313", - "315", - "317", - "319", - "321", - "323", - "535", - "325.1", - "325.2", - "329", - "331", - "553", - "1" + "BCT_1202", + "BCT_1204", + "BCT_1206", + "BCT_1208", + "BCT_1210", + "BCT_1212", + "BCT_1214", + "BCT_1216", + "BCT_1218", + "BCT_1220", + "BCT_1222", + "BCT_1224", + "BCT_1226", + "BCT_1228", + "BCT_1230", + "BCT_1201", + "BCT_1203", + "BCT_1205", + "BCT_1207", + "BCT_1209", + "BCT_1211", + "BCT_1213", + "BCT_1215", + "BCT_1217", + "BCT_1219", + "BCT_510", + "BCT_512", + "BCT_514", + "BCT_516", + "BCT_308", + "BCT_310", + "BCT_312", + "BCT_314", + "BCT_316", + "BCT_318", + "BCT_320", + "BCT_322", + "BCT_324", + "BCT_326", + "BCT_328", + "BCT_301", + "BCT_303", + "BCT_305", + "BCT_307", + "BCT_309", + "BCT_311", + "BCT_313", + "BCT_315", + "BCT_317", + "BCT_319", + "BCT_321", + "BCT_323", + "BCT_535", + "BCT_325.1", + "BCT_325.2", + "BCT_329", + "BCT_331", + "BCT_553", + "BCT_1" ] }, { @@ -1143,28 +1143,28 @@ "full_name": "Westside Outbound", "short_name": "WS O", "stops": [ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "132", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "21" + "OCCT_1", + "OCCT_2", + "OCCT_3", + "OCCT_4", + "OCCT_5", + "OCCT_6", + "OCCT_7", + "OCCT_8", + "OCCT_9", + "OCCT_10", + "OCCT_11", + "OCCT_12", + "OCCT_132", + "OCCT_13", + "OCCT_14", + "OCCT_15", + "OCCT_16", + "OCCT_17", + "OCCT_18", + "OCCT_19", + "OCCT_20", + "OCCT_21" ] }, { @@ -1173,29 +1173,29 @@ "full_name": "Westside Inbound", "short_name": "WS I", "stops": [ - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "52", - "53", - "54", - "55", - "56", - "57", - "58", - "59", - "60", - "32", - "118", - "1", - "61" + "OCCT_42", + "OCCT_43", + "OCCT_44", + "OCCT_45", + "OCCT_46", + "OCCT_47", + "OCCT_48", + "OCCT_49", + "OCCT_50", + "OCCT_51", + "OCCT_52", + "OCCT_53", + "OCCT_54", + "OCCT_55", + "OCCT_56", + "OCCT_57", + "OCCT_58", + "OCCT_59", + "OCCT_60", + "OCCT_32", + "OCCT_118", + "OCCT_1", + "OCCT_61" ] }, { @@ -1204,19 +1204,19 @@ "full_name": "Downtown Center Leroy Outbound", "short_name": "DCL O", "stops": [ - "1", - "2", - "3", - "33", - "34", - "35", - "36", - "37", - "38", - "39", - "40", - "41", - "42" + "OCCT_1", + "OCCT_2", + "OCCT_3", + "OCCT_33", + "OCCT_34", + "OCCT_35", + "OCCT_36", + "OCCT_37", + "OCCT_38", + "OCCT_39", + "OCCT_40", + "OCCT_41", + "OCCT_42" ] }, { @@ -1225,21 +1225,21 @@ "full_name": "Downtown Center Leroy Inbound", "short_name": "DCL I", "stops": [ - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "118", - "61", - "1" + "OCCT_21", + "OCCT_22", + "OCCT_23", + "OCCT_24", + "OCCT_25", + "OCCT_26", + "OCCT_27", + "OCCT_28", + "OCCT_29", + "OCCT_30", + "OCCT_31", + "OCCT_32", + "OCCT_118", + "OCCT_61", + "OCCT_1" ] }, { @@ -1248,16 +1248,16 @@ "full_name": "UCLUB", "short_name": "UC", "stops": [ - "61", - "63", - "64", - "65", - "66", - "67", - "68", - "69", - "134", - "1" + "OCCT_61", + "OCCT_63", + "OCCT_64", + "OCCT_65", + "OCCT_66", + "OCCT_67", + "OCCT_68", + "OCCT_69", + "OCCT_134", + "OCCT_1" ] }, { @@ -1266,20 +1266,20 @@ "full_name": "Campus Shuttle", "short_name": "CS", "stops": [ - "61", - "117", - "62", - "63", - "64", - "65", - "110", - "111", - "112", - "113", - "114", - "115", - "116", - "1" + "OCCT_61", + "OCCT_117", + "OCCT_62", + "OCCT_63", + "OCCT_64", + "OCCT_65", + "OCCT_110", + "OCCT_111", + "OCCT_112", + "OCCT_113", + "OCCT_114", + "OCCT_115", + "OCCT_116", + "OCCT_1" ] }, { @@ -1288,22 +1288,22 @@ "full_name": "Riviera Ridge - Town Square Mall", "short_name": "RRT", "stops": [ - "118", - "2", - "3", - "119", - "120", - "121", - "122", - "123", - "124", - "125", - "126", - "127", - "128", - "32", - "61", - "1" + "OCCT_118", + "OCCT_2", + "OCCT_3", + "OCCT_119", + "OCCT_120", + "OCCT_121", + "OCCT_122", + "OCCT_123", + "OCCT_124", + "OCCT_125", + "OCCT_126", + "OCCT_127", + "OCCT_128", + "OCCT_32", + "OCCT_61", + "OCCT_1" ] }, { @@ -1312,14 +1312,14 @@ "full_name": "Oakdale Commons", "short_name": "OC", "stops": [ - "118", - "2", - "3", - "129", - "130", - "32", - "61", - "1" + "OCCT_118", + "OCCT_2", + "OCCT_3", + "OCCT_129", + "OCCT_130", + "OCCT_32", + "OCCT_61", + "OCCT_1" ] }, { @@ -1328,9 +1328,9 @@ "full_name": "University Downtown Center Outbound", "short_name": "UDC O", "stops": [ - "1", - "21", - "42" + "OCCT_1", + "OCCT_21", + "OCCT_42" ] }, { @@ -1339,11 +1339,11 @@ "full_name": "University Downtown Center Inbound", "short_name": "UDC I", "stops": [ - "21", - "32", - "118", - "1", - "61" + "OCCT_21", + "OCCT_32", + "OCCT_118", + "OCCT_1", + "OCCT_61" ] }, { @@ -1352,29 +1352,29 @@ "full_name": "Main Street Outbound", "short_name": "MS O", "stops": [ - "1", - "2", - "3", - "70", - "71", - "72", - "73", - "74", - "75", - "76", - "77", - "155", - "78", - "12", - "132", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "21" + "OCCT_1", + "OCCT_2", + "OCCT_3", + "OCCT_70", + "OCCT_71", + "OCCT_72", + "OCCT_73", + "OCCT_74", + "OCCT_75", + "OCCT_76", + "OCCT_77", + "OCCT_155", + "OCCT_78", + "OCCT_12", + "OCCT_132", + "OCCT_13", + "OCCT_14", + "OCCT_15", + "OCCT_16", + "OCCT_17", + "OCCT_18", + "OCCT_19", + "OCCT_21" ] }, { @@ -1383,27 +1383,27 @@ "full_name": "Main Street Inbound", "short_name": "MS I", "stops": [ - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "51", - "79", - "155", - "80", - "81", - "82", - "83", - "84", - "85", - "32", - "61", - "1" + "OCCT_42", + "OCCT_43", + "OCCT_44", + "OCCT_45", + "OCCT_46", + "OCCT_47", + "OCCT_48", + "OCCT_49", + "OCCT_50", + "OCCT_51", + "OCCT_79", + "OCCT_155", + "OCCT_80", + "OCCT_81", + "OCCT_82", + "OCCT_83", + "OCCT_84", + "OCCT_85", + "OCCT_32", + "OCCT_61", + "OCCT_1" ] }, { @@ -1412,16 +1412,16 @@ "full_name": "ITC - UCLUB", "short_name": "IU", "stops": [ - "61", - "63", - "64", - "65", - "109", - "66", - "67", - "68", - "134", - "69" + "OCCT_61", + "OCCT_63", + "OCCT_64", + "OCCT_65", + "OCCT_109", + "OCCT_66", + "OCCT_67", + "OCCT_68", + "OCCT_134", + "OCCT_69" ] }, { @@ -1430,25 +1430,25 @@ "full_name": "Downtown Southside Outbound", "short_name": "DSO", "stops": [ - "136", - "137", - "1", - "138", - "139", - "140", - "141", - "142", - "143", - "144", - "145", - "146", - "147", - "148", - "154", - "150", - "151", - "153", - "21" + "OCCT_136", + "OCCT_137", + "OCCT_1", + "OCCT_138", + "OCCT_139", + "OCCT_140", + "OCCT_141", + "OCCT_142", + "OCCT_143", + "OCCT_144", + "OCCT_145", + "OCCT_146", + "OCCT_147", + "OCCT_148", + "OCCT_154", + "OCCT_150", + "OCCT_151", + "OCCT_153", + "OCCT_21" ] } ] \ No newline at end of file diff --git a/src/shared/.gitignore b/src/shared/.gitignore index 82cc80f..5dc167e 100644 --- a/src/shared/.gitignore +++ b/src/shared/.gitignore @@ -2,3 +2,5 @@ # Created by `dart pub` .dart_tool/ pubspec.lock +path.log +notes.md diff --git a/src/shared/bin/data.dart b/src/shared/bin/data.dart index f82e51c..650b157 100644 --- a/src/shared/bin/data.dart +++ b/src/shared/bin/data.dart @@ -1,6 +1,11 @@ import "package:shared/generator.dart"; -void main() async { - await Generator.stops.generate(); - await Generator.routes.generate(); +void main(List args) async { + if (args.contains("-n")) { // dry-run + await Generator.stops.parse(); + await Generator.routes.parse(); + } else { + await Generator.stops.generate(); + await Generator.routes.generate(); + } } diff --git a/src/shared/bin/path.dart b/src/shared/bin/path.dart deleted file mode 100644 index 4784eb3..0000000 --- a/src/shared/bin/path.dart +++ /dev/null @@ -1,147 +0,0 @@ -// User-facing script -// ignore_for_file: avoid_print - -import "package:a_star/a_star.dart"; -import "package:shared/generator.dart"; -import "package:shared/graph.dart"; - -import "package:shelf_router/shelf_router.dart"; -import "package:shelf/shelf.dart"; -import "package:shelf/shelf_io.dart" as io; - -// const startLat = 42.0924949645996; -// const startLong = -75.9538421630859; -// const endLat = 42.0869369506836; -// const endLong = -75.965934753418; - -const startLat = 42.092083; -const startLong = -75.952271; -const endLat = 42.080822; -const endLong = -75.912529; - -const numStops = 5; - -void log(String message) { - // print(message); -} - -Iterable findStopsNear(Coordinates location) { - log("Finding stops near $location..."); - final stopDistances = [ - for (final stop in StopState.stops.values) - (stop, stop.coordinates.distanceTo(location)), - ]; - stopDistances.sort((a, b) => a.$2.compareTo(b.$2)); - return stopDistances.take(numStops).map((pair) => pair.$1); -} - -void printStops(Iterable stops) { - log("Found stops:"); - for (final stop in stops) { - log("- ${stop.routes}, ${stop.name}"); - } -} - -Set findRoutes(Iterable stops) => { - for (final stop in stops) - ...stop.routeIDs, -}; - -Stop findStopWithRoute(Iterable stops, RouteID route) => - stops.firstWhere((stop) => stop.routeIDs.contains(route)); - -Future init() async { - print("Initializing..."); - final stops = await Generator.stops.parse(); - final routes = await Generator.routes.parse(); - StopState.init(routes, stops); -} - -final headers = { - "Access-Control-Allow-Origin": "*", -}; - -Future handleRequest(Request request) async { - final startLat = double.tryParse(request.url.queryParameters["start_lat"] ?? ""); - final startLong = double.tryParse(request.url.queryParameters["start_lon"] ?? ""); - final endLat = double.tryParse(request.url.queryParameters["end_lat"] ?? ""); - final endLong = double.tryParse(request.url.queryParameters["end_lon"] ?? ""); - if (startLat == null || startLong == null || endLat == null || endLong == null) { - return Response.badRequest(body: "Could not parse coordinates", headers: headers); - } - - final start = (lat: startLat, long: startLong); - final end = (lat: endLat, long: endLong); - - // 1) Find [numStops] nearest stops by the given locations - log("Finding nearest stops..."); - final startStops = findStopsNear(start); - printStops(startStops); - final endStops = findStopsNear(end); - printStops(endStops); - - // 2) Find all routes by those stops - log("Finding intersecting routes"); - final startRoutes = findRoutes(startStops); - final endRoutes = findRoutes(endStops); - log("Start routes: $startRoutes"); - log("End routes: $endRoutes"); - - // 3) Check for a direct route without transfers - final routesInCommon = startRoutes.intersection(endRoutes); - if (routesInCommon.isNotEmpty) { - final route = routesInCommon.first; - final startStop = findStopWithRoute(startStops, route); - final endStop = findStopWithRoute(endStops, route); - return Response.ok("\nBoard the $route at ${startStop.name} and get off at ${endStop.name}", headers: headers); - } - - // 4) Use A* to find a route with transfers - log("Using A*"); - final paths = >[]; - for (final startStop in startStops) { - for (final startRoute in startStop.routeIDs) { - for (final endStop in endStops) { - final state = StopState(stopID: startStop.id, goalID: endStop.id, routeID: startRoute, depth: 0); - log("Finding a route using ${state.hash()}"); - final result = aStar(state); - if (result == null) continue; - paths.add(result.reconstructPath()); - } - } - } - - if (paths.isEmpty) { - return Response.ok("No routes found", headers: headers); - } - - final minPath = paths.min((path) => path.length); - final buffer = StringBuffer(); - buffer.writeln("Found ${paths.length} paths, here's the best one with only ${minPath.length} steps:"); - StopState? prevStep; - var index = 0; - for (final step in minPath) { - index++; - final stop = StopState.stops[step.stopID]!; - final route = StopState.routes[step.routeID]!; - if (prevStep == null) { - buffer.writeln("$index. Board the ${route.provider.humanName} ${route.fullName} bus\n at ${stop.name}"); - } else if (index == minPath.length) { - buffer.writeln("$index. Get off at ${stop.name}"); - } else if (prevStep.routeID != step.routeID) { - buffer.writeln("$index. Transfer to the ${route.provider.humanName} ${route.fullName}"); - } else { - buffer.writeln("$index. Go to ${stop.name}"); - } - prevStep = step; - } - return Response.ok(buffer.toString(), headers: headers); -} - -void main() async { - await init(); - final router = Router(); - router.get("/path", handleRequest); - await io.serve(router.call, "localhost", 8001); - print("Listening on localhost:8001"); -} diff --git a/src/shared/bin/server.dart b/src/shared/bin/server.dart new file mode 100644 index 0000000..68d6396 --- /dev/null +++ b/src/shared/bin/server.dart @@ -0,0 +1,25 @@ +// User-facing script +// ignore_for_file: avoid_print + +import "package:shared/generator.dart"; +import "package:shared/graph.dart"; +import "package:shared/server.dart" as handlers; + +import "package:shelf_router/shelf_router.dart"; +import "package:shelf/shelf_io.dart" as io; + +Future init() async { + print("Initializing..."); + StopState.stops = await Generator.stops.parse(); + StopState.routes = await Generator.routes.parse(); +} + +void main() async { + await init(); + final router = Router(); + router.get("/path", handlers.getPath); + router.get("/stops", handlers.getStops); + router.get("/routes", handlers.getRoutes); + await io.serve(router.call, "localhost", 8001); + print("Listening on localhost:8001"); +} diff --git a/src/shared/bin/test.dart b/src/shared/bin/test.dart new file mode 100644 index 0000000..5b8eaaa --- /dev/null +++ b/src/shared/bin/test.dart @@ -0,0 +1,18 @@ +// User-facing script +// ignore_for_file: avoid_print + +import "package:shared/generator.dart"; + +void main(List args) async { + final provider = args.first; + final routeName = args.last; + final routes = await Generator.routes.parse(); + final stops = await Generator.stops.parse(); + final routeID = RouteID(Provider.fromJson(provider), routeName); + final route = routes[routeID]!; + print("Here are the stops for $route:"); + for (final stopID in route.stops) { + final stop = stops[stopID]!; + print("- $stop"); + } +} diff --git a/src/shared/lib/graph.dart b/src/shared/lib/graph.dart index 345cfc5..f4f6128 100644 --- a/src/shared/lib/graph.dart +++ b/src/shared/lib/graph.dart @@ -1 +1,2 @@ export "src/graph/state.dart"; +export "src/graph/algorithm.dart"; diff --git a/src/shared/lib/server.dart b/src/shared/lib/server.dart new file mode 100644 index 0000000..c998b08 --- /dev/null +++ b/src/shared/lib/server.dart @@ -0,0 +1,2 @@ +export "src/server/misc.dart"; +export "src/server/path.dart"; diff --git a/src/shared/lib/src/data/provider.dart b/src/shared/lib/src/data/provider.dart index 8a1aa95..13331e3 100644 --- a/src/shared/lib/src/data/provider.dart +++ b/src/shared/lib/src/data/provider.dart @@ -8,4 +8,7 @@ enum Provider { final String id; final String humanName; + + @override + String toString() => humanName; } diff --git a/src/shared/lib/src/data/route.dart b/src/shared/lib/src/data/route.dart index 254f4b4..9730524 100644 --- a/src/shared/lib/src/data/route.dart +++ b/src/shared/lib/src/data/route.dart @@ -34,7 +34,7 @@ class Route with Encodable { fullName = json["name"], stops = [ for (final stopID in (json["stops"] as List).cast()) - StopID(stopID.toString()), + StopID(Provider.occt, stopID.toString()), ]; Route.fromBcCsv(CsvRow csv) : @@ -44,6 +44,19 @@ class Route with Encodable { fullName = "${csv[2]}) ${csv[3]}", stops = []; + Route.fromJson(Json json) : + id = RouteID.fromJson(json["id"]), + provider = Provider.fromJson(json["provider"]), + fullName = json["full_name"], + shortName = json["short_name"], + stops = [ + for (final stopID in json["stops"]) + StopID.fromJson(stopID), + ]; + + @override + String toString() => "$provider $fullName"; + @override Json toJson() => { "id": id, diff --git a/src/shared/lib/src/data/stop.dart b/src/shared/lib/src/data/stop.dart index e8f480f..0c524eb 100644 --- a/src/shared/lib/src/data/stop.dart +++ b/src/shared/lib/src/data/stop.dart @@ -2,7 +2,8 @@ import "utils.dart"; import "route.dart"; import "provider.dart"; -extension type StopID(String id) { +extension type StopID._(String id) { + StopID(Provider provider, Object value) : id = "${provider.id}_$value"; StopID.fromJson(dynamic value) : id = value.toString(); } @@ -24,7 +25,7 @@ class Stop with Encodable { }) : routes = {}, routeIDs = {}; Stop.fromJson(Json json) : - id = StopID(json["id"]), + id = StopID.fromJson(json["id"]), name = json["name"], description = json["description"], coordinates = (lat: json["latitude"], long: json["longitude"]), @@ -36,7 +37,7 @@ class Stop with Encodable { }; Stop.fromOcctJson(Json json) : - id = StopID.fromJson(json["id"]), + id = StopID(Provider.occt, json["id"]), name = json["name"], description = null, coordinates = (lat: json["lat"], long: json["lng"]), @@ -44,6 +45,9 @@ class Stop with Encodable { routes = {}, routeIDs = {}; + @override + String toString() => name; + @override Map toJson() => { "id": id.id, diff --git a/src/shared/lib/src/data/utils.dart b/src/shared/lib/src/data/utils.dart index 6d0b16c..545a5a5 100644 --- a/src/shared/lib/src/data/utils.dart +++ b/src/shared/lib/src/data/utils.dart @@ -35,16 +35,27 @@ extension ListUtils on List { yield (i, this[i]); } } +} - E max(int Function(E) count) => reduce((a, b) { +extension IterableUtils on Iterable { + E max(num Function(E) count) => reduce((a, b) { final numA = count(a); final numB = count(b); return numA > numB ? a : b; }); - E min(int Function(E) count) => reduce((a, b) { + E min(num Function(E) count) => reduce((a, b) { final numA = count(a); final numB = count(b); return numA < numB ? a : b; }); + + double sum(double Function(E) transform) => fold( + 0, + (total, element) => total + transform(element), + ); +} + +void log(String message) { + // print(message); } diff --git a/src/shared/lib/src/generator/generator.dart b/src/shared/lib/src/generator/generator.dart index ddeccac..90043cd 100644 --- a/src/shared/lib/src/generator/generator.dart +++ b/src/shared/lib/src/generator/generator.dart @@ -3,9 +3,9 @@ import "dart:io"; import "package:shared/generator.dart"; -class Generator extends Parser { - final Parser bc; - final Parser occt; +class Generator extends Parser { + final Parser bc; + final Parser occt; final File outputFile; Generator({ @@ -15,14 +15,15 @@ class Generator extends Parser { }); @override - Future> parse() async => [ + Future> parse() async => { ...await bc.parse(), ...await occt.parse(), - ]; + }; Future generate() async { + final allData = await parse(); final result = [ - for (final data in await parse()) + for (final data in allData.values) data.toJson(), ]; const encoder = JsonEncoder.withIndent(" "); diff --git a/src/shared/lib/src/generator/routes_bc.dart b/src/shared/lib/src/generator/routes_bc.dart index 7c7d183..64a7b7e 100644 --- a/src/shared/lib/src/generator/routes_bc.dart +++ b/src/shared/lib/src/generator/routes_bc.dart @@ -5,7 +5,7 @@ import "stops_bc.dart"; typedef InOutTrips = (TripID, TripID); -class BcRoutesParser extends Parser { +class BcRoutesParser extends Parser { final routesFile = File(bcDataDir / "routes.txt"); final tripsFile = File(bcDataDir / "trips.txt"); @@ -31,7 +31,7 @@ class BcRoutesParser extends Parser { } @override - Future> parse() async { + Future> parse() async { final routes = await getRoutes(); final trips = await stopParser.getTrips(); final tripsForRoutes = await getTripForRoutes(trips); @@ -39,8 +39,9 @@ class BcRoutesParser extends Parser { for (final (routeID, route) in routes.records) { final longestTrip = tripsForRoutes[routeID]!; final stops = trips[longestTrip]!; + log("Chose $longestTrip as the longest trip for $routeID"); route.stops.addAll(stops); } - return routes.values; + return routes; } } diff --git a/src/shared/lib/src/generator/routes_occt.dart b/src/shared/lib/src/generator/routes_occt.dart index 0a82842..d049151 100644 --- a/src/shared/lib/src/generator/routes_occt.dart +++ b/src/shared/lib/src/generator/routes_occt.dart @@ -2,12 +2,12 @@ import "dart:io"; import "utils.dart"; -class OcctRoutesParser extends Parser { +class OcctRoutesParser extends Parser { final routesFile = File(occtDataDir / "routes.json"); @override - Future> parse() async => [ + Future> parse() async => { for (final routeJson in await readJson(routesFile)) - Route.fromOcctJson(routeJson), - ]; + RouteID(Provider.occt, routeJson["id"]): Route.fromOcctJson(routeJson), + }; } diff --git a/src/shared/lib/src/generator/stops_bc.dart b/src/shared/lib/src/generator/stops_bc.dart index adbb0f1..d3dd8e9 100644 --- a/src/shared/lib/src/generator/stops_bc.dart +++ b/src/shared/lib/src/generator/stops_bc.dart @@ -4,7 +4,7 @@ import "package:csv/csv.dart"; import "utils.dart"; -class BcStopParser extends Parser { +class BcStopParser extends Parser { static final tripsFile = File(bcDataDir / "stop_times.txt"); static final routesFile = File(bcDataDir / "trips.txt"); static final stopsFile = File(bcDataDir / "stops.txt"); @@ -15,7 +15,7 @@ class BcStopParser extends Parser { Future>> getTrips() async { final result = >{}; for (final row in await readCsv(tripsFile)) { - result.addToList(TripID(row[0]), StopID(row[3])); + result.addToList(TripID(row[0]), StopID(Provider.bc, row[3])); } return result; } @@ -34,7 +34,7 @@ class BcStopParser extends Parser { Future> getStops() async { final result = {}; for (final row in await readCsv(stopsFile)) { - final stopID = StopID(row[0]); + final stopID = StopID(Provider.bc, row[0]); final name = row[2]; final description = row[3]; final latitude = double.parse(row[4]); @@ -69,12 +69,12 @@ class BcStopParser extends Parser { } @override - Future> parse() async { + Future> parse() async { final trips = await getTrips(); final routes = await getRoutes(); final stops = await getStops(); final routeNames = await getRouteNames(); findRoutesForStops(stops: stops.values, trips: trips, routes: routes, routeNames: routeNames); - return stops.values; + return stops; } } diff --git a/src/shared/lib/src/generator/stops_occt.dart b/src/shared/lib/src/generator/stops_occt.dart index 72c0bf8..f879388 100644 --- a/src/shared/lib/src/generator/stops_occt.dart +++ b/src/shared/lib/src/generator/stops_occt.dart @@ -2,7 +2,7 @@ import "dart:io"; import "utils.dart"; -class OcctStopParser extends Parser { +class OcctStopParser extends Parser { /// Taken from: https://binghamtonupublic.etaspot.net/service.php?service=get_stops&token=TESTING static final stopsFile = File(occtDataDir / "stops.json"); @@ -12,7 +12,7 @@ class OcctStopParser extends Parser { Future> getStops() async { final result = {}; for (final stopJson in await readJson(stopsFile)) { - final id = StopID.fromJson(stopJson["id"]); + final id = StopID(Provider.occt, stopJson["id"]); result[id] ??= Stop.fromOcctJson(stopJson); } return result; @@ -21,7 +21,7 @@ class OcctStopParser extends Parser { Future>> getRoutes() async { final result = >{}; for (final json in await readJson(stopsFile)) { - final stopID = StopID.fromJson(json["id"]); + final stopID = StopID(Provider.occt, json["id"]); final routeID = RouteID(Provider.occt, json["rid"]); result.addToList(stopID, routeID); } @@ -34,7 +34,7 @@ class OcctStopParser extends Parser { }; @override - Future> parse() async { + Future> parse() async { final stops = await getStops(); final routes = await getRoutes(); final routeNames = await getRouteNames(); @@ -46,6 +46,6 @@ class OcctStopParser extends Parser { stop.addRoute(routeID, routeName); } } - return stops.values; + return stops; } } diff --git a/src/shared/lib/src/generator/utils.dart b/src/shared/lib/src/generator/utils.dart index 88da78d..260daaf 100644 --- a/src/shared/lib/src/generator/utils.dart +++ b/src/shared/lib/src/generator/utils.dart @@ -27,8 +27,8 @@ extension MapSetUtils on Map> { } } -abstract class Parser { - Future> parse(); +abstract class Parser { + Future> parse(); } final csvConverter = CsvCodec(shouldParseNumbers: false).decoder; diff --git a/src/shared/lib/src/graph/algorithm.dart b/src/shared/lib/src/graph/algorithm.dart new file mode 100644 index 0000000..e65434c --- /dev/null +++ b/src/shared/lib/src/graph/algorithm.dart @@ -0,0 +1,60 @@ +import "package:a_star/a_star.dart"; +import "package:shared/data.dart"; + +import "state.dart"; + +void printStops(Iterable stops) { + log("Found stops:"); + for (final stop in stops) { + log("- ${stop.routes}, ${stop.name}"); + } +} + +Iterable? findPath(Coordinates start, Coordinates end) { + // 1) Find [numStops] nearest stops by the given locations + log("Finding nearest stops..."); + final startStops = StopState.findStopsNear(start); + printStops(startStops); + final endStops = StopState.findStopsNear(end); + printStops(endStops); + + // 2) Use A* to find a route with transfers + log("Using A*"); + final paths = >[]; + for (final startStop in startStops) { + for (final startRouteID in startStop.routeIDs) { + for (final endStop in endStops) { + final state = StopState.start( + stopID: startStop.id, + goalID: endStop.id, + routeID: startRouteID, + startPoint: start, + endPoint: end, + ); + log("Finding a route using ${state.hash()}"); + final result = aStar(state, limit: 10000); + if (result == null) continue; + paths.add(result.reconstructPath()); + } + } + } + + if (paths.isEmpty) return null; + return paths.min(getTotalDistance); +} + +double getTotalDistance(Iterable path) => + path.sum((step) => step.distanceWalked); + +void explainPath(Iterable path, void Function(String) printer) { + var index = 0; + for (final step in path) { + index++; + final stop = StopState.stops[step.stopID]!; + if (index == path.length) { + printer("$index. Get off at ${stop.name}"); + } else { + printer("$index. ${step.explanation}"); + } + } +} diff --git a/src/shared/lib/src/graph/state.dart b/src/shared/lib/src/graph/state.dart index 60a817c..0998ca4 100644 --- a/src/shared/lib/src/graph/state.dart +++ b/src/shared/lib/src/graph/state.dart @@ -1,33 +1,81 @@ import "package:a_star/a_star.dart"; import "package:shared/data.dart"; -class StopState extends AStarState { +enum SearchMethod { + start, + bus, + transfer, + walk; + + factory SearchMethod.fromJson(String json) => values.byName(json); +} + +class StopState extends AStarState with Encodable { static late final Map routes; static late final Map stops; - static void init(Iterable allRoutes, Iterable allStops) { - routes = { - for (final route in allRoutes) - route.id: route, - }; - stops = { - for (final stop in allStops) - stop.id: stop, - }; + static Iterable findStopsNear(Coordinates location) { + const numStops = 5; + log("Finding stops near $location..."); + final stopDistances = [ + for (final stop in stops.values) + (stop, stop.coordinates.distanceTo(location)), + ]; + stopDistances.sort((a, b) => a.$2.compareTo(b.$2)); + return stopDistances.take(numStops).map((pair) => pair.$1); } final StopID stopID; final StopID goalID; final RouteID routeID; + final double distanceWalked; + final SearchMethod method; StopState({ required this.stopID, required this.goalID, required this.routeID, + required this.distanceWalked, + required this.method, required super.depth, }); + factory StopState.start({ + required StopID stopID, + required StopID goalID, + required RouteID routeID, + required Coordinates startPoint, + required Coordinates endPoint, + }) { + final stop = stops[stopID]!; + final goal = stops[goalID]!; + final distanceToStart = startPoint.distanceTo(stop.coordinates); + final distanceToEnd = endPoint.distanceTo(goal.coordinates); + return StopState( + stopID: stopID, + goalID: goalID, + routeID: routeID, + distanceWalked: distanceToStart + distanceToEnd, + depth: 0, + method: SearchMethod.start, + ); + } + + factory StopState.fromJson(Json json) => StopState( + stopID: StopID.fromJson(json["stop_id"]), + routeID: RouteID.fromJson(json["route_id"]), + method: SearchMethod.fromJson(json["method"]), + depth: 0, + distanceWalked: 0, + goalID: StopID.fromJson("N/A"), + ); + @override - String hash() => "$stopID-$goalID-$routeID"; + String hash() { + final stop = stops[stopID]; + final goal = stops[goalID]; + final route = routes[routeID]; + return "${method.name}-$stop-$goal-$route"; + } @override bool isGoal() => stopID == goalID; @@ -44,30 +92,86 @@ class StopState extends AStarState { final route = routes[routeID]!; final stop = stops[stopID]!; final stopIndex = route.stops.indexOf(stopID); + if (stopIndex == -1) return []; final result = []; // 1): Go forward one stop on the same route final nextIndex = stopIndex + 1; if (nextIndex < route.stops.length) { - final nextStop = route.stops[nextIndex]; - final state = StopState(stopID: nextStop, goalID: goalID, routeID: routeID, depth: depth + 1); + final nextStopID = route.stops[nextIndex]; + final state = StopState( + stopID: nextStopID, + goalID: goalID, + routeID: routeID, + depth: depth + 1, + distanceWalked: distanceWalked, + method: SearchMethod.bus, + ); result.add(state); } // 2) Go back one stop on the same route final prevIndex = stopIndex - 1; if (prevIndex > 0) { - final prevStop = route.stops[prevIndex]; - final state = StopState(stopID: prevStop, goalID: goalID, routeID: routeID, depth: depth + 1); + final prevStopID = route.stops[prevIndex]; + final state = StopState( + stopID: prevStopID, + goalID: goalID, + routeID: routeID, + depth: depth + 1, + distanceWalked: distanceWalked, + method: SearchMethod.bus, + ); result.add(state); } // 3) Make any available transfers - for (final otherRoute in stop.routeIDs.difference({routeID})) { - final state = StopState(stopID: stopID, goalID: goalID, routeID: otherRoute, depth: depth + 1); + for (final otherRouteID in stop.routeIDs.difference({routeID})) { + final state = StopState( + stopID: stopID, + goalID: goalID, + routeID: otherRouteID, + depth: depth + 2, + distanceWalked: distanceWalked, + method: SearchMethod.transfer, + ); result.add(state); } + // 4) Walk to a new stop + for (final otherStop in findStopsNear(stop.coordinates)) { + final distanceToOther = stop.coordinates.distanceTo(otherStop.coordinates); + for (final otherRouteID in otherStop.routeIDs) { + final state = StopState( + stopID: otherStop.id, + goalID: goalID, + routeID: otherRouteID, + depth: depth + 3, + distanceWalked: distanceWalked + distanceToOther, + method: SearchMethod.walk, + ); + result.add(state); + } + } + return result; } + + String get explanation { + final route = routes[routeID]!; + final stop = stops[stopID]!; + return switch (method) { + SearchMethod.bus => "Go one stop to $stop", + SearchMethod.start => "Walk to $stop\n and board the $route line", + SearchMethod.transfer => "Transfer to the $route line", + SearchMethod.walk => "Walk to $stop\n and board the $route line" + }; + } + + @override + Json toJson() => { + "stop_id": stopID, + "route_id": routeID, + "method": method.name, + }; } diff --git a/src/shared/lib/src/server/misc.dart b/src/shared/lib/src/server/misc.dart new file mode 100644 index 0000000..cf81e33 --- /dev/null +++ b/src/shared/lib/src/server/misc.dart @@ -0,0 +1,16 @@ +import "package:shared/graph.dart"; +import "package:shelf/shelf.dart"; + +import "utils.dart"; + +Response getStops(Request _) { + final stops = StopState.stops.values; + final jsonBody = encodeJsonList(stops); + return Response.ok(jsonBody, headers: corsHeaders); +} + +Response getRoutes(Request _) { + final routes = StopState.routes.values.where((route) => !route.fullName.startsWith(")")); + final jsonBody = encodeJsonList(routes); + return Response.ok(jsonBody, headers: corsHeaders); +} diff --git a/src/shared/lib/src/server/path.dart b/src/shared/lib/src/server/path.dart new file mode 100644 index 0000000..e87d506 --- /dev/null +++ b/src/shared/lib/src/server/path.dart @@ -0,0 +1,24 @@ +import "package:shared/graph.dart"; +import "package:shelf/shelf.dart"; + +import "utils.dart"; + +Response getPath(Request request) { + final startLat = double.tryParse(request.url.queryParameters["start_lat"] ?? ""); + final startLong = double.tryParse(request.url.queryParameters["start_lon"] ?? ""); + final endLat = double.tryParse(request.url.queryParameters["end_lat"] ?? ""); + final endLong = double.tryParse(request.url.queryParameters["end_lon"] ?? ""); + if (startLat == null || startLong == null || endLat == null || endLong == null) { + return Response.badRequest(body: "Could not parse coordinates", headers: corsHeaders); + } + + final start = (lat: startLat, long: startLong); + final end = (lat: endLat, long: endLong); + final path = findPath(start, end); + if (path == null) { + return Response.ok("No routes found", headers: corsHeaders); + } + final buffer = StringBuffer(); + explainPath(path, buffer.writeln); + return Response.ok(buffer.toString(), headers: corsHeaders); +} diff --git a/src/shared/lib/src/server/utils.dart b/src/shared/lib/src/server/utils.dart new file mode 100644 index 0000000..2127aae --- /dev/null +++ b/src/shared/lib/src/server/utils.dart @@ -0,0 +1,15 @@ +import "dart:convert"; + +import "package:shared/generator.dart"; + +const corsHeaders = { + "Access-Control-Allow-Origin": "*", +}; + +String encodeJsonList(Iterable data) { + final jsonList = [ + for (final object in data) + object.toJson(), + ]; + return jsonEncode(jsonList); +}