tiels are cached and reused properly

This commit is contained in:
Anton Martynenko
2025-10-29 11:57:50 +01:00
parent 72eea71507
commit caa30e5017
15 changed files with 509 additions and 57 deletions
+47 -5
View File
@@ -29,15 +29,34 @@ public class TileService : ITileService
int zoomLevel,
CancellationToken cancellationToken = default)
{
var existingTiles = await _tileRepository.GetTilesByRegionAsync(latitude, longitude, sizeMeters, zoomLevel);
var existingTilesList = existingTiles.ToList();
var currentVersion = DateTime.UtcNow.Year;
_logger.LogInformation("Found {Count} existing tiles for region", existingTilesList.Count);
var existingTiles = await _tileRepository.GetTilesByRegionAsync(latitude, longitude, sizeMeters, zoomLevel);
var existingTilesList = existingTiles.Where(t => t.Version == currentVersion).ToList();
_logger.LogInformation("Found {Count} existing tiles for region (version {Version})", existingTilesList.Count, currentVersion);
if (existingTilesList.Any())
{
_logger.LogInformation("Existing tiles in DB:");
foreach (var et in existingTilesList)
{
_logger.LogInformation(" DB Tile: Lat={Lat:F12}, Lon={Lon:F12}, Zoom={Zoom}", et.Latitude, et.Longitude, et.ZoomLevel);
}
}
var centerPoint = new GeoPoint(latitude, longitude);
var downloadedTiles = await _downloader.GetTilesWithMetadataAsync(centerPoint, sizeMeters / 2, zoomLevel, cancellationToken);
_logger.LogInformation("Downloaded {Count} tiles from Google:", downloadedTiles.Count);
foreach (var dt in downloadedTiles)
{
_logger.LogInformation(" Downloaded: Lat={Lat:F12}, Lon={Lon:F12}, Zoom={Zoom}", dt.CenterLatitude, dt.CenterLongitude, dt.ZoomLevel);
}
var result = new List<TileMetadata>();
int reusedCount = 0;
int downloadedCount = 0;
foreach (var downloadedTile in downloadedTiles)
{
@@ -48,11 +67,30 @@ public class TileService : ITileService
if (existingTile != null)
{
_logger.LogDebug("Reusing existing tile at ({Lat}, {Lon})", downloadedTile.CenterLatitude, downloadedTile.CenterLongitude);
reusedCount++;
_logger.LogInformation("REUSED tile at ({Lat:F12}, {Lon:F12}) - matched DB tile ID {Id}", downloadedTile.CenterLatitude, downloadedTile.CenterLongitude, existingTile.Id);
result.Add(MapToMetadata(existingTile));
}
else
{
downloadedCount++;
_logger.LogInformation("NEW tile needed at ({Lat:F12}, {Lon:F12}) - no match in DB", downloadedTile.CenterLatitude, downloadedTile.CenterLongitude);
var closestTile = existingTilesList
.Select(t => new {
Tile = t,
LatDiff = Math.Abs(t.Latitude - downloadedTile.CenterLatitude),
LonDiff = Math.Abs(t.Longitude - downloadedTile.CenterLongitude)
})
.OrderBy(x => x.LatDiff + x.LonDiff)
.FirstOrDefault();
if (closestTile != null)
{
_logger.LogInformation(" Closest DB tile: Lat={Lat:F12} (diff={LatDiff:F12}), Lon={Lon:F12} (diff={LonDiff:F12})",
closestTile.Tile.Latitude, closestTile.LatDiff, closestTile.Tile.Longitude, closestTile.LonDiff);
}
var now = DateTime.UtcNow;
var tileEntity = new TileEntity
{
@@ -64,16 +102,19 @@ public class TileService : ITileService
TileSizePixels = 256,
ImageType = "jpg",
MapsVersion = $"downloaded_{now:yyyy-MM-dd}",
Version = currentVersion,
FilePath = downloadedTile.FilePath,
CreatedAt = now,
UpdatedAt = now
};
await _tileRepository.InsertAsync(tileEntity);
_logger.LogInformation("Saved new tile {Id} at ({Lat}, {Lon})", tileEntity.Id, tileEntity.Latitude, tileEntity.Longitude);
_logger.LogInformation("Saved new tile {Id} at ({Lat:F12}, {Lon:F12}) version {Version}", tileEntity.Id, tileEntity.Latitude, tileEntity.Longitude, currentVersion);
result.Add(MapToMetadata(tileEntity));
}
}
_logger.LogInformation("Tile processing summary: {Reused} reused, {Downloaded} new", reusedCount, downloadedCount);
return result;
}
@@ -106,6 +147,7 @@ public class TileService : ITileService
TileSizePixels = entity.TileSizePixels,
ImageType = entity.ImageType,
MapsVersion = entity.MapsVersion,
Version = entity.Version,
FilePath = entity.FilePath,
CreatedAt = entity.CreatedAt,
UpdatedAt = entity.UpdatedAt