public ActionResult Create([Bind(Include = "ID,Logged,Level,Message,Username,RemoteAddress,Callsite,Exception")] Log log)
        {
            if (ModelState.IsValid)
            {
                db.Logs.Add(log);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            return(View(log));
        }
Ejemplo n.º 2
0
        public ActionResult Create([Bind(Include = "ID,RouteID,StopID,StopSequence")] RouteStop routeStop)
        {
            if (ModelState.IsValid)
            {
                db.RouteStops.Add(routeStop);
                db.SaveChanges();
                return(RedirectToAction("Index"));
            }

            ViewBag.RouteID = new SelectList(db.Routes, "ID", "ShortName", routeStop.RouteID);
            ViewBag.StopID  = new SelectList(db.Stops, "ID", "Name", routeStop.StopID);
            return(View(routeStop));
        }
Ejemplo n.º 3
0
        public ActionResult Create([Bind(Include = "ID,ShortName,LongName,Description,FlagStopsOnly")] Route route)
        {
            if (ModelState.IsValid)
            {
                db.Routes.Add(route);
                db.SaveChanges();

                logger.Info($"Created route '{route.ShortName}' ({route.Description})");

                return(RedirectToAction("Index"));
            }

            return(View(route));
        }
Ejemplo n.º 4
0
        public ActionResult Create([Bind(Include = "TrolleyName,Number,IconColorRGB,CurrentLat,CurrentLon")] Trolley trolley)
        {
            if (ModelState.IsValid)
            {
                db.Trolleys.Add(trolley);
                db.SaveChanges();

                logger.Info($"Created trolley # {trolley.Number} '{trolley.TrolleyName}'");

                TrolleyCache.UpdateTrolley(trolley);
                return(RedirectToAction("Index"));
            }

            return(View(trolley));
        }
        private int SaveNewRouteStops(TrolleyTrackerContext db, string jsonStops)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();

            jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });

            dynamic stopData = jss.Deserialize(jsonStops, typeof(object)) as dynamic;


            int stopCount = stopData.Length;

            for (int i = 0; i < stopCount; i++)
            {
                var importStop = stopData[i];

                var newStop = new Stop();
                newStop.Lat         = Convert.ToDouble(importStop.Lat);
                newStop.Lon         = Convert.ToDouble(importStop.Lon);
                newStop.Name        = importStop.Name;
                newStop.Description = importStop.Name;
                newStop.RouteStops  = new List <RouteStop>();
                db.Stops.Add(newStop);
            }

            db.SaveChanges();

            return(stopCount);
        }
Ejemplo n.º 6
0
        public ActionResult Edit([Bind(Include = "ID,StopSequence,Name,Description,Lat,Lon")] Stop stop)
        {
            if (ModelState.IsValid)
            {
                using (var db = new TrolleyTrackerContext())
                {
                    var newStop = new Stop();
                    newStop.ID = stop.ID;
                    db.Stops.Attach(newStop);  // Attach used instead of EntityState.Modified so that only changed fields are saved
                    newStop.Lat         = stop.Lat;
                    newStop.Lon         = stop.Lon;
                    newStop.Name        = stop.Name;
                    newStop.Description = stop.Description;

                    var file = Request.Files["Picture"];
                    if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName))
                    {
                        string fileName        = file.FileName;
                        string fileContentType = file.ContentType;
                        byte[] fileBytes       = new byte[file.ContentLength];
                        file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength));
                        newStop.Picture = fileBytes;
                    }

                    //db.Entry(stop).State = EntityState.Modified;

                    db.SaveChanges();
                    logger.Info($"Updated stop '{newStop.Name}' - '{newStop.Description}' at {newStop.Lat}, {newStop.Lon}");
                }
                return(RedirectToAction("Index"));
            }
            return(View(stop));
        }
