mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 21:46:30 +00:00
74 lines
2.7 KiB
C#
74 lines
2.7 KiB
C#
using System.Diagnostics;
|
|
using System.IO;
|
|
using Azaion.Common.DTO;
|
|
using Azaion.Common.DTO.Config;
|
|
using Azaion.CommonSecurity;
|
|
using Microsoft.Extensions.Options;
|
|
|
|
namespace Azaion.Common.Services;
|
|
|
|
public interface IGpsMatcherService
|
|
{
|
|
Task RunGpsMatching(string userRouteDir, double initialLatitude, double initialLongitude, Func<GpsMatchResult, Task> processResult, CancellationToken detectToken = default);
|
|
void StopGpsMatching();
|
|
}
|
|
|
|
public class GpsMatcherService(IGpsMatcherClient gpsMatcherClient, ISatelliteDownloader satelliteTileDownloader, IOptions<DirectoriesConfig> 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<GpsMatchResult, Task> 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<string>();
|
|
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();
|
|
}
|
|
}
|
|
|