Version 4.17.0: Added support for WMTS

This commit is contained in:
ClemensF 2020-03-23 17:13:50 +01:00
parent b5fe760c83
commit 31a58c3510
4 changed files with 51 additions and 45 deletions

View file

@ -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);

View file

@ -63,10 +63,10 @@ namespace MapControl
{
}
public IReadOnlyCollection<Tile> Tiles { get; private set; } = new List<Tile>();
public TileGrid TileGrid { get; private set; }
public IReadOnlyCollection<Tile> Tiles { get; private set; } = new List<Tile>();
/// <summary>
/// Minimum zoom level supported by the MapTileLayer. Default value is 0.
/// </summary>
@ -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;
}
}
}

View file

@ -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<WmtsTileMatrixLayer> ChildLayers
{
get { return Children.Cast<WmtsTileMatrixLayer>(); }
}
public Dictionary<string, WmtsTileMatrixSet> TileMatrixSets { get; } = new Dictionary<string, WmtsTileMatrixSet>();
protected override Size MeasureOverride(Size availableSize)
{
foreach (var layer in Children.Cast<WmtsTileMatrixLayer>())
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<WmtsTileMatrixLayer>())
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<WmtsTileMatrixLayer>())
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<WmtsTileMatrixLayer>()
.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<Tile>();
foreach (var layer in Children.Cast<WmtsTileMatrixLayer>())
foreach (var layer in ChildLayers)
{
layer.UpdateTiles();

View file

@ -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; }