public int FindEnterenceVertexNo(int noOfVertices, int graphNo, int start, int placeID)
        {
            FindShortestPath find = new FindShortestPath();

            int[,] graph, innerGraph;
            int[] dist_1, dist_2, distance, ids;
            int   innerStart, innerEnd = 0, innerVerticesNo;

            if (graphNo == 0)
            {
                graph = Data.footRoutesGraph;
            }
            else
            {
                graph = Data.vehicleRoutesGraph;
            }

            ids = LocationData.GetDepartmentAndFloor(placeID);

            if (ids[0] == 1)
            {
                innerGraph      = Data.CSDepartmentGraph;
                innerVerticesNo = Data.CSDepartmentGrapheVertices;
            }
            else
            {
                innerGraph      = Data.footRoutesGraph;
                innerVerticesNo = Data.footGrapheVertices;
            }

            for (int j = 0; j < Data.CSMainPlaceMatch.Length; j++)
            {
                if (Data.CSMainPlaceMatch[j] == placeID)
                {
                    innerEnd = j;
                    break;
                }
            }

            dist_1   = find.GetShortestDistanceList(graph, noOfVertices, start);
            distance = new int[Data.EntranceOuterMatch.Length];
            for (int i = 0; i < Data.EntranceOuterMatch.Length; i++)
            {
                distance[i]  = dist_1[Data.EntranceOuterMatch[i]];
                innerStart   = Data.CSMainEntranceInnerMatch[i];
                dist_2       = find.GetShortestDistanceList(innerGraph, innerVerticesNo, innerStart);
                distance[i] += dist_2[innerEnd];
            }

            //according to the department,Entrance outer match should change
            return(Data.EntranceOuterMatch[Array.IndexOf(distance, distance.Min())]);
        }
예제 #2
0
        public IActionResult GetFloorWithPlace(int placeID)
        {
            int n = 0;

            int[]           ids   = LocationData.GetDepartmentAndFloor(placeID);
            List <double[]> lst   = new List <double[]>();
            var             final = new Hashtable();

            double[] temp = new double[2];
            double[,] floorLocations = LocationData.GetFloorLocations(ids[0], ids[1]);
            Dictionary <string, double[]> places = LocationData.GetFloorPlaces(ids[0], ids[1]);
            Dictionary <string, double[]> place  = LocationData.GetPlaceWithName(placeID);

            Place[] arr = new Place[places.Count];
            Place   pl  = new Place();

            for (int i = 0; i < floorLocations.GetLength(0); i++)
            {
                lst.Add(new double[] { floorLocations[i, 0], floorLocations[i, 1] });
            }
            //this should change according to the department
            if (ids[1] == 0)
            {
                final.Add("floor_0_locations", lst);
            }
            else if (ids[1] == 1)
            {
                final.Add("floor_1_locations", lst);
            }
            else
            {
                final.Add("floor_2_locations", lst);
            }

            foreach (KeyValuePair <string, double[]> pair_0 in place)//only once
            {
                foreach (KeyValuePair <string, double[]> pair in places)
                {
                    if (pair_0.Key == pair.Key)
                    {
                        temp = pair.Value;
                        pl   = new Place()
                        {
                            name = pair.Key,
                            lat  = temp[0],
                            lon  = temp[1]
                        };
                    }
                    else
                    {
                        temp     = pair.Value;
                        arr[n++] = new Place()
                        {
                            name = pair.Key,
                            lat  = temp[0],
                            lon  = temp[1]
                        };
                    }
                }
            }
            final.Add("places", arr);
            final.Add("place", pl);
            return(Json(final));
        }
