zip file for tiles

This commit is contained in:
Anton Martynenko
2025-11-20 12:17:57 +01:00
parent 9048a7b3ec
commit 661396554f
10 changed files with 303 additions and 7 deletions
@@ -989,5 +989,220 @@ public static class RouteTests
Console.WriteLine("✓ Extended Route with 20 Points (10km East) Test: PASSED");
}
public static async Task RunRouteWithTilesZipTest(HttpClient httpClient)
{
Console.WriteLine();
Console.WriteLine("Test: Route with Tiles ZIP File Creation");
Console.WriteLine("=========================================");
Console.WriteLine();
var routeId = Guid.NewGuid();
var request = new CreateRouteRequest
{
Id = routeId,
Name = "Route with Tiles ZIP",
Description = "Test route with tiles zip file creation",
RegionSizeMeters = 500.0,
ZoomLevel = 18,
RequestMaps = true,
CreateTilesZip = true,
Points = new List<RoutePointInput>
{
new() { Lat = 48.276067180586544, Lon = 37.38445758819581 },
new() { Lat = 48.27074009522731, Lon = 37.374029159545906 }
}
};
Console.WriteLine($"Creating route with 2 points:");
Console.WriteLine($" Start: ({request.Points[0].Lat}, {request.Points[0].Lon})");
Console.WriteLine($" End: ({request.Points[1].Lat}, {request.Points[1].Lon})");
Console.WriteLine($" Region Size: {request.RegionSizeMeters}m");
Console.WriteLine($" Zoom Level: {request.ZoomLevel}");
Console.WriteLine($" Request Maps: {request.RequestMaps}");
Console.WriteLine($" Create Tiles ZIP: {request.CreateTilesZip}");
Console.WriteLine();
var response = await httpClient.PostAsJsonAsync("/api/satellite/route", request, JsonWriteOptions);
if (!response.IsSuccessStatusCode)
{
var errorContent = await response.Content.ReadAsStringAsync();
throw new Exception($"API returned error status {response.StatusCode}: {errorContent}");
}
var route = await response.Content.ReadFromJsonAsync<RouteResponseModel>(JsonOptions);
if (route == null)
{
throw new Exception("No route data returned from API");
}
Console.WriteLine("Route Details:");
Console.WriteLine($" ID: {route.Id}");
Console.WriteLine($" Name: {route.Name}");
Console.WriteLine($" Total Points: {route.TotalPoints}");
Console.WriteLine($" Total Distance: {route.TotalDistanceMeters:F2}m");
Console.WriteLine($" Request Maps: {route.RequestMaps}");
Console.WriteLine($" Maps Ready: {route.MapsReady}");
Console.WriteLine();
if (!route.RequestMaps)
{
throw new Exception("Expected RequestMaps to be true");
}
if (route.MapsReady)
{
throw new Exception("Expected MapsReady to be false initially");
}
Console.WriteLine("Step 2: Waiting for route maps and zip file to be ready");
Console.WriteLine(" (Service is processing regions SEQUENTIALLY to avoid API throttling)");
Console.WriteLine();
RouteResponseModel? finalRoute = null;
int maxAttempts = 180;
int pollInterval = 3000;
for (int attempt = 0; attempt < maxAttempts; attempt++)
{
await Task.Delay(pollInterval);
var getResponse = await httpClient.GetAsync($"/api/satellite/route/{routeId}");
if (!getResponse.IsSuccessStatusCode)
{
throw new Exception($"Failed to get route status: {getResponse.StatusCode}");
}
var currentRoute = await getResponse.Content.ReadFromJsonAsync<RouteResponseModel>(JsonOptions);
if (currentRoute == null)
{
throw new Exception("No route returned");
}
if (currentRoute.MapsReady)
{
finalRoute = currentRoute;
Console.WriteLine($"✓ Route maps ready in approximately {attempt * pollInterval / 1000}s");
break;
}
if (attempt % 5 == 0)
{
Console.WriteLine($" Waiting... (attempt {attempt + 1}/{maxAttempts})");
}
if (attempt == maxAttempts - 1)
{
throw new Exception($"Timeout: Route maps did not become ready in {maxAttempts * pollInterval / 1000}s");
}
}
if (finalRoute == null)
{
throw new Exception("Final route is null");
}
Console.WriteLine();
Console.WriteLine("Step 3: Verifying generated files including ZIP");
if (string.IsNullOrEmpty(finalRoute.CsvFilePath))
{
throw new Exception("CSV file path is null or empty");
}
if (string.IsNullOrEmpty(finalRoute.SummaryFilePath))
{
throw new Exception("Summary file path is null or empty");
}
if (string.IsNullOrEmpty(finalRoute.StitchedImagePath))
{
throw new Exception("Stitched image path is null or empty");
}
if (string.IsNullOrEmpty(finalRoute.TilesZipPath))
{
throw new Exception("Tiles ZIP file path is null or empty");
}
if (!File.Exists(finalRoute.CsvFilePath))
{
throw new Exception($"CSV file not found: {finalRoute.CsvFilePath}");
}
if (!File.Exists(finalRoute.SummaryFilePath))
{
throw new Exception($"Summary file not found: {finalRoute.SummaryFilePath}");
}
if (!File.Exists(finalRoute.StitchedImagePath))
{
throw new Exception($"Stitched image not found: {finalRoute.StitchedImagePath}");
}
if (!File.Exists(finalRoute.TilesZipPath))
{
throw new Exception($"Tiles ZIP file not found: {finalRoute.TilesZipPath}");
}
var csvLines = await File.ReadAllLinesAsync(finalRoute.CsvFilePath);
var uniqueTileCount = csvLines.Length - 1;
var stitchedInfo = new FileInfo(finalRoute.StitchedImagePath);
var zipInfo = new FileInfo(finalRoute.TilesZipPath);
Console.WriteLine("Files Generated:");
Console.WriteLine($" ✓ CSV: {Path.GetFileName(finalRoute.CsvFilePath)} ({uniqueTileCount} tiles)");
Console.WriteLine($" ✓ Summary: {Path.GetFileName(finalRoute.SummaryFilePath)}");
Console.WriteLine($" ✓ Stitched Map: {Path.GetFileName(finalRoute.StitchedImagePath)} ({stitchedInfo.Length / 1024:F2} KB)");
Console.WriteLine($" ✓ Tiles ZIP: {Path.GetFileName(finalRoute.TilesZipPath)} ({zipInfo.Length / 1024:F2} KB)");
Console.WriteLine();
Console.WriteLine("Verifying ZIP file contents:");
using (var zipArchive = System.IO.Compression.ZipFile.OpenRead(finalRoute.TilesZipPath))
{
Console.WriteLine($" ZIP contains {zipArchive.Entries.Count} files");
if (zipArchive.Entries.Count == 0)
{
throw new Exception("ZIP file is empty");
}
if (zipArchive.Entries.Count != uniqueTileCount)
{
throw new Exception($"ZIP contains {zipArchive.Entries.Count} files but CSV lists {uniqueTileCount} tiles");
}
var firstEntry = zipArchive.Entries[0];
Console.WriteLine($" First entry: {firstEntry.Name} ({firstEntry.Length} bytes)");
if (firstEntry.Length == 0)
{
throw new Exception("First entry in ZIP is empty");
}
}
Console.WriteLine();
Console.WriteLine("Route Summary:");
Console.WriteLine($" Route ID: {finalRoute.Id}");
Console.WriteLine($" Route Points: {finalRoute.TotalPoints}");
Console.WriteLine($" Distance: {finalRoute.TotalDistanceMeters:F2}m");
Console.WriteLine($" Unique Tiles: {uniqueTileCount}");
Console.WriteLine($" ZIP File Size: {zipInfo.Length / 1024:F2} KB");
Console.WriteLine($" Maps Ready: {finalRoute.MapsReady}");
Console.WriteLine();
if (zipInfo.Length < 1024)
{
throw new Exception($"ZIP file seems too small: {zipInfo.Length} bytes");
}
Console.WriteLine("✓ Route with Tiles ZIP File Test: PASSED");
}
}