Update MapTileLayer.cs

This commit is contained in:
Clemens 2021-11-13 00:28:44 +01:00
parent 68dbebcaac
commit ae8cc0b030

View file

@ -65,7 +65,7 @@ namespace MapControl
public TileMatrix TileMatrix { get; private set; } public TileMatrix TileMatrix { get; private set; }
public List<Tile> Tiles { get; } = new List<Tile>(); public IReadOnlyCollection<Tile> Tiles { get; private set; } = new List<Tile>();
/// <summary> /// <summary>
/// Minimum zoom level supported by the MapTileLayer. Default value is 0. /// Minimum zoom level supported by the MapTileLayer. Default value is 0.
@ -129,7 +129,7 @@ namespace MapControl
{ {
if (TileSource != TileImageLoader.TileSource) if (TileSource != TileImageLoader.TileSource)
{ {
Tiles.Clear(); Tiles = new List<Tile>();
update = true; update = true;
} }
@ -144,13 +144,6 @@ namespace MapControl
{ {
UpdateTiles(); UpdateTiles();
Children.Clear();
foreach (var tile in Tiles)
{
Children.Add(tile.Image);
}
return TileImageLoader.LoadTiles(Tiles, TileSource, SourceName); return TileImageLoader.LoadTiles(Tiles, TileSource, SourceName);
} }
@ -201,25 +194,17 @@ namespace MapControl
private void UpdateTiles() private void UpdateTiles()
{ {
var newTiles = new List<Tile>();
int maxZoomLevel; int maxZoomLevel;
if (TileSource == null || if (TileSource != null &&
TileMatrix == null || TileMatrix != null &&
(maxZoomLevel = Math.Min(TileMatrix.ZoomLevel, MaxZoomLevel)) < MinZoomLevel) (maxZoomLevel = Math.Min(TileMatrix.ZoomLevel, MaxZoomLevel)) >= MinZoomLevel)
{
Tiles.Clear();
}
else
{ {
var minZoomLevel = IsBaseMapLayer var minZoomLevel = IsBaseMapLayer
? Math.Max(TileMatrix.ZoomLevel - MaxBackgroundLevels, MinZoomLevel) ? Math.Max(TileMatrix.ZoomLevel - MaxBackgroundLevels, MinZoomLevel)
: maxZoomLevel; : maxZoomLevel;
var oldTiles = Tiles.Where(t => t.ZoomLevel >= minZoomLevel && t.ZoomLevel <= maxZoomLevel).ToList();
var newTiles = new List<Tile>();
Tiles.Clear();
for (var z = minZoomLevel; z <= maxZoomLevel; z++) for (var z = minZoomLevel; z <= maxZoomLevel; z++)
{ {
var tileSize = 1 << (TileMatrix.ZoomLevel - z); var tileSize = 1 << (TileMatrix.ZoomLevel - z);
@ -232,13 +217,13 @@ namespace MapControl
{ {
for (var x = x1; x <= x2; x++) for (var x = x1; x <= x2; x++)
{ {
var tile = oldTiles.FirstOrDefault(t => t.ZoomLevel == z && t.X == x && t.Y == y); var tile = Tiles.FirstOrDefault(t => t.ZoomLevel == z && t.X == x && t.Y == y);
if (tile == null) if (tile == null)
{ {
tile = new Tile(z, x, y); tile = new Tile(z, x, y);
var equivalentTile = oldTiles.FirstOrDefault( var equivalentTile = Tiles.FirstOrDefault(
t => t.ZoomLevel == z && t.XIndex == tile.XIndex && t.Y == y && !t.Pending); t => t.ZoomLevel == z && t.XIndex == tile.XIndex && t.Y == y && !t.Pending);
if (equivalentTile != null) if (equivalentTile != null)
@ -247,11 +232,20 @@ namespace MapControl
} }
} }
Tiles.Add(tile); newTiles.Add(tile);
} }
} }
} }
} }
Tiles = newTiles;
Children.Clear();
foreach (var tile in Tiles)
{
Children.Add(tile.Image);
}
} }
} }
} }