Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upGitHub is where the world builds software
Millions of developers and companies build, ship, and maintain their software on GitHub — the largest and most advanced development platform in the world.
Bearing and Reverse bearing #39
Comments
|
I don't think so. If so, it wouldn't really be anything that ProjNet4GeoAPI adds, since this library is just concerned with coordinate transformations. You could, for example, use a conformal projection and compute angles there using NetTopologySuite, but that wouldn't really be different than just computing the angles on the unprojected coordinates. Mike Gavaghan wrote a Geodesy library in both Java and C#... I copied the C# one onto GitHub (with his permission) at airbreather/Gavaghan.Geodesy, which seems a bit more promising.
|
|
Rolled back around to this and had a hard time remembering where I'd asked the question. but thank you I'll look into it. I appreciate the referral. |
|
Something like this? /// <summary>
///
/// </summary>
public enum CompassDirection
{
N,
NE,
E,
SE,
S,
SW,
W,
NW
}
/// <summary>
///
/// </summary>
/// <param name="bearing"></param>
/// <returns></returns>
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static CompassDirection GetCompassDirection(double bearing)
{
if (bearing >= 0 && bearing <= 22.5)
{
return CompassDirection.N;
}
else if (bearing >= 22.5 && bearing <= 67.5)
{
return CompassDirection.NE;
}
else if (bearing >= 67.5 && bearing <= 112.5)
{
return CompassDirection.E;
}
else if (bearing >= 112.5 && bearing <= 157.5)
{
return CompassDirection.SE;
}
else if (bearing >= 157.5 && bearing <= 205.5)
{
return CompassDirection.S;
}
else if (bearing >= 202.5 && bearing <= 247.5)
{
return CompassDirection.SW;
}
else if (bearing >= 247.5 && bearing <= 292.5)
{
return CompassDirection.W;
}
else if (bearing >= 292.5 && bearing <= 337.5)
{
return CompassDirection.NW;
}
else
{
return CompassDirection.N;
}
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static double DegreeBearing(double lon1, double lat1, double lon2, double lat2)
{
var dLon = ToRadians(lon2 - lon1);
var dPhi = Math.Log(Math.Tan(ToRadians(lat2) / 2 + Math.PI / 4) / Math.Tan(ToRadians(lat1) / 2 + Math.PI / 4));
if (Math.Abs(dLon) > Math.PI) dLon = dLon > 0 ? -(2 * Math.PI - dLon) : (2 * Math.PI + dLon);
return ToBearing(Math.Atan2(dLon, dPhi));
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static double ToBearing(double radians)
{
// convert radians to degrees (as bearing: 0...360)
return (ToDegrees(radians) + 360) % 360;
}
See also: StackOverflow |
Is there a way to to calculate bearing and reverse bearing between points?
thanks!