/// <summary> /// Set data from XML fragment /// </summary> /// <param name="pmdata">Placemark XML fragment</param> /// <param name="ns">XML namespace</param> public void SetData(XmlNode pmdata, XmlNamespaceManager ns) { Nodes = new List <IKmlItem>(); XmlNodeList points = pmdata.SelectNodes("gx:Track/gx:coord", ns); foreach (XmlNode point in points) { Placemark node = new Placemark(); string triple = point.InnerText.Trim().Replace(' ', ','); node.SetCoord(triple); Nodes.Add(node); } }
/// <summary> /// Constructor /// </summary> /// <param name="Filename">.kml or .kmz file</param> public KmlLib(string Filename) { Stream kmlStream = null; XmlDocument Kml; // if .kmz unpack the file if (System.IO.Path.GetExtension(Filename).ToUpper() == ".KMZ") { FileStream kmzFile = File.OpenRead(Filename); ZipFile zip = new ZipFile(kmzFile); foreach (ZipEntry zipEntry in zip) { if (!zipEntry.IsFile) { continue; // Ignore directories } if (zipEntry.Name.ToUpper() != "DOC.KML") { continue; } kmlStream = zip.GetInputStream(zipEntry); break; } } else { kmlStream = File.OpenRead(Filename); } Kml = new XmlDocument(); Kml.Load(kmlStream); // XML parser XmlNamespaceManager ns = new XmlNamespaceManager(Kml.NameTable); ns.AddNamespace("ns", "http://www.opengis.net/kml/2.2"); ns.AddNamespace("kml", "http://www.opengis.net/kml/2.2"); ns.AddNamespace("gx", "http://www.google.com/kml/ext/2.2"); ns.AddNamespace("atom", "http://www.w3.org/2005/Atom"); XmlNodeList pmList = Kml.GetElementsByTagName("Placemark"); PmList = new List <IKmlItem>(); PathList = new List <IKmlItem>(); PolyList = new List <IKmlItem>(); TrackList = new List <IKmlItem>(); foreach (XmlNode nodo in pmList) { if (nodo.SelectSingleNode("ns:Point", ns) != null) { Placemark pm = new Placemark(); pm.SetData(nodo, ns); PmList.Add(pm); } if (nodo.SelectSingleNode("ns:LineString", ns) != null) { Path pa = new Path(); pa.SetData(nodo, ns); PathList.Add(pa); } if (nodo.SelectSingleNode("ns:Polygon", ns) != null) { Polygon po = new Polygon(); po.SetData(nodo, ns); PolyList.Add(po); } if (nodo.SelectSingleNode("gx:Track", ns) != null) { Track tr = new Track(); tr.SetData(nodo, ns); TrackList.Add(tr); } } }