You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel.ML/Models/DmsMs.cs

66 lines
2.0 KiB

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);
}
}
}

Powered by TurnKey Linux.