From 5daaf01f6b89edd8e1306efaed972ffb38dd8426 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Tue, 9 Dec 2025 17:42:54 +0100 Subject: [PATCH] Updated DrawingTileMatrixLayer and BitmapTileMatrixLayer --- MapControl/WPF/BitmapTileMatrixLayer.WPF.cs | 33 ++++++++------------ MapControl/WPF/DrawingTileMatrixLayer.WPF.cs | 21 +++++++------ 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/MapControl/WPF/BitmapTileMatrixLayer.WPF.cs b/MapControl/WPF/BitmapTileMatrixLayer.WPF.cs index de51b3b8..ef86b6bb 100644 --- a/MapControl/WPF/BitmapTileMatrixLayer.WPF.cs +++ b/MapControl/WPF/BitmapTileMatrixLayer.WPF.cs @@ -36,11 +36,9 @@ namespace MapControl public class BitmapTileMatrixLayer(WmtsTileMatrix wmtsTileMatrix, int zoomLevel) : UIElement { - private readonly ImageBrush imageBrush = new ImageBrush - { - ViewportUnits = BrushMappingMode.Absolute, - Transform = new MatrixTransform() - }; + private readonly MatrixTransform transform = new MatrixTransform(); + + private WriteableBitmap bitmap; public WmtsTileMatrix WmtsTileMatrix => wmtsTileMatrix; @@ -50,7 +48,8 @@ namespace MapControl protected override void OnRender(DrawingContext drawingContext) { - drawingContext.DrawRectangle(imageBrush, null, new Rect(RenderSize)); + drawingContext.PushTransform(transform); + drawingContext.DrawImage(bitmap, new Rect(0d, 0d, bitmap.PixelWidth, bitmap.PixelHeight)); } public void UpdateRenderTransform(ViewTransform viewTransform) @@ -59,8 +58,7 @@ namespace MapControl // var tileMatrixOrigin = new Point(WmtsTileMatrix.TileWidth * TileMatrix.XMin, WmtsTileMatrix.TileHeight * TileMatrix.YMin); - ((MatrixTransform)imageBrush.Transform).Matrix = - viewTransform.GetTileLayerTransform(WmtsTileMatrix.Scale, WmtsTileMatrix.TopLeft, tileMatrixOrigin); + transform.Matrix = viewTransform.GetTileLayerTransform(WmtsTileMatrix.Scale, WmtsTileMatrix.TopLeft, tileMatrixOrigin); } public bool UpdateTiles(ViewTransform viewTransform, double viewWidth, double viewHeight) @@ -99,21 +97,17 @@ namespace MapControl TileMatrix = new TileMatrix(TileMatrix.ZoomLevel, xMin, yMin, xMax, yMax); - CreateBitmap(); + bitmap = new WriteableBitmap( + WmtsTileMatrix.TileWidth * TileMatrix.Width, + WmtsTileMatrix.TileHeight * TileMatrix.Height, + 96, 96, PixelFormats.Pbgra32, null); + CreateTiles(); + InvalidateVisual(); return true; } - private void CreateBitmap() - { - var width = WmtsTileMatrix.TileWidth * TileMatrix.Width; - var height = WmtsTileMatrix.TileHeight * TileMatrix.Height; - - imageBrush.ImageSource = new WriteableBitmap(width, height, 96, 96, PixelFormats.Pbgra32, null); - imageBrush.Viewport = new Rect(0, 0, width, height); - } - private void CreateTiles() { var tiles = new List(TileMatrix.Width * TileMatrix.Height); @@ -160,8 +154,7 @@ namespace MapControl var x = width * (tile.X - TileMatrix.XMin); var y = height * (tile.Y - TileMatrix.YMin); - ((WriteableBitmap)imageBrush.ImageSource).WritePixels( - new Int32Rect(x, y, width, height), tile.PixelBuffer, 4 * WmtsTileMatrix.TileWidth, 0); + bitmap.WritePixels(new Int32Rect(x, y, width, height), tile.PixelBuffer, 4 * WmtsTileMatrix.TileWidth, 0); } private void OnTileCompleted(object sender, EventArgs e) diff --git a/MapControl/WPF/DrawingTileMatrixLayer.WPF.cs b/MapControl/WPF/DrawingTileMatrixLayer.WPF.cs index d5deb9ef..3debb959 100644 --- a/MapControl/WPF/DrawingTileMatrixLayer.WPF.cs +++ b/MapControl/WPF/DrawingTileMatrixLayer.WPF.cs @@ -8,17 +8,22 @@ namespace MapControl { public class DrawingTileMatrixLayer(WmtsTileMatrix wmtsTileMatrix, int zoomLevel) : UIElement { + private readonly MatrixTransform transform = new MatrixTransform(); + public WmtsTileMatrix WmtsTileMatrix => wmtsTileMatrix; public TileMatrix TileMatrix { get; private set; } = new TileMatrix(zoomLevel, 1, 1, 0, 0); public IEnumerable Tiles { get; private set; } = []; - public DrawingGroup Drawing { get; } = new DrawingGroup { Transform = new MatrixTransform() }; - protected override void OnRender(DrawingContext drawingContext) { - drawingContext.DrawDrawing(Drawing); + drawingContext.PushTransform(transform); + + foreach (var tile in Tiles) + { + drawingContext.DrawDrawing(tile.Drawing); + } } public void UpdateRenderTransform(ViewTransform viewTransform) @@ -27,8 +32,7 @@ namespace MapControl // var tileMatrixOrigin = new Point(WmtsTileMatrix.TileWidth * TileMatrix.XMin, WmtsTileMatrix.TileHeight * TileMatrix.YMin); - ((MatrixTransform)Drawing.Transform).Matrix = - viewTransform.GetTileLayerTransform(WmtsTileMatrix.Scale, WmtsTileMatrix.TopLeft, tileMatrixOrigin); + transform.Matrix = viewTransform.GetTileLayerTransform(WmtsTileMatrix.Scale, WmtsTileMatrix.TopLeft, tileMatrixOrigin); } public bool UpdateTiles(ViewTransform viewTransform, double viewWidth, double viewHeight) @@ -68,15 +72,14 @@ namespace MapControl TileMatrix = new TileMatrix(TileMatrix.ZoomLevel, xMin, yMin, xMax, yMax); CreateTiles(); + InvalidateVisual(); return true; } private void CreateTiles() { - var tileCount = TileMatrix.Width * TileMatrix.Height; - var tiles = new List(tileCount); - var drawings = new DrawingCollection(tileCount); + var tiles = new List(TileMatrix.Width * TileMatrix.Height); for (var y = TileMatrix.YMin; y <= TileMatrix.YMax; y++) { @@ -104,12 +107,10 @@ namespace MapControl WmtsTileMatrix.TileHeight); tiles.Add(tile); - drawings.Add(tile.Drawing); } } Tiles = tiles; - Drawing.Children = drawings; } } }