mirror of
https://github.com/azaion/annotations.git
synced 2026-04-22 11:16:30 +00:00
add gps matcher service
This commit is contained in:
@@ -26,6 +26,8 @@
|
||||
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
|
||||
<PackageReference Include="SkiaSharp" Version="2.88.9" />
|
||||
<PackageReference Include="System.Data.SQLite" Version="1.0.119" />
|
||||
<PackageReference Include="System.Data.SQLite.EF6" Version="1.0.119" />
|
||||
<PackageReference Include="VideoLAN.LibVLC.Windows" Version="3.0.21" />
|
||||
<PackageReference Include="WindowsAPICodePack" Version="7.0.4" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace Azaion.Annotator.Controls
|
||||
|
||||
public CircleVisual(GMapMarker m, Brush background)
|
||||
{
|
||||
ShadowEffect = new DropShadowEffect();
|
||||
Marker = m;
|
||||
Marker.ZIndex = 100;
|
||||
|
||||
@@ -161,14 +162,11 @@ namespace Azaion.Annotator.Controls
|
||||
|
||||
public double? Angle
|
||||
{
|
||||
get
|
||||
{
|
||||
return _angle;
|
||||
}
|
||||
get => _angle;
|
||||
set
|
||||
{
|
||||
if (!Angle.HasValue || !value.HasValue ||
|
||||
Angle.HasValue && value.HasValue && Math.Abs(_angle.Value - value.Value) > 11)
|
||||
if (!_angle.HasValue || !value.HasValue ||
|
||||
Angle.HasValue && Math.Abs(_angle.Value - value.Value) > 11)
|
||||
{
|
||||
_angle = value;
|
||||
IsChanged = true;
|
||||
@@ -211,31 +209,28 @@ namespace Azaion.Annotator.Controls
|
||||
|
||||
public virtual Visual Child
|
||||
{
|
||||
get
|
||||
{
|
||||
return _child;
|
||||
}
|
||||
get => _child;
|
||||
set
|
||||
{
|
||||
if (_child != value)
|
||||
if (_child == value)
|
||||
return;
|
||||
|
||||
if (_child != null)
|
||||
{
|
||||
if (_child != null)
|
||||
{
|
||||
RemoveLogicalChild(_child);
|
||||
RemoveVisualChild(_child);
|
||||
}
|
||||
|
||||
if (value != null)
|
||||
{
|
||||
AddVisualChild(value);
|
||||
AddLogicalChild(value);
|
||||
}
|
||||
|
||||
// cache the new child
|
||||
_child = value;
|
||||
|
||||
InvalidateVisual();
|
||||
RemoveLogicalChild(_child);
|
||||
RemoveVisualChild(_child);
|
||||
}
|
||||
|
||||
if (value != null)
|
||||
{
|
||||
AddVisualChild(value);
|
||||
AddLogicalChild(value);
|
||||
}
|
||||
|
||||
// cache the new child
|
||||
_child = value;
|
||||
|
||||
InvalidateVisual();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,36 +254,34 @@ namespace Azaion.Annotator.Controls
|
||||
|
||||
var square = new DrawingVisualFx();
|
||||
|
||||
using (var dc = square.RenderOpen())
|
||||
using var dc = square.RenderOpen();
|
||||
dc.DrawEllipse(null,
|
||||
Stroke,
|
||||
new Point(Width / 2, Height / 2),
|
||||
Width / 2 + Stroke.Thickness / 2,
|
||||
Height / 2 + Stroke.Thickness / 2);
|
||||
|
||||
if (Angle.HasValue)
|
||||
{
|
||||
dc.DrawEllipse(null,
|
||||
Stroke,
|
||||
new Point(Width / 2, Height / 2),
|
||||
Width / 2 + Stroke.Thickness / 2,
|
||||
Height / 2 + Stroke.Thickness / 2);
|
||||
|
||||
if (Angle.HasValue)
|
||||
dc.PushTransform(new RotateTransform(Angle.Value, Width / 2, Height / 2));
|
||||
{
|
||||
dc.PushTransform(new RotateTransform(Angle.Value, Width / 2, Height / 2));
|
||||
{
|
||||
var polySeg = new PolyLineSegment(new[]
|
||||
{
|
||||
new Point(Width * 0.2, Height * 0.3), new Point(Width * 0.8, Height * 0.3)
|
||||
},
|
||||
true);
|
||||
var pathFig = new PathFigure(new Point(Width * 0.5, -Height * 0.22),
|
||||
new PathSegment[] {polySeg},
|
||||
true);
|
||||
var pathGeo = new PathGeometry(new[] {pathFig});
|
||||
dc.DrawGeometry(Brushes.AliceBlue, StrokeArrow, pathGeo);
|
||||
}
|
||||
dc.Pop();
|
||||
var polySeg = new PolyLineSegment(new[]
|
||||
{
|
||||
new Point(Width * 0.2, Height * 0.3), new Point(Width * 0.8, Height * 0.3)
|
||||
},
|
||||
true);
|
||||
var pathFig = new PathFigure(new Point(Width * 0.5, -Height * 0.22),
|
||||
new PathSegment[] {polySeg},
|
||||
true);
|
||||
var pathGeo = new PathGeometry(new[] {pathFig});
|
||||
dc.DrawGeometry(Brushes.AliceBlue, StrokeArrow, pathGeo);
|
||||
}
|
||||
|
||||
dc.DrawEllipse(Background, null, new Point(Width / 2, Height / 2), Width / 2, Height / 2);
|
||||
dc.DrawText(_fText, new Point(Width / 2 - _fText.Width / 2, Height / 2 - _fText.Height / 2));
|
||||
dc.Pop();
|
||||
}
|
||||
|
||||
dc.DrawEllipse(Background, null, new Point(Width / 2, Height / 2), Width / 2, Height / 2);
|
||||
dc.DrawText(_fText, new Point(Width / 2 - _fText.Width / 2, Height / 2 - _fText.Height / 2));
|
||||
|
||||
return square;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,11 +21,11 @@ namespace Azaion.Annotator.Controls;
|
||||
|
||||
public partial class MapMatcher : UserControl
|
||||
{
|
||||
private AppConfig _appConfig;
|
||||
List<MediaFileInfo> _allMediaFiles;
|
||||
private Dictionary<int, Annotation> _annotations;
|
||||
private string _currentDir;
|
||||
private IGpsMatcherService _gpsMatcherService;
|
||||
private AppConfig _appConfig = null!;
|
||||
List<MediaFileInfo> _allMediaFiles = new();
|
||||
private Dictionary<int, Annotation> _annotations = new();
|
||||
private string _currentDir = null!;
|
||||
private IGpsMatcherService _gpsMatcherService = null!;
|
||||
|
||||
public MapMatcher()
|
||||
{
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
<PackageReference Include="Polly" Version="8.5.2" />
|
||||
<PackageReference Include="RabbitMQ.Stream.Client" Version="1.8.9" />
|
||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
|
||||
<PackageReference Include="Stub.System.Data.SQLite.Core.NetStandard" Version="1.0.119" />
|
||||
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.119" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="5.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
|
||||
public class MapConfig
|
||||
{
|
||||
public string Service { get; set; }
|
||||
public string ApiKey { get; set; }
|
||||
public string Service { get; set; } = null!;
|
||||
public string ApiKey { get; set; } = null!;
|
||||
}
|
||||
@@ -5,12 +5,12 @@ using System.IO;
|
||||
public class GpsMatchResult
|
||||
{
|
||||
public int Index { get; set; }
|
||||
public string Image { get; set; }
|
||||
public string Image { get; set; } = null!;
|
||||
public double Latitude { get; set; }
|
||||
public double Longitude { get; set; }
|
||||
public int Keypoints { get; set; }
|
||||
public int Rotation { get; set; }
|
||||
public string MatchType { get; set; }
|
||||
public int KeyPoints { get; set; }
|
||||
public int Rotation { get; set; }
|
||||
public string MatchType { get; set; } = null!;
|
||||
|
||||
public static List<GpsMatchResult> ReadFromCsv(string csvFilePath)
|
||||
{
|
||||
@@ -35,7 +35,7 @@ public class GpsMatchResult
|
||||
Image = GetFilename(values[0]),
|
||||
Latitude = double.Parse(values[1]),
|
||||
Longitude = double.Parse(values[2]),
|
||||
Keypoints = int.Parse(values[3]),
|
||||
KeyPoints = int.Parse(values[3]),
|
||||
Rotation = int.Parse(values[4]),
|
||||
MatchType = values[5]
|
||||
});
|
||||
|
||||
@@ -33,7 +33,7 @@ public partial class App
|
||||
private IMediator _mediator = null!;
|
||||
private FormState _formState = null!;
|
||||
|
||||
private InferenceExternalClient _inferenceClient = null!;
|
||||
private IInferenceClient _inferenceClient = null!;
|
||||
private IResourceLoader _resourceLoader = null!;
|
||||
private IAuthProvider _authProvider = null!;
|
||||
|
||||
@@ -81,7 +81,7 @@ public partial class App
|
||||
{
|
||||
new ConfigUpdater().CheckConfig();
|
||||
var secureAppConfig = ReadSecureAppConfig();
|
||||
_inferenceClient = new InferenceExternalClient(new OptionsWrapper<InferenceClientConfig>(secureAppConfig.InferenceClientConfig));
|
||||
_inferenceClient = new InferenceClient(new OptionsWrapper<InferenceClientConfig>(secureAppConfig.InferenceClientConfig));
|
||||
_resourceLoader = new ResourceLoader(_inferenceClient);
|
||||
_authProvider = new AuthProvider(_inferenceClient);
|
||||
|
||||
@@ -168,8 +168,8 @@ public partial class App
|
||||
|
||||
services.ConfigureSection<InferenceClientConfig>(context.Configuration);
|
||||
services.ConfigureSection<GpsDeniedClientConfig>(context.Configuration);
|
||||
services.AddKeyedSingleton<IExternalClient>(SecurityConstants.EXTERNAL_INFERENCE_PATH, _inferenceClient);
|
||||
services.AddKeyedSingleton<IExternalClient, GpsDeniedExternalClient>(SecurityConstants.EXTERNAL_GPS_DENIED_PATH);
|
||||
services.AddSingleton<IInferenceClient>(_inferenceClient);
|
||||
services.AddSingleton<IGpsMatcherClient, GpsMatcherClient>();
|
||||
services.AddSingleton<IResourceLoader>(_resourceLoader);
|
||||
services.AddSingleton<IAuthProvider>(_authProvider);
|
||||
services.AddSingleton<IInferenceService, InferenceService>();
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
|
||||
<PackageReference Include="SharpVectors" Version="1.8.4.2" />
|
||||
<PackageReference Include="SharpVectors.Wpf" Version="1.8.4.2" />
|
||||
<PackageReference Include="System.Data.SQLite" Version="1.0.119" />
|
||||
<PackageReference Include="VideoLAN.LibVLC.Windows" Version="3.0.21" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -26,7 +26,8 @@ public partial class MainSuite
|
||||
private readonly IDbFactory _dbFactory;
|
||||
private readonly Dictionary<WindowEnum, Window> _openedWindows = new();
|
||||
private readonly IResourceLoader _resourceLoader;
|
||||
private readonly IEnumerable<IExternalClient> _externalClients;
|
||||
private readonly IInferenceClient _inferenceClient;
|
||||
private readonly IGpsMatcherClient _gpsMatcherClient;
|
||||
private static readonly Guid SaveConfigTaskId = Guid.NewGuid();
|
||||
|
||||
public MainSuite(IOptions<AppConfig> appConfig,
|
||||
@@ -36,8 +37,8 @@ public partial class MainSuite
|
||||
IGalleryService galleryService,
|
||||
IDbFactory dbFactory,
|
||||
IResourceLoader resourceLoader,
|
||||
[FromKeyedServices(SecurityConstants.EXTERNAL_INFERENCE_PATH)] IExternalClient inferenceClient,
|
||||
[FromKeyedServices(SecurityConstants.EXTERNAL_GPS_DENIED_PATH)] IExternalClient gpsClient)
|
||||
IInferenceClient inferenceClient,
|
||||
IGpsMatcherClient gpsMatcherClient)
|
||||
{
|
||||
_configUpdater = configUpdater;
|
||||
_modules = modules;
|
||||
@@ -45,7 +46,9 @@ public partial class MainSuite
|
||||
_galleryService = galleryService;
|
||||
_dbFactory = dbFactory;
|
||||
_resourceLoader = resourceLoader;
|
||||
_externalClients = [inferenceClient, gpsClient];
|
||||
_inferenceClient = inferenceClient;
|
||||
_gpsMatcherClient = gpsMatcherClient;
|
||||
|
||||
_appConfig = appConfig.Value;
|
||||
InitializeComponent();
|
||||
Loaded += OnLoaded;
|
||||
@@ -120,8 +123,9 @@ public partial class MainSuite
|
||||
if (_openedWindows.Any())
|
||||
return;
|
||||
|
||||
foreach (var client in _externalClients)
|
||||
client.Stop();
|
||||
_inferenceClient.Stop();
|
||||
_gpsMatcherClient.Stop();
|
||||
|
||||
Close();
|
||||
};
|
||||
window.Show();
|
||||
|
||||
Reference in New Issue
Block a user