コード例 #1
0
        public List <TrainArrival> GetScheduledTimes(string FromStationID, string ToStationID, Direction direction)
        {
            List <TrainArrival> lstTrainArrivals = new List <TrainArrival>();

            List <StopOnTrip> stopsList = (h.StopList == null) ? h.GetStopTimes() : h.StopList;

            //Get Metra routes that are running today, in the direction specified
            //direction ID = 0: inbound; 1: outbound
            string serviceID = GetServicePeriod();

            if (string.IsNullOrEmpty(serviceID))
            {
                return(lstTrainArrivals);
            }

            var fromStopAlertData = h.AlertsList.Where(x => EmptyIfNull(x.alert.informed_entity[0].stop_id).Equals(FromStationID)).FirstOrDefault();

            if (fromStopAlertData != null)
            {
                string alertText = fromStopAlertData.alert.header_text.translation[0].text;

                string alertMemo = fromStopAlertData.alert.description_text.translation[0].text;
            }


            var toStopAlertData = h.AlertsList.Where(x => EmptyIfNull(x.alert.informed_entity[0].stop_id).Equals(ToStationID)).FirstOrDefault();

            if (toStopAlertData != null)
            {
                string alertText = toStopAlertData.alert.header_text.translation[0].text;

                string alertMemo = toStopAlertData.alert.description_text.translation[0].text;
            }

            List <Trip> tripsList = (h.TripsList == null) ? h.GetTrips() : h.TripsList;

            //Get all inbound/outbound routes running for a specific day
            tripsList = tripsList
                        .Where(
                (x) =>
                (x.service_id.Equals(serviceID)) &&
                (x.direction_id.Equals((int)direction))
                ).ToList();


            var results = new ConcurrentBag <string>();

            Parallel.For(0, tripsList.Count, i =>
            {
                var myroute = tripsList[i];

                var fromFoute = stopsList.FirstOrDefault(x => x.stop_id.Equals(FromStationID) && x.trip_id.Equals(myroute.trip_id));

                var toRoute = stopsList.FirstOrDefault(x => x.stop_id.Equals(ToStationID) && x.trip_id.Equals(myroute.trip_id));

                if ((fromFoute != null) && (toRoute != null))
                {
                    results.Add(myroute.trip_id);
                }
            });

            var matches = results.ToList().Distinct().ToList();

            stopsList = stopsList
                        .Where(
                (x) =>
                ((x.stop_id.Equals(FromStationID)) ||
                 (x.stop_id.Equals(ToStationID))
                ) &&
                (matches.Contains(x.trip_id))
                ).ToList();

            //Remove routes that are already in the past

            for (int i = stopsList.Count - 1; i >= 0; i--)
            {
                int hour   = int.Parse(stopsList[i].arrival_time.Split(':')[0]);
                int minute = int.Parse(stopsList[i].arrival_time.Split(':')[1]);

                int currentHour   = DateTime.Now.TimeOfDay.Hours;
                int currentMinute = DateTime.Now.TimeOfDay.Minutes;

                if (hour.CompareTo(currentHour) < 0)
                {
                    stopsList.RemoveAt(i);
                }
                else if (hour.CompareTo(currentHour) == 0)
                {
                    if (minute.CompareTo(currentMinute) < 0)
                    {
                        stopsList.RemoveAt(i);
                    }
                }
            }
            /**/

            tripsList = tripsList.Where(x => matches.Contains(x.trip_id)).ToList();

            for (int i = 0; i < tripsList.Count; i++)
            {
                string tripID = tripsList[i].trip_id;

                string Delay = string.Empty;

                TripUpdateCollection tuc = h.TripUpdatesList.Where(x => x.id.Equals(tripID.Replace("_V1_A", "_V1_B"))).FirstOrDefault();
                if (tuc != null)
                {
                    //string lastStationAbbr = tuc.trip_update.stop_time_update[0].stop_id;
                    //if (lastStationAbbr.Equals("CUS")) continue;

                    int delayInSeconds = tuc.trip_update.stop_time_update[0].arrival.delay;

                    TimeSpan ts = new TimeSpan(0, 0, 0);

                    if (delayInSeconds > 0)
                    {
                        ts    = TimeSpan.FromSeconds(delayInSeconds);
                        Delay = (int)ts.TotalMinutes + " min late" + Environment.NewLine;
                    }
                }

                var currentStops = stopsList.Where(x => x.trip_id.Equals(tripsList[i].trip_id)).ToList();

                var tripAlertData = h.AlertsList.Where(x => EmptyIfNull(x.alert.informed_entity[0].trip).Equals(tripID)).FirstOrDefault();

                string alertText = "On Time";
                string alertMemo = string.Empty;

                if (tripAlertData != null)
                {
                    alertText = tripAlertData.alert.header_text.translation[0].text;

                    alertMemo = tripAlertData.alert.description_text.translation[0].text;
                }

                if (!string.IsNullOrEmpty(Delay) && alertText.Equals("On Time"))
                {
                    alertText = Delay;
                }

                if (currentStops.Count == 2)
                {
                    string origin_departure_time = currentStops[0].departure_time;

                    string dest_arrival_time = currentStops[1].arrival_time;

                    TrainArrival tr = new TrainArrival
                    {
                        origin_departure_time = origin_departure_time.Remove(origin_departure_time.Length - 3),

                        origin_name = StationsList.Where(x => x.value.Equals(currentStops[0].stop_id)).First().label,

                        dest_arrival_time = dest_arrival_time.Remove(dest_arrival_time.Length - 3),

                        dest_name = StationsList.Where(x => x.value.Equals(currentStops[1].stop_id)).First().label,

                        arrives_in_min = "",

                        time_on_train = "",

                        late_by_min = "",

                        alert = alertText,

                        route_id = tripsList[i].route_id,

                        trip_id = tripsList[i].trip_id,

                        tripURL = "https://metrarail.com/maps-schedules/train-lines/" + tripsList[i].route_id +
                                  "/trip/" + tripsList[i].trip_id,

                        description = "",
                    };

                    lstTrainArrivals.Add(tr);
                }

                lstTrainArrivals = lstTrainArrivals.OrderBy(x => x.origin_departure_time).ToList();
            }

            return(lstTrainArrivals);
        }
