using System.Diagnostics; using System.IO; using Azaion.Common.DTO; using Azaion.Common.DTO.Config; using Azaion.CommonSecurity; using Azaion.CommonSecurity.DTO; using Microsoft.Extensions.Options; namespace Azaion.Common.Services; public interface IGpsMatcherService { Task RunGpsMatching(string userRouteDir, double initialLatitude, double initialLongitude, Func processResult, CancellationToken detectToken = default); void StopGpsMatching(); } public class GpsMatcherService(IGpsMatcherClient gpsMatcherClient, ISatelliteDownloader satelliteTileDownloader, IOptions dirConfig) : IGpsMatcherService { private const int ZOOM_LEVEL = 18; private const int POINTS_COUNT = 10; private const int DISTANCE_BETWEEN_POINTS_M = 100; private const double SATELLITE_RADIUS_M = DISTANCE_BETWEEN_POINTS_M * (POINTS_COUNT + 1); public async Task RunGpsMatching(string userRouteDir, double initialLatitude, double initialLongitude, Func processResult, CancellationToken detectToken = default) { var currentLat = initialLatitude; var currentLon = initialLongitude; var routeDir = Path.Combine(SecurityConstants.EXTERNAL_GPS_DENIED_FOLDER, dirConfig.Value.GpsRouteDirectory); if (Directory.Exists(routeDir)) Directory.Delete(routeDir, true); Directory.CreateDirectory(routeDir); var routeFiles = new List(); foreach (var file in Directory.GetFiles(userRouteDir)) { routeFiles.Add(file); File.Copy(file, Path.Combine(routeDir, Path.GetFileName(file))); } var indexOffset = 0; while (routeFiles.Any()) { await satelliteTileDownloader.GetTiles(currentLat, currentLon, SATELLITE_RADIUS_M, ZOOM_LEVEL, detectToken); gpsMatcherClient.StartMatching(new StartMatchingEvent { ImagesCount = POINTS_COUNT, Latitude = initialLatitude, Longitude = initialLongitude, SatelliteImagesDir = dirConfig.Value.GpsSatDirectory, RouteDir = dirConfig.Value.GpsRouteDirectory }); while (true) { var result = gpsMatcherClient.GetResult(); if (result == null) break; result.Index += indexOffset; await processResult(result); currentLat = result.Latitude; currentLon = result.Longitude; routeFiles.RemoveAt(0); } indexOffset += POINTS_COUNT; } } public void StopGpsMatching() { gpsMatcherClient.Stop(); } }