Ejemplo n.º 7
0
        public ActionResult CreateAtPosition([Bind(Include = "ID,StopSequence,Name,Description,Lat,Lon")] Stop stop)
        {
            if (ModelState.IsValid)
            {
                var file = Request.Files["Picture"];
                if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName))
                {
                    string fileName        = file.FileName;
                    string fileContentType = file.ContentType;
                    byte[] fileBytes       = new byte[file.ContentLength];
                    file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength));
                    stop.Picture = fileBytes;
                }
                using (var db = new TrolleyTrackerContext())
                {
                    db.Stops.Add(stop);
                    db.SaveChanges();
                }

                logger.Info($"Created stop '{stop.Name}' - '{stop.Description}' at {stop.Lat}, {stop.Lon}");

                return(RedirectToAction("Index"));
            }

            return(View(stop));
        }
        public ActionResult Create([Bind(Include = "ID,NewRouteID,OverrideDate,OverrideType,OverriddenRouteID,StartTime,EndTime")] RouteScheduleOverride routeScheduleOverride)
        {
            bool ok = true;

            if (routeScheduleOverride.OverrideType != RouteScheduleOverride.OverrideRule.NoService &&
                routeScheduleOverride.NewRouteID == -1)
            {
                ModelState.AddModelError("NewRouteID", "Added or Replacement route is required");
                ok = false;
            }

            if (routeScheduleOverride.StartTime > routeScheduleOverride.EndTime)
            {
                ModelState.AddModelError("StartTime", "Start time must be before end time");
                ok = false;
            }


            if (ok && ModelState.IsValid)
            {
                routeScheduleOverride.StartTime = ExtractTimeValue(routeScheduleOverride.StartTime);
                routeScheduleOverride.EndTime   = ExtractTimeValue(routeScheduleOverride.EndTime);

                if (routeScheduleOverride.NewRouteID == -1)
                {
                    // Was cancellation case
                    routeScheduleOverride.NewRouteID = null;
                }
                if (routeScheduleOverride.OverriddenRouteID == -1)
                {
                    // No specific target route
                    routeScheduleOverride.OverriddenRouteID = null;
                }

                db.RouteScheduleOverrides.Add(routeScheduleOverride);
                db.SaveChanges();
                PurgeOldOverrides();

                logger.Info($"Created special schedule ID #{routeScheduleOverride.ID} type '{routeScheduleOverride.OverrideType.ToString()}' at '{routeScheduleOverride.StartTime.TimeOfDay} - {routeScheduleOverride.EndTime.TimeOfDay}");

                return(RedirectToAction("Index"));
            }

            ViewBag.NewRouteID        = new SelectList(RouteSelectList(""), "ID", "ShortName", routeScheduleOverride.NewRouteID);
            ViewBag.OverriddenRouteID = new SelectList(RouteSelectList("** All **"), "ID", "ShortName", routeScheduleOverride.OverriddenRouteID);
            return(View(routeScheduleOverride));
        }
