diff --git a/MapControl/Shared/BingMapsTileLayer.cs b/MapControl/Shared/BingMapsTileLayer.cs index 439916fe..38c72412 100644 --- a/MapControl/Shared/BingMapsTileLayer.cs +++ b/MapControl/Shared/BingMapsTileLayer.cs @@ -7,7 +7,6 @@ using System.Diagnostics; using System.Globalization; using System.Linq; using System.Xml.Linq; -using System.Threading.Tasks; #if WINDOWS_UWP using Windows.UI.Xaml; #else @@ -23,8 +22,6 @@ namespace MapControl /// public class BingMapsTileLayer : MapTileLayer { - private static readonly XNamespace imageryMetadataNamespace = "http://schemas.microsoft.com/search/local/ws/rest/v1"; - public enum MapMode { Road, Aerial, AerialWithLabels @@ -59,67 +56,60 @@ namespace MapControl return; } - var uri = "http://dev.virtualearth.net/REST/V1/Imagery/Metadata/" + Mode + "?output=xml&key=" + ApiKey; + var metadataUri = $"http://dev.virtualearth.net/REST/V1/Imagery/Metadata/{Mode}?output=xml&key={ApiKey}"; try { - var document = await Task.Run(() => XDocument.Load(uri)); - var imageryMetadata = document.Descendants(imageryMetadataNamespace + "ImageryMetadata").FirstOrDefault(); - var brandLogoUri = document.Descendants(imageryMetadataNamespace + "BrandLogoUri").FirstOrDefault(); + var stream = await ImageLoader.HttpClient.GetStreamAsync(metadataUri); - if (imageryMetadata != null) - { - ReadImageryMetadata(imageryMetadata); - } - - if (brandLogoUri != null) - { - LogoImageUri = new Uri(brandLogoUri.Value); - } + ProcessImageryMetadata(XDocument.Load(stream).Root); } catch (Exception ex) { - Debug.WriteLine("BingMapsTileLayer: {0}: {1}", uri, ex.Message); + Debug.WriteLine("BingMapsTileLayer: {0}: {1}", metadataUri, ex.Message); } } - private void ReadImageryMetadata(XElement imageryMetadata) + private void ProcessImageryMetadata(XElement metadataResponse) { - var imageUrl = imageryMetadata.Element(imageryMetadataNamespace + "ImageUrl")?.Value; - var imageUrlSubdomains = imageryMetadata.Element(imageryMetadataNamespace + "ImageUrlSubdomains")? - .Elements() - .Where(e => e.Name.LocalName == "string") - .Select(e => e.Value) - .ToArray(); + var ns = metadataResponse.Name.Namespace; + var metadata = metadataResponse.Descendants(ns + "ImageryMetadata").FirstOrDefault(); - if (!string.IsNullOrEmpty(imageUrl) && - imageUrlSubdomains != null && - imageUrlSubdomains.Length > 0) + if (metadata != null) { - var zoomMin = imageryMetadata.Element(imageryMetadataNamespace + "ZoomMin")?.Value; - var zoomMax = imageryMetadata.Element(imageryMetadataNamespace + "ZoomMax")?.Value; - int zoomLevel; + var imageUrl = metadata.Element(ns + "ImageUrl")?.Value; + var subdomains = metadata.Element(ns + "ImageUrlSubdomains")?.Elements(ns + "string").Select(e => e.Value).ToArray(); - if (!string.IsNullOrEmpty(zoomMin) && - int.TryParse(zoomMin, out zoomLevel) && - MinZoomLevel < zoomLevel) + if (!string.IsNullOrEmpty(imageUrl) && subdomains != null && subdomains.Length > 0) { - MinZoomLevel = zoomLevel; - } + var zoomMin = metadata.Element(ns + "ZoomMin")?.Value; + var zoomMax = metadata.Element(ns + "ZoomMax")?.Value; + int zoomLevel; - if (!string.IsNullOrEmpty(zoomMax) && - int.TryParse(zoomMax, out zoomLevel) && - MaxZoomLevel > zoomLevel) - { - MaxZoomLevel = zoomLevel; - } + if (zoomMin != null && int.TryParse(zoomMin, out zoomLevel) && MinZoomLevel < zoomLevel) + { + MinZoomLevel = zoomLevel; + } - if (string.IsNullOrEmpty(Culture)) - { - Culture = CultureInfo.CurrentUICulture.Name; - } + if (zoomMax != null && int.TryParse(zoomMax, out zoomLevel) && MaxZoomLevel > zoomLevel) + { + MaxZoomLevel = zoomLevel; + } - TileSource = new BingMapsTileSource(imageUrl.Replace("{culture}", Culture), imageUrlSubdomains); + if (string.IsNullOrEmpty(Culture)) + { + Culture = CultureInfo.CurrentUICulture.Name; + } + + TileSource = new BingMapsTileSource(imageUrl.Replace("{culture}", Culture), subdomains); + } + } + + var logoUri = metadataResponse.Element(ns + "BrandLogoUri"); + + if (logoUri != null) + { + LogoImageUri = new Uri(logoUri.Value); } } } diff --git a/MapControl/Shared/WmsImageLayer.cs b/MapControl/Shared/WmsImageLayer.cs index a43933ea..9eb86381 100644 --- a/MapControl/Shared/WmsImageLayer.cs +++ b/MapControl/Shared/WmsImageLayer.cs @@ -22,8 +22,6 @@ namespace MapControl { public partial class WmsImageLayer : MapImageLayer { - private static readonly XNamespace wmsNamespace = "http://www.opengis.net/wms"; - public static readonly DependencyProperty ServiceUriProperty = DependencyProperty.Register( nameof(ServiceUri), typeof(Uri), typeof(WmsImageLayer), new PropertyMetadata(null, async (o, e) => await ((WmsImageLayer)o).UpdateImageAsync())); @@ -73,21 +71,24 @@ namespace MapControl if (ServiceUri != null) { - var uri = GetRequestUri("GetCapabilities").Replace(" ", "%20"); + var capabilitiesUri = GetRequestUri("GetCapabilities").Replace(" ", "%20"); try { - layerNames = await Task.Run(() => - XDocument.Load(uri) - .Descendants(wmsNamespace + "Layer") + var stream = await ImageLoader.HttpClient.GetStreamAsync(capabilitiesUri); + var capabilities = XDocument.Load(stream).Root; + var ns = capabilities.Name.Namespace; + + layerNames = capabilities + .Descendants(ns + "Layer") .Where(e => e.Attribute("queryable")?.Value == "1") - .Select(e => e.Element(wmsNamespace + "Name")?.Value) + .Select(e => e.Element(ns + "Name")?.Value) .Where(n => !string.IsNullOrEmpty(n)) - .ToList()); + .ToList(); } catch (Exception ex) { - Debug.WriteLine("WmsImageLayer: {0}: {1}", uri, ex.Message); + Debug.WriteLine("WmsImageLayer: {0}: {1}", capabilitiesUri, ex.Message); } }