Beispiel #1
0
        ExtractedTimFrame BuildAlertFrame(string roadwayid, string text, DateTime startTime, int duration, double startMM, double endMM)
        {
            bool reversed = startMM > endMM;

            if (reversed)
            {
                double swap = startMM;
                startMM = endMM;
                endMM   = swap;
            }

            ExtractedTimFrame results = new ExtractedTimFrame(text, startTime, duration);

            var dbAlertMileMarkers = srInfloDbContext.Configuration_RoadwayMileMarkers
                                     .Where(r => r.RoadwayId.Equals(roadwayid));

            //Snap to closest milemarkers by widening the alert.
            try
            {
                startMM = dbAlertMileMarkers.Where(m => m.MMNumber <= startMM).OrderByDescending(m => m.MMNumber).First().MMNumber;
            }
            catch { }
            try
            {
                endMM = dbAlertMileMarkers.Where(m => m.MMNumber >= endMM).OrderBy(m => m.MMNumber).First().MMNumber;
            }
            catch { }

            dbAlertMileMarkers = dbAlertMileMarkers.Where(m => startMM <= m.MMNumber && m.MMNumber <= endMM);

            if (reversed)
            {
                dbAlertMileMarkers = dbAlertMileMarkers.OrderByDescending(m => m.MMNumber);
            }
            else
            {
                dbAlertMileMarkers = dbAlertMileMarkers.OrderBy(m => m.MMNumber);
            }

            var dbAlertMileMarkersList = dbAlertMileMarkers.ToList();

            List <ExtractedNodeList> alertPaths = new List <ExtractedNodeList>();

            while (dbAlertMileMarkersList.Count() > 1)
            {
                var mmarkers = dbAlertMileMarkersList.GetRange(0, Math.Min(MileMarkersPerValidRegion, dbAlertMileMarkersList.Count()));
                List <Extracted3DOffset> nodes = new List <Extracted3DOffset>();

                if (reversed)
                {
                    mmarkers.OrderByDescending(m => m.MMNumber).ToList().ForEach(m => nodes.Add(new Extracted3DOffset(m.Latitude2, m.Longitude2, m.MMNumber)));
                }
                else
                {
                    mmarkers.OrderBy(m => m.MMNumber).ToList().ForEach(m => nodes.Add(new Extracted3DOffset(m.Latitude1, m.Longitude1, m.MMNumber)));
                }

                if (nodes.Count > 1)
                {
                    ExtractedNodeList alertPath = new ExtractedNodeList(nodes.ToArray());
                    alertPaths.Add(alertPath);
                }

                dbAlertMileMarkersList.RemoveRange(0, mmarkers.Count() - 1);
            }

            results.setAlertPaths(alertPaths.ToArray());

            return(results);
        }