A library designed to ease geographic coordinate format conversions, and determine sun/moon information in C#
-Fixes issue with subsolar/sublunar points jumping to wrong position during tracking. Only effects new features in v2.9.#.#.
//Accessible through Coordinate
Coordinate c = new Coordinate(45, 45, new DateTime(2020, 11, 19, 12, 30, 0));
Console.WriteLine(c.CelestialInfo.LunarCoordinates.SublunarLatitude);//-24.0341
Console.WriteLine(c.CelestialInfo.LunarCoordinates.SublunarLongitude);//51.6318
//Static Method
lc = Celestial.Get_Lunar_Coordinate(new DateTime(2020, 11, 19, 12, 30, 0));
Console.WriteLine(lc.SublunarLatitude);//-24.0341
Console.WriteLine(lc.SublunarLongitude);//51.6318
Condition
property to AltitudeEvents
class, allowing users to determine the sun's rise/set condition for a date at specified altitudes.Example:
Coordinate c = new Coordinate(47.40615, -122.24517, new DateTime(2020, 8, 11));
//Determine times the sun passes through 57.8 degrees.
var t = Celestial.Get_Time_at_Solar_Altitude(c, 57.8);
t.Rising; //Null
t.Setting; //Null;
//Should show DownAllDay as the sun never reaches a height of 57.8 degree at the specified location and date.
t.Condition; //DownAllDay
UTM/MGRS coordinates are truncated per standard. Though this makes sense in terms of operating in those systems, it can have adverse impacts when converting back and forth between UTM/MGRS and Lat/Long as precision loss will occur. Rounded and Centimeter versions of these systems are also available for output. These values may be more reliable if converting back and forth between UTM/MGRS and Lat/Long systems.
Example:
Coordinate c = new Coordinate(40.57682, -70.75678);
c.MGRS.ToRoundedString(); // Outputs 19T CE 51308 93265
c.MGRS.ToCentimterString(); // Outputs 19T CE 51307.55707 93264.83597
Uneven spacing should no longer effect parsers: "N45 E 45" will now parse.
Adds CoordinateSharp.Formatters
namespace containing useful mathematical functions to convert things such as radians, degrees, HMS, etc.
Completes unit tests port.
MGRS_GridBox
Marching/Scanning Algorithm.Solar Noon Example
var c = new Coordinate(45.2,-112.4);
c.CelestialInfo.SolarNoon;
Getting Time of Day from Position, Date and Solar Altitude
//lat, long, date, altitude in degrees, UTC offset (if desired).
AltitudeEvents aev = Celestial.Get_Time_at_Solar_Altitude(47.4, -122.6, new DateTime(2020,8,11), 41.6, -7);
//Altitude point crossed time during solar rising
if(aev.Rising.HasValue)
{
aev.Rising; //8/11/2020 10:22:12 AM
}
//Altitude point crossed time during solar setting
if(aev.Setting.HasValue)
{
aev.Setting; //8/11/2020 4:11:33 PM
Obstaining MGRS 100km Square Points/Boundaries
//Create MGRS Coordinate at a Grid Zone Junction Point (partial square)
MilitaryGridReferenceSystem mgrs = new MilitaryGridReferenceSystem("N", 21, "SA", 66037, 61982);
//Set EagerLoad to MGRS only for efficiency
//Only applicable if pulling Lat/Long Coordinate values from box corners
EagerLoad el = new EagerLoad(EagerLoadType.UTM_MGRS);
var gb = mgrs.Get_Box_Boundaries(el);
//Check if box is Valid first (if not corners will be null)
if(!gb.IsBoxValid){return;}
//Get Bottom Left MGRS Object
gb.Bottom_Left_MGRS_Point; //21N SA 66022 00000
//Get Bottom Left Corodinate Object
//Will throw exception if MGRS is not valid.
gb.Bottom_Left_Coordinate_Point; //N 0º 0' 0" W 59º 59' 59.982"
-Adds ability to get Equinox and Solstice information Issue 144. -Adds Solstice/Equinox eager loading extension specification (to turn off new feature and save on performance). -Fixes bug with "TryParse" throwing exceptions under certain conditions Issue 146. -Fixes .NET Core 3.X specific round-tripping issue Issue 147. -Fixes MGRS eager loading specification issues Issue 148 and Issue 150.
Solstice Example
Coordinate c = new Coordinate(45,112, new DateTime(2020,3,6));
Console.WriteLine(c.CelestialInfo.Solstices.Summer);//20-Jun-2020 21:44 (UTC)
-Adds a strong named key to the assembly allowing for use of the assembly in strong named applications.
Parse()
method to both Coordinate
and CoordinatePart
. This method works just like a standard C# Parse
call and will throw exceptions upon failure. It is still recommend that you use TryParse()
unless you can ensure coordinate string formatting is correct or you desire to handle your own exceptions.//Will parse successfully
Coordinate c = Coordinate.Parse("45N 43.456, 64E 25.694");
//Will throw a format exception as Latitude has exceeded bounds
Coordinate c = Coordinate.Parse("205N 43.456, 64E 25.694");
DateTime
is always returned. DateTime d = new DateTime(2019, 2, 6);
//Returns 2/7/2019 12:08:33 AM (the next day) as no moon set occurs on the date specified.
var val = Celestial.Get_Next_MoonSet(40.0352, -74.5844, d);