GeoImage and GroundOverlay implementation

This commit is contained in:
ClemensFischer 2024-09-14 13:26:57 +02:00
parent febb6d6b00
commit b22ee9a60f
5 changed files with 25 additions and 38 deletions

View file

@ -9,13 +9,6 @@ namespace MapControl
{ {
public static partial class GeoImage public static partial class GeoImage
{ {
private partial class GeoBitmap
{
public Point BitmapSize => new(BitmapSource.PixelSize.Width, BitmapSource.PixelSize.Height);
public ImageBrush ImageBrush => new(BitmapSource);
}
private static Task<GeoBitmap> LoadGeoTiffAsync(string sourcePath) private static Task<GeoBitmap> LoadGeoTiffAsync(string sourcePath)
{ {
throw new InvalidOperationException("GeoTIFF is not supported."); throw new InvalidOperationException("GeoTIFF is not supported.");

View file

@ -33,15 +33,18 @@ namespace MapControl
{ {
public static partial class GeoImage public static partial class GeoImage
{ {
private partial class GeoBitmap private class GeoBitmap
{ {
public GeoBitmap(BitmapSource bitmapSource, Matrix transform, MapProjection projection) public GeoBitmap(BitmapSource bitmapSource, Matrix transform, MapProjection projection)
{ {
BitmapSource = bitmapSource;
var p1 = transform.Transform(new Point()); var p1 = transform.Transform(new Point());
var p2 = transform.Transform(BitmapSize); var p2 = transform.Transform(new Point(
#if AVALONIA
bitmapSource.PixelSize.Width, bitmapSource.PixelSize.Height));
#else
bitmapSource.PixelWidth, bitmapSource.PixelHeight));
#endif
BitmapSource = bitmapSource;
LatLonBox = projection != null LatLonBox = projection != null
? new LatLonBox(projection.MapToBoundingBox(new Rect(p1, p2))) ? new LatLonBox(projection.MapToBoundingBox(new Rect(p1, p2)))
: new LatLonBox(p1.Y, p1.X, p2.Y, p2.X); : new LatLonBox(p1.Y, p1.X, p2.Y, p2.X);
@ -93,13 +96,21 @@ namespace MapControl
if (element is Image image) if (element is Image image)
{ {
image.Source = geoBitmap.BitmapSource;
image.Stretch = Stretch.Fill; image.Stretch = Stretch.Fill;
image.Source = geoBitmap.BitmapSource;
} }
else if (element is Shape shape) else if (element is Shape shape)
{ {
shape.Fill = geoBitmap.ImageBrush;
shape.Stretch = Stretch.Fill; shape.Stretch = Stretch.Fill;
shape.Fill = new ImageBrush
{
Stretch = Stretch.Fill,
#if AVALONIA
Source = geoBitmap.BitmapSource
#else
ImageSource = geoBitmap.BitmapSource
#endif
};
} }
MapPanel.SetBoundingBox(element, geoBitmap.LatLonBox); MapPanel.SetBoundingBox(element, geoBitmap.LatLonBox);

View file

@ -31,15 +31,15 @@ namespace MapControl
{ {
private class ImageOverlay private class ImageOverlay
{ {
public ImageOverlay(BoundingBox boundingBox, string imagePath, int zIndex) public ImageOverlay(string imagePath, BoundingBox boundingBox, int zIndex)
{ {
BoundingBox = boundingBox;
ImagePath = imagePath; ImagePath = imagePath;
BoundingBox = boundingBox;
ZIndex = zIndex; ZIndex = zIndex;
} }
public BoundingBox BoundingBox { get; }
public string ImagePath { get; } public string ImagePath { get; }
public BoundingBox BoundingBox { get; }
public int ZIndex { get; } public int ZIndex { get; }
public ImageSource ImageSource { get; set; } public ImageSource ImageSource { get; set; }
} }
@ -180,18 +180,18 @@ namespace MapControl
{ {
foreach (var groundOverlayElement in folderElement.Elements(ns + "GroundOverlay")) foreach (var groundOverlayElement in folderElement.Elements(ns + "GroundOverlay"))
{ {
var latLonBoxElement = groundOverlayElement.Element(ns + "LatLonBox");
var latLonBox = latLonBoxElement != null ? ReadLatLonBox(latLonBoxElement) : null;
var imagePathElement = groundOverlayElement.Element(ns + "Icon"); var imagePathElement = groundOverlayElement.Element(ns + "Icon");
var imagePath = imagePathElement?.Element(ns + "href")?.Value; var imagePath = imagePathElement?.Element(ns + "href")?.Value;
var latLonBoxElement = groundOverlayElement.Element(ns + "LatLonBox");
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 zIndex = drawOrder != null ? int.Parse(drawOrder) : 0;
if (latLonBox != null && imagePath != null) if (latLonBox != null && imagePath != null)
{ {
yield return new ImageOverlay(latLonBox, imagePath, zIndex); yield return new ImageOverlay(imagePath, latLonBox, zIndex);
} }
} }
} }

View file

@ -6,7 +6,6 @@ using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
@ -14,13 +13,6 @@ namespace MapControl
{ {
public static partial class GeoImage public static partial class GeoImage
{ {
private partial class GeoBitmap
{
public Point BitmapSize => new Point(BitmapSource.PixelWidth, BitmapSource.PixelHeight);
public ImageBrush ImageBrush => new ImageBrush(BitmapSource);
}
private static Task<GeoBitmap> LoadGeoTiffAsync(string sourcePath) private static Task<GeoBitmap> LoadGeoTiffAsync(string sourcePath)
{ {
return Task.Run(() => return Task.Run(() =>

View file

@ -7,10 +7,8 @@ using System.Threading.Tasks;
using Windows.Graphics.Imaging; using Windows.Graphics.Imaging;
using Windows.Storage; using Windows.Storage;
#if UWP #if UWP
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Media.Imaging;
#else #else
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.UI.Xaml.Media.Imaging;
#endif #endif
@ -18,13 +16,6 @@ namespace MapControl
{ {
public static partial class GeoImage public static partial class GeoImage
{ {
private partial class GeoBitmap
{
public Point BitmapSize => new Point(BitmapSource.PixelWidth, BitmapSource.PixelHeight);
public ImageBrush ImageBrush => new ImageBrush { ImageSource = BitmapSource };
}
private static async Task<GeoBitmap> LoadGeoTiffAsync(string sourcePath) private static async Task<GeoBitmap> LoadGeoTiffAsync(string sourcePath)
{ {
BitmapSource bitmapSource; BitmapSource bitmapSource;