Example #1
0
        /// <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);
            }
        }
Example #2
0
        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("----");
                }
            }
        }
Example #3
0
        private static bool Validate(OneWayLine line)
        {
            foreach (var stop in line.Stops.Values)
            {
                if (!stop.HasLatLon)
                {
                    return(false);
                }
            }

            return(true);
        }
Example #4
0
        /// <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);
            }
        }
Example #5
0
        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);
        }
Example #6
0
 private static bool Validate(OneWayLine lineFW, OneWayLine lineBW)
 {
     return(Validate(lineFW) && Validate(lineBW));
 }
Example #7
0
        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
        }