Version 4.15.1: Use XDocument instead of XmlDocument

This commit is contained in:
ClemensF 2019-11-08 17:26:27 +01:00
parent 9e4c46dbef
commit 1ee86379c4
2 changed files with 46 additions and 55 deletions

View file

@ -7,7 +7,6 @@ using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Xml.Linq; using System.Xml.Linq;
using System.Threading.Tasks;
#if WINDOWS_UWP #if WINDOWS_UWP
using Windows.UI.Xaml; using Windows.UI.Xaml;
#else #else
@ -23,8 +22,6 @@ namespace MapControl
/// </summary> /// </summary>
public class BingMapsTileLayer : MapTileLayer public class BingMapsTileLayer : MapTileLayer
{ {
private static readonly XNamespace imageryMetadataNamespace = "http://schemas.microsoft.com/search/local/ws/rest/v1";
public enum MapMode public enum MapMode
{ {
Road, Aerial, AerialWithLabels Road, Aerial, AerialWithLabels
@ -59,57 +56,42 @@ namespace MapControl
return; 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 try
{ {
var document = await Task.Run(() => XDocument.Load(uri)); var stream = await ImageLoader.HttpClient.GetStreamAsync(metadataUri);
var imageryMetadata = document.Descendants(imageryMetadataNamespace + "ImageryMetadata").FirstOrDefault();
var brandLogoUri = document.Descendants(imageryMetadataNamespace + "BrandLogoUri").FirstOrDefault();
if (imageryMetadata != null) ProcessImageryMetadata(XDocument.Load(stream).Root);
{
ReadImageryMetadata(imageryMetadata);
}
if (brandLogoUri != null)
{
LogoImageUri = new Uri(brandLogoUri.Value);
}
} }
catch (Exception ex) 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 ns = metadataResponse.Name.Namespace;
var imageUrlSubdomains = imageryMetadata.Element(imageryMetadataNamespace + "ImageUrlSubdomains")? var metadata = metadataResponse.Descendants(ns + "ImageryMetadata").FirstOrDefault();
.Elements()
.Where(e => e.Name.LocalName == "string")
.Select(e => e.Value)
.ToArray();
if (!string.IsNullOrEmpty(imageUrl) && if (metadata != null)
imageUrlSubdomains != null &&
imageUrlSubdomains.Length > 0)
{ {
var zoomMin = imageryMetadata.Element(imageryMetadataNamespace + "ZoomMin")?.Value; var imageUrl = metadata.Element(ns + "ImageUrl")?.Value;
var zoomMax = imageryMetadata.Element(imageryMetadataNamespace + "ZoomMax")?.Value; var subdomains = metadata.Element(ns + "ImageUrlSubdomains")?.Elements(ns + "string").Select(e => e.Value).ToArray();
if (!string.IsNullOrEmpty(imageUrl) && subdomains != null && subdomains.Length > 0)
{
var zoomMin = metadata.Element(ns + "ZoomMin")?.Value;
var zoomMax = metadata.Element(ns + "ZoomMax")?.Value;
int zoomLevel; int zoomLevel;
if (!string.IsNullOrEmpty(zoomMin) && if (zoomMin != null && int.TryParse(zoomMin, out zoomLevel) && MinZoomLevel < zoomLevel)
int.TryParse(zoomMin, out zoomLevel) &&
MinZoomLevel < zoomLevel)
{ {
MinZoomLevel = zoomLevel; MinZoomLevel = zoomLevel;
} }
if (!string.IsNullOrEmpty(zoomMax) && if (zoomMax != null && int.TryParse(zoomMax, out zoomLevel) && MaxZoomLevel > zoomLevel)
int.TryParse(zoomMax, out zoomLevel) &&
MaxZoomLevel > zoomLevel)
{ {
MaxZoomLevel = zoomLevel; MaxZoomLevel = zoomLevel;
} }
@ -119,7 +101,15 @@ namespace MapControl
Culture = CultureInfo.CurrentUICulture.Name; Culture = CultureInfo.CurrentUICulture.Name;
} }
TileSource = new BingMapsTileSource(imageUrl.Replace("{culture}", Culture), imageUrlSubdomains); TileSource = new BingMapsTileSource(imageUrl.Replace("{culture}", Culture), subdomains);
}
}
var logoUri = metadataResponse.Element(ns + "BrandLogoUri");
if (logoUri != null)
{
LogoImageUri = new Uri(logoUri.Value);
} }
} }
} }

View file

@ -22,8 +22,6 @@ namespace MapControl
{ {
public partial class WmsImageLayer : MapImageLayer public partial class WmsImageLayer : MapImageLayer
{ {
private static readonly XNamespace wmsNamespace = "http://www.opengis.net/wms";
public static readonly DependencyProperty ServiceUriProperty = DependencyProperty.Register( public static readonly DependencyProperty ServiceUriProperty = DependencyProperty.Register(
nameof(ServiceUri), typeof(Uri), typeof(WmsImageLayer), nameof(ServiceUri), typeof(Uri), typeof(WmsImageLayer),
new PropertyMetadata(null, async (o, e) => await ((WmsImageLayer)o).UpdateImageAsync())); new PropertyMetadata(null, async (o, e) => await ((WmsImageLayer)o).UpdateImageAsync()));
@ -73,21 +71,24 @@ namespace MapControl
if (ServiceUri != null) if (ServiceUri != null)
{ {
var uri = GetRequestUri("GetCapabilities").Replace(" ", "%20"); var capabilitiesUri = GetRequestUri("GetCapabilities").Replace(" ", "%20");
try try
{ {
layerNames = await Task.Run(() => var stream = await ImageLoader.HttpClient.GetStreamAsync(capabilitiesUri);
XDocument.Load(uri) var capabilities = XDocument.Load(stream).Root;
.Descendants(wmsNamespace + "Layer") var ns = capabilities.Name.Namespace;
layerNames = capabilities
.Descendants(ns + "Layer")
.Where(e => e.Attribute("queryable")?.Value == "1") .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)) .Where(n => !string.IsNullOrEmpty(n))
.ToList()); .ToList();
} }
catch (Exception ex) catch (Exception ex)
{ {
Debug.WriteLine("WmsImageLayer: {0}: {1}", uri, ex.Message); Debug.WriteLine("WmsImageLayer: {0}: {1}", capabilitiesUri, ex.Message);
} }
} }