mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 12:56:30 +00:00
add gps matcher service
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user