예제 #3
0
        public IActionResult GetPlace(double startLAT, double startLON, int placeID, string method)
        {
            List <double[]> lst = new List <double[]>();
            List <double[]> zeroFloorRouteSet = new List <double[]>();
            List <double[]> stair_0_1_RouteSet = new List <double[]>();
            List <double[]> stair_1_2_RouteSet = new List <double[]>();
            List <double[]> firstFloorRouteSet = new List <double[]>();
            List <double[]> secondFloorRouteSet = new List <double[]>();
            double          distance = 0, time = 0;
            var             final = new Hashtable();

            double[,] routeLocations;
            double[]     temp = new double[2], distanceAndTime;
            Calculations cal = new Calculations();
            int          V_No, graphNo, start, localEnd, innerStart = 0, innerEnd = 0;

            int[] ids, routes;
            double[,] floorLocations;
            Dictionary <string, double[]> place;
            Place pl;

            switch (method)
            {
            case "f":
                V_No    = Data.footGrapheVertices;
                graphNo = 0;
                break;

            case "v":
                V_No    = Data.vehicleGrapheVertices;
                graphNo = 1;
                break;

            default:
                V_No    = Data.footGrapheVertices;
                graphNo = 0;
                break;
            }
            start    = cal.GetNearestVertexNo(V_No, graphNo, startLAT, startLON);
            localEnd = cal.FindEnterenceVertexNo(V_No, graphNo, start, placeID);

            if (start != localEnd)
            {
                int[] route = cal.GetRouteNumbers(graphNo, start, localEnd);
                distanceAndTime = cal.FindDistanceAndTime(graphNo, start, localEnd);
                distance       += distanceAndTime[0];
                time           += distanceAndTime[1];

                foreach (int r in route)
                {
                    if (graphNo == 0)
                    {
                        routeLocations = LocationData.GetFootRoute(r);
                    }
                    else
                    {
                        routeLocations = LocationData.GetVehicleRoute(r);
                    }

                    lst.AddRange(new List <double[]>(cal.ValidateRoute(start, localEnd, graphNo, r, routeLocations)));
                }
                final.Add("outerroutelocations", new List <double[]>(lst));
            }
            lst.Clear();

            for (int i = 0; i < Data.CSMainOuterInnerMatch.Length; i++)
            {
                if (Data.CSMainOuterInnerMatch[i] == localEnd)
                {
                    innerStart = i;
                    break;
                }
            }

            for (int i = 0; i < Data.CSMainPlaceMatch.Length; i++)
            {
                if (Data.CSMainPlaceMatch[i] == placeID)
                {
                    innerEnd = i;
                    break;
                }
            }

            graphNo         = 2;
            ids             = LocationData.GetDepartmentAndFloor(placeID);
            routes          = cal.GetRouteNumbers(graphNo, innerStart, innerEnd);
            distanceAndTime = cal.FindDistanceAndTime(graphNo, innerStart, innerEnd);
            distance       += distanceAndTime[0];
            time           += distanceAndTime[1];

            //according to the department,no of arrays should change
            foreach (int rt in routes)
            {
                if (Data.CSFloor_0_RouteNumbers.Contains(rt))
                {
                    routeLocations = LocationData.GetInnerRoute(ids[0], rt);
                    zeroFloorRouteSet.AddRange(new List <double[]>(cal.ValidateRoute(innerStart, innerEnd, graphNo, rt, routeLocations)));
                }
                else if (Data.CSFloor_1_RouteNumbers.Contains(rt))
                {
                    routeLocations = LocationData.GetInnerRoute(ids[0], rt);
                    firstFloorRouteSet.AddRange(new List <double[]>(cal.ValidateRoute(innerStart, innerEnd, graphNo, rt, routeLocations)));
                }
                else if (Data.CSFloor_2_RouteNumbers.Contains(rt))
                {
                    routeLocations = LocationData.GetInnerRoute(ids[0], rt);
                    secondFloorRouteSet.AddRange(new List <double[]>(cal.ValidateRoute(innerStart, innerEnd, graphNo, rt, routeLocations)));
                }
                else if (Data.CSStairBetwenn_0_1.Contains(rt))
                {
                    routeLocations = LocationData.GetInnerRoute(ids[0], rt);
                    stair_0_1_RouteSet.AddRange(new List <double[]>(cal.ValidateRoute(innerStart, innerEnd, graphNo, rt, routeLocations)));
                }
                else if (Data.CSStairBetwenn_1_2.Contains(rt))
                {
                    routeLocations = LocationData.GetInnerRoute(ids[0], rt);
                    stair_1_2_RouteSet.AddRange(new List <double[]>(cal.ValidateRoute(innerStart, innerEnd, graphNo, rt, routeLocations)));
                }
            }

            if (zeroFloorRouteSet.Count != 0)
            {
                final.Add("floor_0_routelocations", new List <double[]>(zeroFloorRouteSet));
                lst.Clear();
                floorLocations = LocationData.GetFloorLocations(ids[0], 0);

                for (int i = 0; i < floorLocations.GetLength(0); i++)
                {
                    lst.Add(new double[] { floorLocations[i, 0], floorLocations[i, 1] });
                }
                final.Add("floor_0_locations", new List <double[]>(lst));
            }

            if (firstFloorRouteSet.Count != 0)
            {
                final.Add("floor_1_routelocations", new List <double[]>(firstFloorRouteSet));
                lst.Clear();
                floorLocations = LocationData.GetFloorLocations(ids[0], 1);

                for (int i = 0; i < floorLocations.GetLength(0); i++)
                {
                    lst.Add(new double[] { floorLocations[i, 0], floorLocations[i, 1] });
                }
                final.Add("floor_1_locations", new List <double[]>(lst));
            }

            if (secondFloorRouteSet.Count != 0)
            {
                final.Add("floor_2_routelocations", new List <double[]>(secondFloorRouteSet));
                lst.Clear();
                floorLocations = LocationData.GetFloorLocations(ids[0], 2);

                for (int i = 0; i < floorLocations.GetLength(0); i++)
                {
                    lst.Add(new double[] { floorLocations[i, 0], floorLocations[i, 1] });
                }
                final.Add("floor_2_locations", new List <double[]>(lst));
            }

            if (stair_0_1_RouteSet.Count != 0)
            {
                final.Add("stair_0_1_locations", stair_0_1_RouteSet);
            }
            if (stair_1_2_RouteSet.Count != 0)
            {
                final.Add("stair_1_2_locations", stair_1_2_RouteSet);
            }

            place = LocationData.GetPlaceWithName(placeID);
            pl    = new Place();
            foreach (KeyValuePair <string, double[]> pair in place)//only once
            {
                temp = pair.Value;
                pl   = new Place()
                {
                    name = pair.Key,
                    lat  = temp[0],
                    lon  = temp[1]
                };
            }
            final.Add("place", pl);
            final.Add("distance_time", new double[] { distance, Math.Round(time, 1) });
            return(Json(final));
        }