コード例 #2
0
        public List <Location> GetRoutesOnTheWayToWesternAvenue()
        {
            List <Location> lstLocations = new List <Location>();

            string tripUpdateJSON = j.Get_GTFS_Response(j.METRA_API_URL + "tripUpdates");
            List <TripUpdateCollection> tripUpdateList = JsonConvert.DeserializeObject <List <TripUpdateCollection> >(tripUpdateJSON);

            string positionJSON = j.Get_GTFS_Response(j.METRA_API_URL + "positions");
            List <TripPosition> positionList = JsonConvert.DeserializeObject <List <TripPosition> >(positionJSON);

            string   currentDateTimeJSON = j.Get_API_Response(j.CURRENT_TIME_API_URL);
            DateTime dtUpdateTime        = DateTime.Now;

            if (!string.IsNullOrEmpty(currentDateTimeJSON))
            {
                DateTimeModels currentDateTime = JsonConvert.DeserializeObject <DateTimeModels>(currentDateTimeJSON);
                dtUpdateTime = DateTime.Parse(currentDateTime.formatted);
            }

            //Filter positions to contain only routes that stop at Western Avenue
            List <string> lstRoutesFilter = new List <string>();

            lstRoutesFilter.Add("MD-N");
            lstRoutesFilter.Add("MD-W");
            lstRoutesFilter.Add("NCS");

            positionList = positionList
                           .Where(a => lstRoutesFilter.Any(b => a.vehicle.trip.trip_id.StartsWith(b)))
                           .ToList();

            for (int i = 0; i < positionList.Count; i++)
            {
                string tripID  = positionList[i].vehicle.trip.trip_id;
                string lineID  = positionList[i].vehicle.trip.route_id;
                string routeID = positionList[i].vehicle.vehicle.label;

                //Exclude if already past the Western Avenue Station, but had not updated next station yet
                if (positionList[i].vehicle.position.latitude < 41.8888)
                {
                    continue;
                }

                //Create dictionary to resolve station abbrevs to names
                string         stationsJSON = j.Get_GTFS_Response(j.METRA_API_URL + "schedule/stops");
                List <Station> stationsList = JsonConvert.DeserializeObject <List <Station> >(stationsJSON);
                Dictionary <string, string> dictStations = stationsList.ToDictionary(prop => prop.stop_id, prop => prop.stop_name);

                TripUpdateCollection tuc = tripUpdateList.Where(x => x.id.Equals(tripID)).FirstOrDefault();
                if (tuc == null)
                {
                    continue;
                }

                string nexsStationAbbr = tuc.trip_update.stop_time_update[0].stop_id;

                string priorStationAbbr = (tuc.trip_update.stop_time_update.Count < 2) ? string.Empty : tuc.trip_update.stop_time_update[1].stop_id;

                if (nexsStationAbbr.Equals("CUS"))
                {
                    continue;
                }

                string            stopTimesJSON = j.Get_GTFS_Response(j.METRA_API_URL + "schedule/stop_times/" + tripID);
                List <StopOnTrip> stopTimesList = JsonConvert.DeserializeObject <List <StopOnTrip> >(stopTimesJSON);
                if (stopTimesList == null)
                {
                    continue;
                }

                if (stopTimesList[0].stop_id.Equals("CUS"))    //INBOUND - DOES not start at Chicago Union Station
                {
                    continue;
                }

                StopOnTrip westernAve = stopTimesList.Where(x => x.stop_id.Equals("WESTERNAVE")).FirstOrDefault();
                if (westernAve == null)
                {
                    continue;
                }

                int delayInSeconds = tuc.trip_update.stop_time_update[0].arrival.delay;

                string   Delay = string.Empty;
                TimeSpan ts    = new TimeSpan(0, 0, 0);

                if (delayInSeconds > 0)
                {
                    ts    = TimeSpan.FromSeconds(delayInSeconds);
                    Delay = (int)ts.TotalMinutes + " min late" + Environment.NewLine;
                }

                string   arrivalTimeOnWestern   = westernAve.arrival_time;
                DateTime dtArrivalTimeOnWestern = DateTime.ParseExact(arrivalTimeOnWestern,
                                                                      "H:m:s",
                                                                      CultureInfo.InvariantCulture,
                                                                      DateTimeStyles.None);

                dtArrivalTimeOnWestern = dtArrivalTimeOnWestern.Add(ts);

                string dateTimeString = positionList[i].vehicle.trip.start_date + " " + positionList[i].vehicle.trip.start_time;

                DateTime startDt = DateTime.ParseExact(dateTimeString,
                                                       "yyyyMMdd HH:mm:ss",
                                                       CultureInfo.InvariantCulture,
                                                       DateTimeStyles.None);

                TimeSpan tsArrivesIn = dtArrivalTimeOnWestern.Subtract(dtUpdateTime);
                tsArrivesIn = RoundToNearest(tsArrivesIn, TimeSpan.FromMinutes(1));

                int arrivesInMinutes = (int)tsArrivesIn.Minutes;

                //Bug on server - after 6pm, 24 hrs gets added to the time.
                if (arrivesInMinutes >= 1440)
                {
                    arrivesInMinutes = arrivesInMinutes - 1440;
                }

                if (arrivesInMinutes < 0)
                {
                    arrivesInMinutes = 0;
                }

                arrivalTimeOnWestern = dtArrivalTimeOnWestern.ToString("HH:mm");
                string currentNextStop = dictStations[nexsStationAbbr];

                string description = Delay +
                                     "Next Stop: " + currentNextStop;


                Location loc = new Location
                {
                    LocationID = Convert.ToInt32(positionList[i].id),

                    TripID = tripID,

                    RouteNumber = lineID + ", Route " + routeID,

                    Lat = positionList[i].vehicle.position.latitude.ToString(),

                    Long = positionList[i].vehicle.position.longitude.ToString(),

                    ArrivesIn = arrivesInMinutes + " min",

                    ArrivalTime = dtArrivalTimeOnWestern.ToString("HH:mm"),

                    Description = description,

                    ImagePath = "https://png.icons8.com/material/2x/train.png",

                    TripURL = "https://metrarail.com/maps-schedules/train-lines/" + lineID + "/trip/" + tripID
                };

                lstLocations.Add(loc);
            }

            lstLocations = lstLocations.OrderBy(x => x.ArrivalTime).ToList();
            return(lstLocations);
        }
