namespace ZeroLevel.ML.Models { public enum PointType { Lat, Lon } public class DmsMsPoint { public int Degrees { get; set; } public int Minutes { get; set; } public int Seconds { get; set; } public int Milliseconds { get; set; } public PointType Type { get; set; } public override string ToString() { var letter = Type == PointType.Lat ? Degrees < 0 ? "S" : "N" : Degrees < 0 ? "W" : "E"; return $"{Degrees}°{Minutes}'{Seconds}.{Milliseconds.ToString("D3")}\"{letter}"; } } public sealed class DmsMsLocation { private DmsMsLocation() { Latitude = null!; Longitude = null!; } public DmsMsPoint Latitude { get; set; } public DmsMsPoint Longitude { get; set; } public override string ToString() { return string.Format("{0}, {1}", Latitude, Longitude); } public static DmsMsLocation CreateFromDouble(double latitude, double longitude) { return new DmsMsLocation { Latitude = Extract(latitude, PointType.Lat), Longitude = Extract(longitude, PointType.Lon) }; } static DmsMsPoint Extract(double value, PointType type) { var d = (int)value; var tmp = (value - d) * 3600; var m = (int)(tmp / 60); var st = tmp % 60; var s = (int)st; var ms = (int)((st - s) * 1000); return new DmsMsPoint { Type = type, Degrees = d, Minutes = m, Seconds = s, Milliseconds = ms }; } public static DmsMsLocation CreateFromDouble(GeoPoint decimalLocation) { if (decimalLocation == null) { return null!; } return CreateFromDouble(decimalLocation.Latitude, decimalLocation.Longitude); } } }