//*Function for reading The Links Data from the database private void ReadLinksFromGISdb() { List <N_W_Link> LL1 = new List <N_W_Link>(); OdbcCommand C2 = new OdbcCommand("SELECT \"START_NODE\",\"END_NODE\",\"LEGEND\" FROM \"Road_Link_polyline\" WHERE EXISTS(SELECT \"TOID\" FROM \"Road_Node_point_Shrunk\" WHERE \"TOID\" = \"START_NODE\") AND EXISTS(SELECT \"TOID\" FROM \"Road_Node_point_Shrunk\" WHERE \"TOID\" = \"END_NODE\") AND (length(the_geom) > 6.0) AND (\"START_NODE\" != \"END_NODE\");", Connect); Connect.Open(); OdbcDataReader R2 = C2.ExecuteReader(); while (R2.Read() == true) { Char[] CStartNode = R2.GetString(0).ToCharArray(9, 7); String SStarNode = new String(CStartNode); Char[] CEndNode = R2.GetString(1).ToCharArray(9, 7); String SEndNode = new String(CEndNode); N_W_Link TempLink = new N_W_Link(SStarNode, SEndNode, 1, false); LL1.Add(TempLink); } Connect.Close(); LinksList = LL1; }
//Function to get additional nodes from link steps and to get the mini links in between. private void SuperProcessLinksData() { OdbcCommand C2 = new OdbcCommand("SELECT \"START_NODE\",\"END_NODE\",\"LEGEND\",astext(the_geom),\"TOID\" FROM \"Road_Link_polyline_Shrunk\";", Connect); Connect.Open(); OdbcDataReader R2 = C2.ExecuteReader(); while (R2.Read() == true) { //Check for membership of One way table************************** String LinkTOID = R2.GetString(4); OdbcCommand C3 = new OdbcCommand("SELECT \"DIR_LINK\" FROM \"Road_Route_Info_polyline\" WHERE \"DIR_LINK\" LIKE '%" + LinkTOID + "' AND \"LEGEND\" LIKE 'One way%';", Connect); OdbcDataReader R3 = C3.ExecuteReader(); int CountCheck = 0; String OneWayLine = null; try { while (R3.Read() == true) { OneWayLine = R3.GetString(0); CountCheck++; } if (CountCheck > 1) { throw new Exception("Multiple correlations were found between the links table and the one way table"); } } catch (Exception e) { Console.WriteLine(e); } //*************************************************************** //Set up road catagory******************************************* String Legend = R2.GetString(2); int Catagory = 1; bool OneWay = false; bool Reverse = false; if (Legend.Contains("dual")) { Catagory = 2; } if (OneWayLine != null) { OneWay = true; if (OneWayLine.Contains("-")) { Reverse = true; } } //*************************************************************** //Set up start and end Nodes************************************* //Char[] Csnode = R2.GetString(0).ToCharArray(9, 7); String FirstNode = R2.GetString(0); //Char[] Cenode = R2.GetString(1).ToCharArray(9, 7); String SecondNode = R2.GetString(1); String GeoSt = R2.GetString(3); List <String[]> NodeCoordinates = GeometryToPoints(GeoSt); int NumberOfNodes = NodeCoordinates.Count; int FinalIndex = NumberOfNodes - 1; String Ssnode, Senode; if (Reverse == true) { NodeCoordinates.Reverse(); Ssnode = SecondNode; Senode = FirstNode; } else { Ssnode = FirstNode; Senode = SecondNode; } N_W_Node StartNode = new N_W_Node(Ssnode, Convert.ToDouble(NodeCoordinates[0][0]), Convert.ToDouble(NodeCoordinates[0][1]), 0); N_W_Node EndNode = new N_W_Node(Senode, Convert.ToDouble(NodeCoordinates[FinalIndex][0]), Convert.ToDouble(NodeCoordinates[FinalIndex][1]), 0); StartNode.ShrinkName(); EndNode.ShrinkName(); N_W_Node LastNode = StartNode; String ANodeName = ""; //****************************************************************** for (int i = 1; i < FinalIndex; i++) { ANodeName = ("A" + AnodeCounter.ToString("00000")); N_W_Node NewNode = new N_W_Node(ANodeName, Convert.ToDouble(NodeCoordinates[i][0]), Convert.ToDouble(NodeCoordinates[i][1]), 0); double NodeDistS = NodeDistanceMeasure(NewNode, StartNode); double NodeDistE = NodeDistanceMeasure(NewNode, EndNode); double NodeDistL = NodeDistanceMeasure(NewNode, LastNode); if (NodeDistS > 5 && NodeDistE > 5 && NodeDistL > 5) { NodesList.Add(NewNode); N_W_Link NewLink = new N_W_Link(LastNode.NodeNum, NewNode.NodeNum, Catagory, OneWay); LinksList.Add(NewLink); LastNode = NewNode; AnodeCounter++; } } N_W_Link LastLink = new N_W_Link(LastNode.NodeNum, EndNode.NodeNum, Catagory, OneWay); LinksList.Add(LastLink); } Connect.Close(); }