コード例 #3
0
        public List <RoutesData> GetRoutesOnTheWayToWesternAvenue()
        {
            List <RoutesData> lstRoutes = new List <RoutesData>();

            string tripUpdateJSON = j.Get_GTFS_Response(j.METRA_API_URL + "tripUpdates");
            List <TripUpdateCollection> tripUpdateList = JsonConvert.DeserializeObject <List <TripUpdateCollection> >(tripUpdateJSON);

            string positionJSON = j.Get_GTFS_Response(j.METRA_API_URL + "positions");
            List <TripPosition> positionList = JsonConvert.DeserializeObject <List <TripPosition> >(positionJSON);

            //Filter positions to contain only routes that stop at Western Avenue
            List <string> lstRoutesFilter = new List <string>();

            lstRoutesFilter.Add("MD-N");
            lstRoutesFilter.Add("MD-W");
            lstRoutesFilter.Add("NCS");

            positionList = positionList
                           .Where(a => lstRoutesFilter.Any(b => a.vehicle.trip.trip_id.StartsWith(b)))
                           .ToList();

            TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");

            for (int i = 0; i < positionList.Count; i++)
            {
                string tripID  = positionList[i].vehicle.trip.trip_id;
                string routeID = positionList[i].vehicle.trip.route_id;

                //Create dictionary to resolve station abbrevs to names
                string         stationsJSON = j.Get_GTFS_Response(j.METRA_API_URL + "schedule/stops");
                List <Station> stationsList = JsonConvert.DeserializeObject <List <Station> >(stationsJSON);
                Dictionary <string, string> dictStations = stationsList.ToDictionary(prop => prop.stop_id, prop => prop.stop_name);

                TripUpdateCollection tuc = tripUpdateList.Where(x => x.id.Equals(tripID)).FirstOrDefault();
                if (tuc == null)
                {
                    continue;
                }

                string lastStationAbbr = tuc.trip_update.stop_time_update[0].stop_id;
                if (lastStationAbbr.Equals("CUS"))
                {
                    continue;
                }

                int delayInSeconds = tuc.trip_update.stop_time_update[0].arrival.delay;

                string   Delay = string.Empty;
                TimeSpan ts    = new TimeSpan(0, 0, 0);

                if (delayInSeconds > 0)
                {
                    ts    = TimeSpan.FromSeconds(delayInSeconds);
                    Delay = (int)ts.TotalMinutes + " min late" + Environment.NewLine;
                }

                DateTime dtAtLastStation = tuc.trip_update.stop_time_update[0].departure.time.low;


                DateTime adjDtAtLastStation = TimeZoneInfo.ConvertTimeFromUtc(dtAtLastStation, cstZone);

                //DateTime adjDtAtLastStation = dtAtLastStation.Add(new TimeSpan(-6, 0, 0));
                string timeAtNextStation = adjDtAtLastStation.ToString("HH:mm");

                string            stopTimesJSON = j.Get_GTFS_Response(j.METRA_API_URL + "schedule/stop_times/" + tripID);
                List <StopOnTrip> stopTimesList = JsonConvert.DeserializeObject <List <StopOnTrip> >(stopTimesJSON);
                if (stopTimesList == null)
                {
                    continue;
                }

                if (!stopTimesList[0].stop_id.Equals("CUS"))    //INBOUND - DOES not start at Chicago Union Station
                {
                    StopOnTrip westernAve = stopTimesList.Where(x => x.stop_id.Equals("WESTERNAVE")).FirstOrDefault();
                    if (westernAve == null)
                    {
                        continue;
                    }

                    string   arrivalTimeOnWestern   = westernAve.arrival_time;
                    DateTime dtArrivalTimeOnWestern = DateTime.ParseExact(arrivalTimeOnWestern,
                                                                          "H:m:s",
                                                                          CultureInfo.InvariantCulture,
                                                                          DateTimeStyles.None);

                    dtArrivalTimeOnWestern = dtArrivalTimeOnWestern.Add(ts);

                    string dateTimeString = positionList[i].vehicle.trip.start_date + " " + positionList[i].vehicle.trip.start_time;

                    DateTime startDt = DateTime.ParseExact(dateTimeString,
                                                           "yyyyMMdd HH:mm:ss",
                                                           CultureInfo.InvariantCulture,
                                                           DateTimeStyles.None);

                    DateTime dtUpdateTime = positionList[0].vehicle.timestamp.low;
                    dtUpdateTime = TimeZoneInfo.ConvertTimeFromUtc(dtUpdateTime, cstZone);

                    TimeSpan tsArrivesIn      = dtArrivalTimeOnWestern.Subtract(dtUpdateTime);
                    int      arrivesInMinutes = (int)tsArrivesIn.TotalMinutes;

                    //Bug on server - after 6pm, 24 hrs gets added to the time. Observed only on server, works fine locally
                    if (arrivesInMinutes >= 1440)
                    {
                        arrivesInMinutes = arrivesInMinutes - 1440;
                    }

                    arrivalTimeOnWestern = dtArrivalTimeOnWestern.ToString("HH:mm");
                    string currentNextStop = dictStations[lastStationAbbr];

                    string description = string.Empty;
                    if ((currentNextStop.Equals("Western Ave")) && (arrivalTimeOnWestern.Equals(timeAtNextStation)))
                    {
                        description = Delay;
                    }
                    else
                    {
                        description = Delay +
                                      "Next Stop: " + dictStations[lastStationAbbr] + ", " + timeAtNextStation;
                    }

                    if (positionList[i].vehicle.position.latitude < 41.8888)
                    {
                        continue;                                                       //Exclude if already past the Western Avenue Station, but had not updated next station yet
                    }
                    RoutesData loc = new RoutesData
                    {
                        LocationID = Convert.ToInt32(positionList[i].id),

                        TripID = tripID,

                        Lat = positionList[i].vehicle.position.latitude.ToString(),

                        Long = positionList[i].vehicle.position.longitude.ToString(),

                        ArrivesIn = arrivesInMinutes + " min",

                        ArrivalTime = dtArrivalTimeOnWestern.ToString("HH:mm"),

                        Description = description,

                        ImagePath = "https://png.icons8.com/material/2x/train.png",

                        TripURL = "https://metrarail.com/maps-schedules/train-lines/" + routeID + "/trip/" + tripID
                    };

                    lstRoutes.Add(loc);
                }
            }

            lstRoutes = lstRoutes.OrderBy(x => x.ArrivalTime).ToList();

            return(lstRoutes);
        }