/// <summary> /// accepts http://www.bus.co.il/otobusim/Front2007/LinePlaces.asp?CompanyID=61&LineCode=115&LanguageID=10 /// </summary> public static void GetLineInfo(string CompanyID, string LineCode, OneWayLine lineFW, OneWayLine lineBW) { lineFW.CompanyID = lineBW.CompanyID = CompanyID; lineFW.LineCode = lineBW.LineCode = LineCode; foreach (var lang in langs) { string langName = lang.Key; string langCode = lang.Value; Uri companyUri = new Uri(String.Format(BusCoIlParser.Company, lineFW.CompanyID, langCode)); lineFW.CompanyName[langName] = lineBW.CompanyName[langName] = GetSingleValue(companyUri, "//h1[@class='FormTitle']", null); Uri sourceLink = new Uri(String.Format(lineBothDirsTemplate, CompanyID, LineCode, langCode)); lineFW.Number = lineBW.Number = GetSingleValue(sourceLink, "//td[@class='FormTitle']", null); GetOrderedStops(sourceLink, langName, lineFW, lineBW); } GetStopsCoords(lineFW, lineBW, langs["he"]); foreach (var lang in langs.Keys) { CleanAllNames(lineFW.Stops.Values, lang); CleanAllNames(lineBW.Stops.Values, lang); } if (!ApproximateMissed(lineFW.Stops.Values)) { SetDefaultCoords(lineFW.Stops.Values); } if (!ApproximateMissed(lineBW.Stops.Values)) { SetDefaultCoords(lineBW.Stops.Values); } }
private static void ParseStopsTable(OneWayLine line, HtmlAgilityPack.HtmlNode routeNode, string langName) { int stopCounter = 0; HtmlAgilityPack.HtmlNode titleNode = routeNode.SelectNodes("tr[1]/td[1]/table[1]/tr[1]/td[1]")[0]; line.From[langName] = titleNode.ChildNodes[0].InnerText.Trim(); line.To[langName] = titleNode.ChildNodes[4].InnerText.Trim(); line.Name[langName] = String.Format("{0} - {1}", line.From[langName], line.To[langName]); HtmlAgilityPack.HtmlNodeCollection rows = routeNode.SelectNodes("tr[1]/td[1]/table[1]/tr[@class='SmallTableRow ']"); if (rows == null) { Console.WriteLine(routeNode.InnerHtml); Console.WriteLine("null collection"); } else { foreach (HtmlAgilityPack.HtmlNode stopRowNode in rows) { //Console.WriteLine (stopNode.InnerHtml); string stopName = stopRowNode.ChildNodes[1].InnerHtml.Trim(); //Console.WriteLine("Name: " + stopName); HtmlAgilityPack.HtmlNode linkNode = stopRowNode.ChildNodes[7].ChildNodes[1]; string link = linkNode.Attributes["href"].Value; //Console.WriteLine("Link: " + link); Uri linkUri = null; Uri.TryCreate(BusCoIlParser.baseUri, link, out linkUri); NameValueCollection col = System.Web.HttpUtility.ParseQueryString(linkUri.Query); if (line.Stops.ContainsKey(stopCounter)) { line.Stops[stopCounter].Name[langName] = stopName; stopCounter++; } else { Stop s = new Stop() { PlaceID = col["PlaceID"] ?? col["PlaceID1"] }; s.Name[langName] = stopName; if (s.PlaceID == null) { throw new ApplicationException(); } line.Stops.Add(stopCounter++, s); } //Console.WriteLine("----"); } } }
private static bool Validate(OneWayLine line) { foreach (var stop in line.Stops.Values) { if (!stop.HasLatLon) { return(false); } } return(true); }
/// <summary> /// Gets ordered list of stops in both directions /// accepts http://www.bus.co.il/otobusim/Front2007/LinePlaces.asp?CompanyID=61&LineCode=115&LanguageID=10 /// </summary> private static bool GetOrderedStops(Uri sourceLink, string langName, OneWayLine lineFW, OneWayLine lineBW) { try { TextReader reader = Importer.Import(sourceLink); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.Load(reader); HtmlAgilityPack.HtmlNodeCollection routes = doc.DocumentNode.SelectNodes("//table[@id='Table1']"); ParseStopsTable(lineFW, routes[0], langName); ParseStopsTable(lineBW, routes[1], langName); return(true); } catch (Exception ex) { Console.WriteLine(ex.Message); return(false); } }
public static void CreateOsm(OneWayLine lineFW, OneWayLine lineBW, string fileName) { if (false == Validate(lineFW, lineBW)) { throw new ArgumentException("Lines isn't valid"); } int id = -1; osm osm = new osm(); osm.generator = "bus2osm"; osm.version = 0.6M; Dictionary <string, int> assignedIDs = new Dictionary <string, int>(); List <osmNode> nodes = new List <osmNode>(); List <osmRelationMember> fw = new List <osmRelationMember>(); List <osmRelationMember> bw = new List <osmRelationMember>(); foreach (var stop in lineFW.Stops.Values) { if (!assignedIDs.ContainsKey(stop.PlaceID)) { assignedIDs[stop.PlaceID] = id--; nodes.Add(CreateNode(assignedIDs, stop)); } fw.Add(new osmRelationMember() { @ref = assignedIDs[stop.PlaceID].ToString(), role = osmRelationMemberRole.stop, type = "node" }); } foreach (var stop in lineBW.Stops.Values) { if (!assignedIDs.ContainsKey(stop.PlaceID)) { assignedIDs[stop.PlaceID] = id--; nodes.Add(CreateNode(assignedIDs, stop)); } bw.Add(new osmRelationMember() { @ref = assignedIDs[stop.PlaceID].ToString(), role = osmRelationMemberRole.stop, type = "node" }); } osm.node = nodes.ToArray(); List <osmTag> tags; #region fw relation tags = new List <osmTag>(); tags.Add(new osmTag() { k = "type", v = "route" }); tags.Add(new osmTag() { k = "route", v = "bus" }); tags.Add(new osmTag() { k = "ref", v = lineFW.Number }); tags.AddRange(GetAllLangTags(lineFW.Name, "name")); tags.AddRange(GetAllLangTags(lineFW.CompanyName, "operator")); tags.AddRange(GetAllLangTags(lineFW.From, "from")); tags.AddRange(GetAllLangTags(lineFW.To, "to")); osmRelation fwRel = new osmRelation() { timestamp = DateTime.Now, tag = tags.ToArray(), visible = true, member = fw.ToArray(), id = id-- }; #endregion #region bw relation tags = new List <osmTag>(); tags.Add(new osmTag() { k = "type", v = "route" }); tags.Add(new osmTag() { k = "route", v = "bus" }); tags.Add(new osmTag() { k = "ref", v = lineBW.Number }); tags.AddRange(GetAllLangTags(lineBW.Name, "name")); tags.AddRange(GetAllLangTags(lineBW.CompanyName, "operator")); tags.AddRange(GetAllLangTags(lineBW.From, "from")); tags.AddRange(GetAllLangTags(lineBW.To, "to")); osmRelation bwRel = new osmRelation() { timestamp = DateTime.Now, tag = tags.ToArray(), visible = true, member = bw.ToArray(), id = id-- }; #endregion osm.relation = new osmRelation[] { fwRel, bwRel }; XmlSerializer ser = new XmlSerializer(typeof(osm)); ser.Serialize(System.IO.File.OpenWrite(fileName), osm); }
private static bool Validate(OneWayLine lineFW, OneWayLine lineBW) { return(Validate(lineFW) && Validate(lineBW)); }
public static void GetStopsCoords(OneWayLine lineFW, OneWayLine lineBW, string langCode) { #region forward direction { Uri forwMapUri = new Uri(String.Format(LineForwardMap, lineFW.CompanyID, lineFW.LineCode, langCode)); TextReader reader = Importer.Import(forwMapUri); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.Load(reader); Regex coordsRegex = new Regex(@"\s*([\d\.]+)\s*,\s*([\d\.]+)\s*,\s*([\d\.]+)\s*\);\s*$"); //x,y,zoom foreach (var stop in lineFW.Stops.Values) { HtmlAgilityPack.HtmlNode node = doc.DocumentNode.SelectSingleNode(".//tr[@id='PlaceRow" + stop.PlaceID + "']"); if (node != null) { HtmlAgilityPack.HtmlNode linkNode = node.SelectSingleNode(".//a"); if (linkNode != null) { string posLink = linkNode.Attributes["href"].Value; if (posLink.StartsWith("javascript: SelectPlace")) { Match m = coordsRegex.Match(posLink); if (m.Success) { stop.Lon = decimal.Parse(m.Groups[1].Value); stop.Lat = decimal.Parse(m.Groups[2].Value); } } } } else { Trace.WriteLine("No place node for stop: " + stop.PlaceID); } } } #endregion #region backward direction { Uri backwMapUri = new Uri(String.Format(LineBackwardMap, lineBW.CompanyID, lineBW.LineCode, langCode)); TextReader reader = Importer.Import(backwMapUri); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.Load(reader); Regex coordsRegex = new Regex(@"\s*([\d\.]+)\s*,\s*([\d\.]+)\s*,\s*([\d\.]+)\s*\);\s*$"); //x,y,zoom foreach (var stop in lineBW.Stops.Values) { HtmlAgilityPack.HtmlNode node = doc.DocumentNode.SelectSingleNode(".//tr[@id='PlaceRow" + stop.PlaceID + "']"); if (node != null) { HtmlAgilityPack.HtmlNode linkNode = node.SelectSingleNode(".//a"); if (linkNode != null) { string posLink = linkNode.Attributes["href"].Value; if (posLink.StartsWith("javascript: SelectPlace")) { Match m = coordsRegex.Match(posLink); if (m.Success) { stop.Lon = decimal.Parse(m.Groups[1].Value); stop.Lat = decimal.Parse(m.Groups[2].Value); } } } } else { Trace.WriteLine("No place node for stop: " + stop.PlaceID); } } } #endregion }