tiles are cached and reused properly

This commit is contained in:
Anton Martynenko
2025-10-29 14:42:54 +01:00
parent caa30e5017
commit afd83ba8ae
2 changed files with 65 additions and 72 deletions
@@ -75,7 +75,7 @@ public class GoogleMapsDownloaderV2
Directory.CreateDirectory(_tilesDirectory);
var timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
var fileName = $"raw_tile_{zoomLevel}_{tileX}_{tileY}_{timestamp}.jpg";
var fileName = $"tile_{zoomLevel}_{tileX}_{tileY}_{timestamp}.jpg";
var filePath = Path.Combine(_tilesDirectory, fileName);
using var httpClient = _httpClientFactory.CreateClient();
@@ -111,7 +111,12 @@ public class GoogleMapsDownloaderV2
return metersPerPixel * TILE_SIZE_PIXELS;
}
public async Task<List<DownloadedTileInfoV2>> GetTilesWithMetadataAsync(GeoPoint centerGeoPoint, double radiusM, int zoomLevel, CancellationToken token = default)
public async Task<List<DownloadedTileInfoV2>> GetTilesWithMetadataAsync(
GeoPoint centerGeoPoint,
double radiusM,
int zoomLevel,
IEnumerable<DataAccess.Models.TileEntity> existingTiles,
CancellationToken token = default)
{
if (!ALLOWED_ZOOM_LEVELS.Contains(zoomLevel))
{
@@ -123,12 +128,12 @@ public class GoogleMapsDownloaderV2
var (xMin, yMin) = GeoUtils.WorldToTilePos(new GeoPoint(latMax, lonMin), zoomLevel);
var (xMax, yMax) = GeoUtils.WorldToTilePos(new GeoPoint(latMin, lonMax), zoomLevel);
_logger.LogInformation("Downloading tiles for region: center=({Lat}, {Lon}), radius={Radius}m, zoom={Zoom}",
_logger.LogInformation("Checking tiles for region: center=({Lat}, {Lon}), radius={Radius}m, zoom={Zoom}",
centerGeoPoint.Lat, centerGeoPoint.Lon, radiusM, zoomLevel);
_logger.LogInformation("Tile range: X=[{XMin}, {XMax}], Y=[{YMin}, {YMax}]", xMin, xMax, yMin, yMax);
var sessionToken = await GetSessionToken();
var downloadedTiles = new List<DownloadedTileInfoV2>();
int skippedCount = 0;
for (var y = yMin; y <= yMax; y++)
{
@@ -137,19 +142,33 @@ public class GoogleMapsDownloaderV2
token.ThrowIfCancellationRequested();
var tileCenter = GeoUtils.TileToWorldPos(x, y, zoomLevel);
var existingTile = existingTiles.FirstOrDefault(t =>
Math.Abs(t.Latitude - tileCenter.Lat) < 0.0001 &&
Math.Abs(t.Longitude - tileCenter.Lon) < 0.0001 &&
t.ZoomLevel == zoomLevel);
if (existingTile != null)
{
skippedCount++;
_logger.LogInformation("Skipping tile ({X}, {Y}) - already exists at {FilePath}", x, y, existingTile.FilePath);
continue;
}
var tileSizeMeters = CalculateTileSizeInMeters(zoomLevel, tileCenter.Lat);
var server = (x + y) % 4;
var url = string.Format(TILE_URL_TEMPLATE, server, x, y, zoomLevel, sessionToken);
Directory.CreateDirectory(_tilesDirectory);
var timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
var fileName = $"tile_{zoomLevel}_{x}_{y}_{timestamp}.jpg";
var filePath = Path.Combine(_tilesDirectory, fileName);
try
{
var sessionToken = await GetSessionToken();
var server = (x + y) % 4;
var url = string.Format(TILE_URL_TEMPLATE, server, x, y, zoomLevel, sessionToken);
Directory.CreateDirectory(_tilesDirectory);
var timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
var fileName = $"tile_{zoomLevel}_{x}_{y}_{timestamp}.jpg";
var filePath = Path.Combine(_tilesDirectory, fileName);
using var httpClient = _httpClientFactory.CreateClient();
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(USER_AGENT);
@@ -173,7 +192,7 @@ public class GoogleMapsDownloaderV2
}
}
_logger.LogInformation("Downloaded {Count} tiles for region", downloadedTiles.Count);
_logger.LogInformation("Downloaded {Count} new tiles, skipped {Skipped} existing tiles", downloadedTiles.Count, skippedCount);
return downloadedTiles;
}
}