diff --git a/MapControl/Shared/MapProjection.cs b/MapControl/Shared/MapProjection.cs index 33377985..aa0a59d6 100644 --- a/MapControl/Shared/MapProjection.cs +++ b/MapControl/Shared/MapProjection.cs @@ -198,7 +198,7 @@ namespace MapControl InverseViewportTransform = matrix; } - internal Matrix CreateViewportTransform(Point mapCenter, Point viewportCenter) + private Matrix CreateViewportTransform(Point mapCenter, Point viewportCenter) { var matrix = new Matrix(ViewportScale, 0d, 0d, -ViewportScale, -ViewportScale * mapCenter.X, ViewportScale * mapCenter.Y); @@ -215,13 +215,13 @@ namespace MapControl matrix.Rotate(ViewportRotation); - // tile grid origin in map cordinates + // tile grid origin in map coordinates // var mapOrigin = new Point( tileGridTopLeft.X + tileGridOrigin.X / tileGridScale, tileGridTopLeft.Y - tileGridOrigin.Y / tileGridScale); - // tile grid origin in viewport cordinates + // tile grid origin in viewport coordinates // var viewOrigin = ViewportTransform.Transform(mapOrigin); diff --git a/MapControl/Shared/MapTileLayer.cs b/MapControl/Shared/MapTileLayer.cs index 54609bec..9c7383a7 100644 --- a/MapControl/Shared/MapTileLayer.cs +++ b/MapControl/Shared/MapTileLayer.cs @@ -63,10 +63,10 @@ namespace MapControl { } - public IReadOnlyCollection Tiles { get; private set; } = new List(); - public TileGrid TileGrid { get; private set; } + public IReadOnlyCollection Tiles { get; private set; } = new List(); + /// /// Minimum zoom level supported by the MapTileLayer. Default value is 0. /// @@ -85,37 +85,6 @@ namespace MapControl set { SetValue(MaxZoomLevelProperty, value); } } - protected override Size MeasureOverride(Size availableSize) - { - availableSize = new Size(double.PositiveInfinity, double.PositiveInfinity); - - foreach (var tile in Tiles) - { - tile.Image.Measure(availableSize); - } - - return new Size(); - } - - protected override Size ArrangeOverride(Size finalSize) - { - if (TileGrid != null) - { - foreach (var tile in Tiles) - { - var tileSize = TileSize << (TileGrid.ZoomLevel - tile.ZoomLevel); - var x = tileSize * tile.X - TileSize * TileGrid.XMin; - var y = tileSize * tile.Y - TileSize * TileGrid.YMin; - - tile.Image.Width = tileSize; - tile.Image.Height = tileSize; - tile.Image.Arrange(new Rect(x, y, tileSize, tileSize)); - } - } - - return finalSize; - } - protected override void TileSourcePropertyChanged() { if (TileGrid != null) @@ -242,5 +211,36 @@ namespace MapControl TileImageLoader.LoadTilesAsync(Tiles, TileSource, SourceName); } + + protected override Size MeasureOverride(Size availableSize) + { + availableSize = new Size(double.PositiveInfinity, double.PositiveInfinity); + + foreach (var tile in Tiles) + { + tile.Image.Measure(availableSize); + } + + return new Size(); + } + + protected override Size ArrangeOverride(Size finalSize) + { + if (TileGrid != null) + { + foreach (var tile in Tiles) + { + var tileSize = TileSize << (TileGrid.ZoomLevel - tile.ZoomLevel); + var x = tileSize * tile.X - TileSize * TileGrid.XMin; + var y = tileSize * tile.Y - TileSize * TileGrid.YMin; + + tile.Image.Width = tileSize; + tile.Image.Height = tileSize; + tile.Image.Arrange(new Rect(x, y, tileSize, tileSize)); + } + } + + return finalSize; + } } } diff --git a/MapControl/Shared/WmtsTileLayer.cs b/MapControl/Shared/WmtsTileLayer.cs index 5fb98eaa..8571ecad 100644 --- a/MapControl/Shared/WmtsTileLayer.cs +++ b/MapControl/Shared/WmtsTileLayer.cs @@ -33,6 +33,8 @@ namespace MapControl public WmtsTileLayer(ITileImageLoader tileImageLoader) : base(tileImageLoader) { + IsHitTestVisible = false; + Loaded += OnLoaded; } @@ -48,11 +50,16 @@ namespace MapControl set { SetValue(LayerIdentifierProperty, value); } } + public IEnumerable ChildLayers + { + get { return Children.Cast(); } + } + public Dictionary TileMatrixSets { get; } = new Dictionary(); protected override Size MeasureOverride(Size availableSize) { - foreach (var layer in Children.Cast()) + foreach (var layer in ChildLayers) { layer.Measure(availableSize); } @@ -62,7 +69,7 @@ namespace MapControl protected override Size ArrangeOverride(Size finalSize) { - foreach (var layer in Children.Cast()) + foreach (var layer in ChildLayers) { layer.Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height)); } @@ -95,7 +102,7 @@ namespace MapControl protected override void SetRenderTransform() { - foreach (var layer in Children.Cast()) + foreach (var layer in ChildLayers) { layer.SetRenderTransform(ParentMap.MapProjection); } @@ -106,7 +113,7 @@ namespace MapControl var layersChanged = false; var maxScale = 1.001 * ParentMap.MapProjection.ViewportScale; // avoid rounding issues - // show all TileMatrix layers with Scale <= maxScale, or at least the first layer + // show all TileMatrix layers with Scale <= maxScale, at least the first layer // var currentMatrixes = tileMatrixSet.TileMatrixes .Where((matrix, i) => i == 0 || matrix.Scale <= maxScale) @@ -121,9 +128,7 @@ namespace MapControl currentMatrixes = currentMatrixes.Skip(currentMatrixes.Count - MaxBackgroundLevels - 1).ToList(); } - var currentLayers = Children.Cast() - .Where(layer => currentMatrixes.Contains(layer.TileMatrix)) - .ToList(); + var currentLayers = ChildLayers.Where(layer => currentMatrixes.Contains(layer.TileMatrix)).ToList(); Children.Clear(); @@ -152,7 +157,7 @@ namespace MapControl { var tiles = new List(); - foreach (var layer in Children.Cast()) + foreach (var layer in ChildLayers) { layer.UpdateTiles(); diff --git a/MapControl/Shared/WmtsTileMatrixLayer.cs b/MapControl/Shared/WmtsTileMatrixLayer.cs index 2700ad37..c12422c3 100644 --- a/MapControl/Shared/WmtsTileMatrixLayer.cs +++ b/MapControl/Shared/WmtsTileMatrixLayer.cs @@ -28,7 +28,8 @@ namespace MapControl } public WmtsTileMatrix TileMatrix { get; } - public int ZoomLevel { get; } + public int ZoomLevel { get; } // index of TileMatrix in WmtsTileMatrixSet.TileMatrixes + public int XMin { get; private set; } public int YMin { get; private set; } public int XMax { get; private set; }