mirror of
https://github.com/ClemensFischer/XAML-Map-Control.git
synced 2025-12-06 07:12:04 +01:00
Version 4.15.1: Use XDocument instead of XmlDocument
This commit is contained in:
parent
9e4c46dbef
commit
1ee86379c4
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue