Update GroundOverlay.cs

This commit is contained in:
ClemensFischer 2025-09-04 10:36:39 +02:00
parent 9e33282d07
commit cd31f45feb

View file

@ -30,46 +30,57 @@ namespace MapControl
{ {
private class ImageOverlay private class ImageOverlay
{ {
public ImageOverlay(string imagePath, LatLonBox latLonBox, int zIndex) private readonly string imagePath;
private readonly LatLonBox boundingBox;
private readonly int zIndex;
private ImageSource imageSource;
public ImageOverlay(string path, LatLonBox latLonBox, int zOrder)
{ {
ImagePath = imagePath; imagePath = path;
LatLonBox = latLonBox; boundingBox = latLonBox;
ZIndex = zIndex; zIndex = zOrder;
} }
public async Task LoadStream(ZipArchive archive) public async Task LoadImageSource(ZipArchive archive)
{ {
var entry = archive.GetEntry(ImagePath); var entry = archive.GetEntry(imagePath);
if (entry != null) if (entry != null)
{ {
using (var zipStream = entry.Open()) using (var zipStream = entry.Open())
using (var memoryStream = new MemoryStream((int)zipStream.Length))
{ {
Stream = new MemoryStream((int)zipStream.Length); zipStream.CopyTo(memoryStream); // CopyToAsync won't work with ZipArchive
await zipStream.CopyToAsync(Stream); memoryStream.Seek(0, SeekOrigin.Begin);
imageSource = await ImageLoader.LoadImageAsync(memoryStream);
} }
} }
} }
public async Task LoadImage() public async Task LoadImageSource(Uri docUri)
{ {
if (Stream != null) imageSource = await ImageLoader.LoadImageAsync(new Uri(docUri, imagePath));
{
Stream.Seek(0, SeekOrigin.Begin);
ImageSource = await ImageLoader.LoadImageAsync(Stream);
}
} }
public async Task LoadImage(Uri docUri) public Image CreateImage()
{ {
ImageSource = await ImageLoader.LoadImageAsync(new Uri(docUri, ImagePath)); Image image = null;
if (imageSource != null)
{
image = new Image
{
Source = imageSource,
Stretch = Stretch.Fill
};
image.SetValue(Canvas.ZIndexProperty, zIndex);
SetBoundingBox(image, boundingBox);
} }
public string ImagePath { get; } return image;
public LatLonBox LatLonBox { get; } }
public int ZIndex { get; }
public Stream Stream { get; set; }
public ImageSource ImageSource { get; set; }
} }
private static ILogger logger; private static ILogger logger;
@ -123,16 +134,10 @@ namespace MapControl
if (imageOverlays != null) if (imageOverlays != null)
{ {
foreach (var imageOverlay in imageOverlays.Where(i => i.ImageSource != null)) foreach (var image in imageOverlays
.Select(imageOverlay => imageOverlay.CreateImage())
.Where(image => image != null))
{ {
var image = new Image
{
Source = imageOverlay.ImageSource,
Stretch = Stretch.Fill
};
image.SetValue(Canvas.ZIndexProperty, imageOverlay.ZIndex);
SetBoundingBox(image, imageOverlay.LatLonBox);
Children.Add(image); Children.Add(image);
} }
} }
@ -153,12 +158,7 @@ namespace MapControl
imageOverlays = await ReadGroundOverlays(docStream); imageOverlays = await ReadGroundOverlays(docStream);
} }
foreach (var imageOverlay in imageOverlays) await Task.WhenAll(imageOverlays.Select(imageOverlay => imageOverlay.LoadImageSource(archive)));
{
await imageOverlay.LoadStream(archive);
}
await Task.WhenAll(imageOverlays.Select(imageOverlay => imageOverlay.LoadImage()));
return imageOverlays; return imageOverlays;
} }
@ -177,7 +177,7 @@ namespace MapControl
var docUri = new Uri(docFilePath); var docUri = new Uri(docFilePath);
await Task.WhenAll(imageOverlays.Select(imageOverlay => imageOverlay.LoadImage(docUri))); await Task.WhenAll(imageOverlays.Select(imageOverlay => imageOverlay.LoadImageSource(docUri)));
return imageOverlays; return imageOverlays;
} }
@ -198,18 +198,18 @@ namespace MapControl
{ {
foreach (var groundOverlayElement in folderElement.Elements(ns + "GroundOverlay")) foreach (var groundOverlayElement in folderElement.Elements(ns + "GroundOverlay"))
{ {
var imagePathElement = groundOverlayElement.Element(ns + "Icon"); var pathElement = groundOverlayElement.Element(ns + "Icon");
var imagePath = imagePathElement?.Element(ns + "href")?.Value; var path = pathElement?.Element(ns + "href")?.Value;
var latLonBoxElement = groundOverlayElement.Element(ns + "LatLonBox"); var latLonBoxElement = groundOverlayElement.Element(ns + "LatLonBox");
var latLonBox = latLonBoxElement != null ? ReadLatLonBox(latLonBoxElement) : null; var latLonBox = latLonBoxElement != null ? ReadLatLonBox(latLonBoxElement) : null;
var drawOrder = groundOverlayElement.Element(ns + "drawOrder")?.Value; var drawOrder = groundOverlayElement.Element(ns + "drawOrder")?.Value;
var zIndex = drawOrder != null ? int.Parse(drawOrder) : 0; var zOrder = drawOrder != null ? int.Parse(drawOrder) : 0;
if (latLonBox != null && imagePath != null) if (latLonBox != null && path != null)
{ {
imageOverlays.Add(new ImageOverlay(imagePath, latLonBox, zIndex)); imageOverlays.Add(new ImageOverlay(path, latLonBox, zOrder));
} }
} }
} }