コード例 #1
0
        private void ParseKML_Files()
        {
            Mouse.OverrideCursor = Cursors.Wait;

            DateTime timeStart = DateTime.Now;

            Ortsmarke.ListOrtsmarken.Clear();

            WebClient w = new WebClient();
            w.Encoding = System.Text.Encoding.UTF8;
            //try
            {
                string s = w.DownloadString("http://www.dereglobus.orkenspalter.de/public/DereGlobus/Staedte/kml/Siedlungen/Siedlungen.kml");
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(s);
                string xmlns = string.Empty;
                string xmlns_gx = string.Empty;
                string xmlns_kml = string.Empty;
                string xmlns_atom = string.Empty;
                XmlNodeList linksSiedlungenFolder;
                XmlNamespaceManager nsmgr;
                if (doc.DocumentElement.Attributes["xmlns"] != null)
                {
                    nsmgr = new XmlNamespaceManager(doc.NameTable);

                    xmlns = doc.DocumentElement.Attributes["xmlns"].Value;
                    nsmgr.AddNamespace("x", xmlns);

                    if (doc.DocumentElement.Attributes["xmlns:gx"] != null)
                    {
                        xmlns_gx = doc.DocumentElement.Attributes["xmlns:gx"].Value;
                        nsmgr.AddNamespace("gx", xmlns_gx);
                    }
                    if (doc.DocumentElement.Attributes["xmlns:kml"] != null)
                    {
                        xmlns_kml = doc.DocumentElement.Attributes["xmlns:kml"].Value;
                        nsmgr.AddNamespace("kml", xmlns_kml);
                    }
                    if (doc.DocumentElement.Attributes["xmlns:atom"] != null)
                    {
                        xmlns_atom = doc.DocumentElement.Attributes["xmlns:atom"].Value;
                        nsmgr.AddNamespace("atom", xmlns_atom);
                    }

                    linksSiedlungenFolder = doc.SelectNodes("//x:Folder/x:NetworkLink/x:Link/x:href", nsmgr);
                }
                else
                {
                    linksSiedlungenFolder = doc.SelectNodes("//Folder/NetworkLink/Link/href");
                }

                string indexString = "Name;Art;Longitude;Latitude;Link" + Environment.NewLine;

                foreach (XmlNode nodeSiedlungenLink in linksSiedlungenFolder)
                {
                    string linkSiedlungen = nodeSiedlungenLink.InnerText;
                    s = w.DownloadString(linkSiedlungen);
                    doc = new XmlDocument();

                    // fehlerhafte Dokumente reparieren
                    if (!s.Contains("xmlns:gx=\"http://www.google.com/kml/ext/2.2\""))
                        s= s.Replace("<kml xmlns=\"http://earth.google.com/kml/2.2\">",
                            "<kml xmlns=\"http://earth.google.com/kml/2.2\" xmlns:gx=\"http://www.google.com/kml/ext/2.2\">");

                    doc.LoadXml(s);
                    XmlNodeList list;
                    if (doc.DocumentElement.Attributes["xmlns"] != null)
                    {
                        nsmgr = new XmlNamespaceManager(doc.NameTable);

                        xmlns = doc.DocumentElement.Attributes["xmlns"].Value;
                        nsmgr.AddNamespace("x", xmlns);

                        if (doc.DocumentElement.Attributes["xmlns:gx"] != null)
                        {
                            xmlns_gx = doc.DocumentElement.Attributes["xmlns:gx"].Value;
                            nsmgr.AddNamespace("gx", xmlns_gx);
                        }
                        if (doc.DocumentElement.Attributes["xmlns:kml"] != null)
                        {
                            xmlns_kml = doc.DocumentElement.Attributes["xmlns:kml"].Value;
                            nsmgr.AddNamespace("kml", xmlns_kml);
                        }
                        if (doc.DocumentElement.Attributes["xmlns:atom"] != null)
                        {
                            xmlns_atom = doc.DocumentElement.Attributes["xmlns:atom"].Value;
                            nsmgr.AddNamespace("atom", xmlns_atom);
                        }

                        list = doc.SelectNodes("//x:Placemark", nsmgr);
                    }
                    else
                    {
                        list = doc.SelectNodes("//Placemark");
                    }
                    foreach (XmlNode node in list)
                    {
                        string point = string.Empty;
                        if (node["Point"] != null)
                            point = node["Point"].InnerText;
                        string[] coordinates = point.Split(',');

                        // Link
                        string link = string.Empty;
                        XmlNode linkNode;
                        if (node["ExtendedData"] != null && (linkNode = node["ExtendedData"]["Data"]) != null)
                        {
                            XmlAttribute at = linkNode.Attributes["name"];
                            if (at != null && at.Value == "Link" && linkNode["value"] != null)
                            {
                                if (linkNode["value"].InnerText != "$[name]")
                                    link = linkNode["value"].InnerText;
                            }
                        }

                        Ortsmarke lm = new Ortsmarke()
                        {
                            Name = node["name"].InnerText.Trim(),
                            Longitude = (coordinates.Length >= 1 ? coordinates[0].Trim() : string.Empty),
                            Latitude = (coordinates.Length >= 2 ? coordinates[1].Trim() : string.Empty),
                            KmlLink = linkSiedlungen,
                            Art = node["styleUrl"].InnerText.Split('#')[1].Trim(),
                            Link = link
                        };

                        Ortsmarke.ListOrtsmarken.Add(lm);

                        indexString += lm.ToCSV((bool)KmlLinks) + Environment.NewLine;
                    }
                }
                _listBoxOrtsmarken.BeginInit();
                _listBoxOrtsmarken.ItemsSource = Ortsmarke.ListOrtsmarken;
                _textBoxFilter.Text = string.Empty;
                _listBoxOrtsmarken.Items.SortDescriptions.Add(new System.ComponentModel.SortDescription("Name", System.ComponentModel.ListSortDirection.Ascending));
                textBlock3.Text = Ortsmarke.ListOrtsmarken.Count + " Ortsmarken";
                _listBoxOrtsmarken.EndInit();

                DateTime timeEnde = DateTime.Now;
                TimeSpan dauer = timeEnde - timeStart;
                _textBlockDauer.Text = "Ladedauer: " + dauer.ToString(@"mm\:ss\.fff");

                System.IO.TextWriter csvWriter = System.IO.File.CreateText("Index.csv");
                csvWriter.Write(indexString);
                csvWriter.Close();

                MessageBox.Show("Die Ortsmarken-Daten wurden vom DereGlobus extrahiert!\n\nDie Index-Datei wurde im Programm-Verzeichnis gespeichert.");
            }
            //catch (Exception ex)
            //{
            //    MsgWindow errWin = new MsgWindow("DereGlobus Daten laden", "Beim Laden der DereGlobus Daten ist ein Fehler aufgetreten!", ex);
            //    errWin.ShowDialog();
            //}

            Mouse.OverrideCursor = Cursors.Arrow;
        }
コード例 #2
0
        private void Load_From_CSV(WebClient w)
        {
            string link = string.Empty;
            string s = string.Empty;

            if (System.IO.File.Exists("DereGlobusIndex.csv"))
            {
                try
                {
                    s = System.IO.File.ReadAllText("DereGlobusIndex.csv");
                }
                catch (Exception)
                {
                }

            }
            else
            {
                link = Properties.Settings.Default.DG_IndexPfad_CSV;

                try
                {
                    s = w.DownloadString(link);
                }
                catch (WebException)
                {
                    // hier kann man einen Download der Index-Datei von einer alternativen Webadresse versuchen
                    link = Properties.Settings.Default.DG_IndexPfad_CSV_Fallback;
                    try
                    {
                        s = w.DownloadString(link);
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }

            System.IO.StringReader reader = new System.IO.StringReader(s);
            // Erste Zeile ignorieren, da Header
            reader.ReadLine();
            string line = null;
            string[] attributes;
            while (true)
            {
                line = reader.ReadLine();
                if (line != null)
                {
                    attributes = line.Split(';');

                    Ortsmarke lm = new Ortsmarke();
                    if (attributes != null && attributes.Length >= 1)
                        lm.Name = attributes[0];
                    if (attributes != null && attributes.Length >= 2)
                        lm.Art = attributes[1];
                    if (attributes != null && attributes.Length >= 3)
                        lm.Longitude = attributes[2];
                    if (attributes != null && attributes.Length >= 4)
                        lm.Latitude = attributes[3];
                    if (attributes != null && attributes.Length >= 5)
                        lm.Link = attributes[4];
                    if (attributes != null && attributes.Length >= 6)
                        lm.KmlLink = attributes[5];

                    Ortsmarke.ListOrtsmarken.Add(lm);
                }
                else
                    break; // Ende der Datei erreicht
            }
        }