Ejemplo n.º 9
0
 public ActionResult DeleteConfirmed(int id)
 {
     using (var db = new TrolleyTrackerContext())
     {
         AppSettings appSettings = db.AppSettings.Find(id);
         db.AppSettings.Remove(appSettings);
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
 }
Ejemplo n.º 10
0
 public ActionResult DeleteConfirmed(int id)
 {
     using (var db = new TrolleyTrackerContext())
     {
         RouteStop routeStop = db.RouteStops.Find(id);
         db.RouteStops.Remove(routeStop);
         db.SaveChanges();
         return(RedirectToAction("Index"));
     }
 }
 public ActionResult DeleteConfirmed(int id)
 {
     using (var db = new TrolleyTrackerContext())
     {
         Route route = db.Routes.Find(id);
         logger.Info($"Deleted route '{route.ShortName}' ({route.Description})");
         db.Routes.Remove(route);
         db.SaveChanges();
     }
     return(RedirectToAction("Index"));
 }
 public ActionResult DeleteConfirmed(int id)
 {
     using (var db = new TrolleyTrackerContext())
     {
         RouteScheduleOverride routeScheduleOverride = db.RouteScheduleOverrides.Find(id);
         logger.Info($"Deleted special schedule type '{routeScheduleOverride.OverrideType.ToString()}' at  {routeScheduleOverride.OverrideDate} '{routeScheduleOverride.StartTime.TimeOfDay} - {routeScheduleOverride.EndTime.TimeOfDay}");
         db.RouteScheduleOverrides.Remove(routeScheduleOverride);
         db.SaveChanges();
     }
     return(RedirectToAction("Index"));
 }
        private void RemovePreviousRouteStops(TrolleyTrackerContext db, int routeID)
        {
            var routeStops = from RouteStop rs in db.RouteStops
                             where rs.RouteID == routeID
                             select rs;

            foreach (var rs in routeStops)
            {
                db.RouteStops.Remove(rs);
            }
            db.SaveChanges();
        }
Ejemplo n.º 14
0
        public ActionResult Create([Bind(Include = "ID,RouteID,DayOfWeek,StartTime,EndTime")] RouteSchedule routeSchedule)
        {
            if (ModelState.IsValid)
            {
                routeSchedule.StartTime = ExtractTimeValue(routeSchedule.StartTime);
                routeSchedule.EndTime   = ExtractTimeValue(routeSchedule.EndTime);
                db.RouteSchedules.Add(routeSchedule);
                db.SaveChanges();

                routeSchedule.Route = db.Routes.Find(routeSchedule.RouteID);
                logger.Info($"Created fixed route schedule for '{routeSchedule.Route.ShortName}' - '{BuildScheduleView.daysOfWeek[routeSchedule.DayOfWeek]}' {routeSchedule.StartTime.TimeOfDay}-{routeSchedule.EndTime.TimeOfDay} ");

                return(RedirectToAction("Index"));
            }

            ViewBag.RouteID = new SelectList(db.Routes, "ID", "ShortName", routeSchedule.RouteID);



            return(View(routeSchedule));
        }
Ejemplo n.º 15
0
 public ActionResult UpdatePosition(int id, double Lat, double Lon)
 {
     using (var db = new TrolleyTrackerContext())
     {
         Stop stop = db.Stops.Find(id);
         stop.Lat = Lat;
         stop.Lon = Lon;
         db.SaveChanges();
         logger.Info($"Updated stop position '{stop.Name}' - '{stop.Description}' at {stop.Lat}, {stop.Lon}");
     }
     return(RedirectToAction("Index"));
 }
 public ActionResult DeleteConfirmed(int id)
 {
     using (var db = new TrolleyTrackerContext())
     {
         RouteSchedule routeSchedule = db.RouteSchedules.Find(id);
         routeSchedule.Route = db.Routes.Find(routeSchedule.RouteID);
         logger.Info($"Deleted fixed route schedule '{routeSchedule.Route.ShortName}' - '{BuildScheduleView.daysOfWeek[routeSchedule.DayOfWeek]}' {routeSchedule.StartTime.TimeOfDay}-{routeSchedule.EndTime.TimeOfDay} ");
         db.RouteSchedules.Remove(routeSchedule);
         db.SaveChanges();
     }
     return(RedirectToAction("Index"));
 }
Ejemplo n.º 17
0
        public ActionResult DeleteConfirmed(int id)
        {
            using (var db = new TrolleyTrackerContext())
            {
                Stop stop = db.Stops.Find(id);

                logger.Info($"Deleted stop '{stop.Name}' - '{stop.Description}'");

                db.Stops.Remove(stop);
                db.SaveChanges();
            }
            return(RedirectToAction("Index"));
        }
Ejemplo n.º 18
0
        public ActionResult DeleteConfirmed(int id)
        {
            using (var db = new TrolleyTrackerContext())
            {
                Trolley trolley = db.Trolleys.Find(id);

                logger.Info($"Deleted trolley # {trolley.Number} '{trolley.TrolleyName}'");


                db.Trolleys.Remove(trolley);
                db.SaveChanges();
            }
            return(RedirectToAction("Index"));
        }
Ejemplo n.º 19
0
 public ActionResult Edit([Bind(Include = "ID,UseSyncromatics")] AppSettings appSettings)
 {
     if (ModelState.IsValid)
     {
         using (var db = new TrolleyTrackerContext())
         {
             db.Entry(appSettings).State = EntityState.Modified;
             db.SaveChanges();
             AppSettingsInterface.UpdateSettings(appSettings);
             return(RedirectToAction("Index"));
         }
     }
     return(View(appSettings));
 }
 public ActionResult Edit([Bind(Include = "ID,ShortName,LongName,Description,FlagStopsOnly,RouteColorRGB")] Route route)
 {
     if (ModelState.IsValid)
     {
         using (var db = new TrolleyTrackerContext())
         {
             db.Entry(route).State = EntityState.Modified;
             db.SaveChanges();
         }
         logger.Info($"Updated route '{route.ShortName}' ({route.Description})");
         return(RedirectToAction("Index"));
     }
     return(View(route));
 }
Ejemplo n.º 21
0
 public ActionResult Edit([Bind(Include = "ID,RouteID,StopID,StopSequence")] RouteStop routeStop)
 {
     using (var db = new TrolleyTrackerContext())
     {
         if (ModelState.IsValid)
         {
             db.Entry(routeStop).State = EntityState.Modified;
             db.SaveChanges();
             return(RedirectToAction("Index"));
         }
         ViewBag.RouteID = new SelectList(db.Routes, "ID", "ShortName", routeStop.RouteID);
         ViewBag.StopID  = new SelectList(db.Stops, "ID", "Name", routeStop.StopID);
         return(View(routeStop));
     }
 }
Ejemplo n.º 22
0
        public ActionResult Create([Bind(Include = "ID,UseSyncromatics")] AppSettings appSettings)
        {
            if (ModelState.IsValid)
            {
                using (var db = new TrolleyTrackerContext())
                {
                    db.AppSettings.Add(appSettings);
                    db.SaveChanges();
                }
                AppSettingsInterface.UpdateSettings(appSettings);
                return(RedirectToAction("Index"));
            }

            return(View(appSettings));
        }
Ejemplo n.º 23
0
        public ActionResult Edit([Bind(Include = "ID,TrolleyName,Number,IconColorRGB,CurrentLat,CurrentLon,SyncromaticsNumber")] Trolley trolley)
        {
            if (ModelState.IsValid)
            {
                using (var db = new TrolleyTrackerContext())
                {
                    db.Entry(trolley).State = EntityState.Modified;
                    db.SaveChanges();
                }
                logger.Info($"Updated trolley # {trolley.Number} '{trolley.TrolleyName}'");

                return(RedirectToAction("Index"));
            }
            return(View(trolley));
        }
        private void PurgeOldOverrides(TrolleyTrackerContext db)
        {
            var purgeDate = DateTime.Now.AddDays(-7);
            var oldRouteScheduleOverrides = (from rso in db.RouteScheduleOverrides
                                             where rso.OverrideDate < purgeDate
                                             select rso).ToList();

            oldRouteScheduleOverrides.ForEach(rso => db.RouteScheduleOverrides.Remove(rso));
            db.SaveChanges();

            int nPurged = oldRouteScheduleOverrides.Count <RouteScheduleOverride>();

            if (nPurged > 0)
            {
                logger.Info($"Purged {nPurged} special schedules");
            }
        }
        public ActionResult Edit([Bind(Include = "ID,NewRouteID,OverrideDate,OverrideType,OverriddenRouteID,StartTime,EndTime")] RouteScheduleOverride routeScheduleOverride)
        {
            bool ok = true;

            if (routeScheduleOverride.OverrideType != RouteScheduleOverride.OverrideRule.NoService &&
                routeScheduleOverride.NewRouteID == -1)
            {
                ModelState.AddModelError("NewRouteID", "Added or Replacement route is required");
                ok = false;
            }

            if (routeScheduleOverride.StartTime > routeScheduleOverride.EndTime)
            {
                ModelState.AddModelError("StartTime", "Start time must be before end time");
                ok = false;
            }

            if (ok && ModelState.IsValid)
            {
                if (routeScheduleOverride.NewRouteID == -1)
                {
                    // Was cancellation case
                    routeScheduleOverride.NewRouteID = null;
                }
                if (routeScheduleOverride.OverriddenRouteID == -1)
                {
                    // No specific target route
                    routeScheduleOverride.OverriddenRouteID = null;
                }
                routeScheduleOverride.StartTime = ExtractTimeValue(routeScheduleOverride.StartTime);
                routeScheduleOverride.EndTime   = ExtractTimeValue(routeScheduleOverride.EndTime);

                using (var db = new TrolleyTrackerContext())
                {
                    db.Entry(routeScheduleOverride).State = EntityState.Modified;
                    db.SaveChanges();
                }

                logger.Info($"Edited special schedule type '{routeScheduleOverride.OverrideType.ToString()}' at  {routeScheduleOverride.OverrideDate} '{routeScheduleOverride.StartTime.TimeOfDay} - {routeScheduleOverride.EndTime.TimeOfDay}");

                return(RedirectToAction("Index"));
            }
            ViewBag.NewRouteID        = new SelectList(RouteSelectList(""), "ID", "ShortName", routeScheduleOverride.NewRouteID);
            ViewBag.OverriddenRouteID = new SelectList(RouteSelectList("** All **"), "ID", "ShortName", routeScheduleOverride.OverriddenRouteID);
            return(View(routeScheduleOverride));
        }
        public IHttpActionResult PostLocation(int id, LocationUpdate locationUpdate)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var trolley = (from Trolley t in db.Trolleys
                           where t.Number == id
                           select t).FirstOrDefault <Trolley>();

            if (trolley == null)
            {
                return(NotFound());
            }

            if ((locationUpdate.Lat < -90.0) || (locationUpdate.Lat > 90))
            {
                return(BadRequest("Invalid latitude"));
            }
            if ((locationUpdate.Lon < -180.0) || (locationUpdate.Lon > 180))
            {
                return(BadRequest("Invalid longitude"));
            }

            trolley.CurrentLat     = locationUpdate.Lat;
            trolley.CurrentLon     = locationUpdate.Lon;
            trolley.LastBeaconTime = UTCToLocalTime.LocalTimeFromUTC(DateTime.UtcNow);
            if (lastTrolleyWriteTime.ContainsKey(trolley.Number))
            {
                if ((DateTime.Now - lastTrolleyWriteTime[trolley.Number]).TotalSeconds > 30.0)
                {
                    db.SaveChanges();
                    lastTrolleyWriteTime[trolley.Number] = DateTime.Now;
                }
            }
            else
            {
                lastTrolleyWriteTime.Add(trolley.Number, DateTime.Now);
            }
            TrolleyCache.UpdateTrolley(trolley);
            StopArrivalTime.UpdateTrolleyStopArrivalTime(trolley);

            return(Ok()); // CreatedAtRoute("DefaultApi", new { id = trolley.ID }, trolley);
        }
        /// <summary>
        /// Parse JSON serialized route coordinate array
        /// </summary>
        /// <param name="db"></param>
        /// <param name="route"></param>
        /// <param name="jsonShapes"></param>
        private void SaveNewRouteShape(TrolleyTrackerContext db, Route route, string jsonShapes)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();

            jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });

            dynamic shapeData = jss.Deserialize(jsonShapes, typeof(object)) as dynamic;

            Coordinate lastCoordinate = null;
            var        totalDistance  = 0.0;
            int        sequence       = 0;
            int        nodeCount      = shapeData.Length;

            for (int i = 0; i < nodeCount; i++)
            {
                var node = shapeData[i];
                var lon  = Convert.ToDouble(node.Lon);
                var lat  = Convert.ToDouble(node.Lat);

                var    thisCoordinate = new Coordinate(lat, lon);
                double distance       = 0.0;
                if (lastCoordinate != null)
                {
                    distance = thisCoordinate.GreatCircleDistance(lastCoordinate);
                }
                lastCoordinate = thisCoordinate;
                totalDistance += distance;

                // Add new point if not duplicated (some shape editors create duplicate nodes)
                if (distance > 0.0)
                {
                    var dbShape = new TrolleyTracker.Models.Shape();
                    dbShape.Lat              = lat;
                    dbShape.Lon              = lon;
                    dbShape.RouteID          = route.ID;
                    dbShape.Sequence         = sequence;
                    dbShape.DistanceTraveled = totalDistance;
                    sequence++;
                    db.Shapes.Add(dbShape);
                }
            }

            db.SaveChanges();
        }
        public ActionResult Edit([Bind(Include = "ID,RouteID,DayOfWeek,StartTime,EndTime")] RouteSchedule routeSchedule)
        {
            using (var db = new TrolleyTrackerContext())
            {
                if (ModelState.IsValid)
                {
                    routeSchedule.StartTime       = ExtractTimeValue(routeSchedule.StartTime);
                    routeSchedule.EndTime         = ExtractTimeValue(routeSchedule.EndTime);
                    db.Entry(routeSchedule).State = EntityState.Modified;
                    db.SaveChanges();

                    routeSchedule.Route = db.Routes.Find(routeSchedule.RouteID);
                    logger.Info($"Updated fixed route schedule for '{routeSchedule.Route.ShortName}' - '{BuildScheduleView.daysOfWeek[routeSchedule.DayOfWeek]}' {routeSchedule.StartTime.TimeOfDay}-{routeSchedule.EndTime.TimeOfDay} ");

                    return(RedirectToAction("Index"));
                }
                var routeList = db.Routes.OrderBy(r => r.ShortName).ToList();
                ViewBag.RouteID = new SelectList(routeList, "ID", "ShortName", routeSchedule.RouteID);
                return(View(routeSchedule));
            }
        }
        public ActionResult Create([Bind(Include = "ID,ShortName,LongName,Description,FlagStopsOnly,RouteColorRGB")] Route route)
        {
            if (ModelState.IsValid)
            {
                using (var db = new TrolleyTrackerContext())
                {
                    var testRoute = from r in db.Routes
                                    where r.ShortName == route.ShortName
                                    select r;
                    if (testRoute.Count <Route>() > 0)
                    {
                        ViewBag.ErrorMessage = $"Unable to create - Route name {route.ShortName} already exists";
                        return(View("Create", route));
                    }



                    db.Routes.Add(route);
                    db.SaveChanges();
                }

                logger.Info($"Created route '{route.ShortName}' ({route.Description})");

                var uploadAlsoFlag = Request.Form["UploadAlso"];
                if (uploadAlsoFlag != null)
                {
                    if (uploadAlsoFlag == "yes")
                    {
                        return(RedirectToAction("Create", "UploadKMLShape", new { Id = route.ID }));
                    }
                    else
                    {
                        // List all routes
                        return(RedirectToAction("Index"));
                    }
                }
            }

            return(View(route));
        }
        const double MinStopProximity = 30.0;  // Meters

        /// <summary>
        /// Recalculate which routes the stops belong to, and the order.
        /// Call after any change to route or stops
        /// </summary>
        /// <param name="routeID">Route being recalculated</param>
        /// <param name="shapePoints"></param>
        /// <param name="stopPoints"></param>
        public void UpdateRouteStops(TrolleyTrackerContext db, int routeID, List <Coordinate> shapePoints, List <Stop> stops)
        {
            RemovePreviousRouteStops(db, routeID);

            var route = (from Route in db.Routes
                         where Route.ID == routeID
                         select Route).FirstOrDefault <Route>();

            // A stop is considered to belong to a route if it's within MinStopProximity meters of the route path
            var routeStopList = new List <Stop>();

            if (route.FlagStopsOnly)
            {
                // No stops to generate
                return;
            }


            var indexOfStop = new Dictionary <Stop, int>();

            for (int i = 1; i < shapePoints.Count; i++)
            {
                for (int s = 0; s < stops.Count; s++)
                {
                    var stop         = stops[s];
                    var stopPosition = new Coordinate(stop.Lat, stop.Lon);

                    Coordinate closest  = null;
                    var        distance = FindDistanceToSegment(stopPosition, shapePoints[i], shapePoints[i - 1], out closest);
                    if (distance < MinStopProximity)
                    {
                        var angle = AngleBetween3Points(shapePoints[i - 1], closest, stopPosition);

                        if (angle > 180.0)
                        {
                            angle = angle - 360.0;                // Convert to negative angle
                        }
                        // See if it is a right angle (Minimum distance to route shape segment)
                        if ((Math.Abs(Math.Abs(angle) - 90.0) < 5.0))
                        {
                            if (angle < 0)
                            {
                                // Stop is on the right side of the path
                                if (!routeStopList.Contains(stop))
                                {
                                    routeStopList.Add(stop);
                                    indexOfStop.Add(stop, i);  // For routeSegmentIndex later
                                }
                            }
                        }



                        //break;   //  Bug? How to handle case of ordering multiple stops in a long straight segment
                    }
                }
            }


            for (int i = 0; i < routeStopList.Count; i++)
            {
                var newRouteStop = db.RouteStops.Create();
                newRouteStop.RouteID           = routeID;
                newRouteStop.StopID            = routeStopList[i].ID;
                newRouteStop.StopSequence      = i;
                newRouteStop.RouteSegmentIndex = indexOfStop[routeStopList[i]];
                db.RouteStops.Add(newRouteStop);
            }
            db.SaveChanges();
        }