From 0a71989791901520c1cbce87f0a4706089479a81 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Sat, 22 Jun 2024 08:10:45 +0200 Subject: [PATCH] Update GroundOverlay.cs --- MapControl/Shared/GroundOverlay.cs | 124 +++++++++++++---------------- 1 file changed, 55 insertions(+), 69 deletions(-) diff --git a/MapControl/Shared/GroundOverlay.cs b/MapControl/Shared/GroundOverlay.cs index 68ff2bcb..078e4879 100644 --- a/MapControl/Shared/GroundOverlay.cs +++ b/MapControl/Shared/GroundOverlay.cs @@ -11,7 +11,7 @@ using Path = System.IO.Path; using System.IO.Compression; using System.Linq; using System.Threading.Tasks; -using System.Xml; +using System.Xml.Linq; #if WPF using System.Windows; using System.Windows.Controls; @@ -140,14 +140,12 @@ namespace MapControl var imageOverlays = await Task.Run(() => { - var kmlDocument = new XmlDocument(); - using (var docStream = docEntry.Open()) { - kmlDocument.Load(docStream); - } + var kmlDocument = XDocument.Load(docStream); - return ReadGroundOverlays(kmlDocument).ToList(); + return ReadGroundOverlays(kmlDocument.Root).ToList(); + } }); foreach (var imageOverlay in imageOverlays) @@ -179,10 +177,9 @@ namespace MapControl var imageOverlays = await Task.Run(() => { - var kmlDocument = new XmlDocument(); - kmlDocument.Load(docFilePath); + var kmlDocument = XDocument.Load(docFilePath); - return ReadGroundOverlays(kmlDocument).ToList(); + return ReadGroundOverlays(kmlDocument.Root).ToList(); }); foreach (var imageOverlay in imageOverlays) @@ -193,85 +190,74 @@ namespace MapControl return imageOverlays; } - private static IEnumerable ReadGroundOverlays(XmlDocument kmlDocument) + private static IEnumerable ReadGroundOverlays(XElement kmlElement) { - foreach (XmlElement groundOverlayElement in kmlDocument.GetElementsByTagName("GroundOverlay")) - { - LatLonBox latLonBox = null; - string imagePath = null; - int zIndex = 0; + var ns = kmlElement.Name.Namespace; + var docElement = kmlElement.Element(ns + "Document") ?? kmlElement; - foreach (var childElement in groundOverlayElement.ChildNodes.OfType()) + foreach (var folderElement in docElement.Elements(ns + "Folder")) + { + foreach (var groundOverlayElement in folderElement.Elements(ns + "GroundOverlay")) { - switch (childElement.LocalName) + var latLonBoxElement = groundOverlayElement.Element(ns + "LatLonBox"); + var latLonBox = latLonBoxElement != null ? ReadLatLonBox(latLonBoxElement) : null; + + var imagePathElement = groundOverlayElement.Element(ns + "Icon"); + var imagePath = imagePathElement?.Element(ns + "href")?.Value; + + var drawOrder = groundOverlayElement.Element(ns + "drawOrder")?.Value; + var zIndex = drawOrder != null ? int.Parse(drawOrder) : 0; + + if (latLonBox != null && imagePath != null) { - case "LatLonBox": - latLonBox = ReadLatLonBox(childElement); - break; - case "Icon": - imagePath = ReadImagePath(childElement); - break; - case "drawOrder": - zIndex = int.Parse(childElement.InnerText.Trim()); - break; + yield return new ImageOverlay(latLonBox, imagePath, zIndex); } } - - if (latLonBox != null && imagePath != null) - { - yield return new ImageOverlay(latLonBox, imagePath, zIndex); - } } } - private static string ReadImagePath(XmlElement element) - { - string href = null; - - foreach (var childElement in element.ChildNodes.OfType()) - { - switch (childElement.LocalName) - { - case "href": - href = childElement.InnerText.Trim(); - break; - } - } - - return href; - } - - private static LatLonBox ReadLatLonBox(XmlElement element) + private static LatLonBox ReadLatLonBox(XElement latLonBoxElement) { + var ns = latLonBoxElement.Name.Namespace; var north = double.NaN; var south = double.NaN; var east = double.NaN; var west = double.NaN; var rotation = 0d; - foreach (var childElement in element.ChildNodes.OfType()) + var value = latLonBoxElement.Element(ns + "north")?.Value; + if (value != null) { - switch (childElement.LocalName) - { - case "north": - north = double.Parse(childElement.InnerText.Trim(), NumberStyles.Float, CultureInfo.InvariantCulture); - break; - case "south": - south = double.Parse(childElement.InnerText.Trim(), NumberStyles.Float, CultureInfo.InvariantCulture); - break; - case "east": - east = double.Parse(childElement.InnerText.Trim(), NumberStyles.Float, CultureInfo.InvariantCulture); - break; - case "west": - west = double.Parse(childElement.InnerText.Trim(), NumberStyles.Float, CultureInfo.InvariantCulture); - break; - case "rotation": - rotation = double.Parse(childElement.InnerText.Trim(), NumberStyles.Float, CultureInfo.InvariantCulture); - break; - } + north = double.Parse(value, NumberStyles.Float, CultureInfo.InvariantCulture); } - if (north <= south || east <= west) + value = latLonBoxElement.Element(ns + "south")?.Value; + if (value != null) + { + south = double.Parse(value, NumberStyles.Float, CultureInfo.InvariantCulture); + } + + value = latLonBoxElement.Element(ns + "east")?.Value; + if (value != null) + { + east = double.Parse(value, NumberStyles.Float, CultureInfo.InvariantCulture); + } + + value = latLonBoxElement.Element(ns + "west")?.Value; + if (value != null) + { + west = double.Parse(value, NumberStyles.Float, CultureInfo.InvariantCulture); + } + + value = latLonBoxElement.Element(ns + "rotation")?.Value; + if (value != null) + { + rotation = double.Parse(value, NumberStyles.Float, CultureInfo.InvariantCulture); + } + + if (double.IsNaN(north) || double.IsNaN(south) || + double.IsNaN(east) || double.IsNaN(west) || + north <= south || east <= west) { throw new FormatException("Invalid LatLonBox"); }