
Dear Radioman, in First Place Thanks for your excelent piece of code!!! is a fantastic Control for WinForm!!
I need to know if your control have "an reverse" method of GetDistance()
In example, i like to know (or to draw) a segment of x meters, in a line defined by (new PointLatLng(Convert.ToDouble("34.6808729522982"), Convert.ToDouble("58.5749360918999")), (new PointLatLng(Convert.ToDouble("34.6802310993257"),
Convert.ToDouble("58.5741984844208")));
have some method that giving the two points and the meters, give me a resultant point that be x meters distant from the first point ?
If dont have, you happen a way for make this??
Thanks a lot to you or somebody that can help me with this!!!
And sorry to all for my poor english!



First get the bearing between points p1 and p2:
double bearing = GMapProviders.EmptyProvider.Projection.GetBearing(p1, p2);
Then use this method:
//Radius of the Earth
public static readonly double earthRadius = 6371d;
/// <summary>
/// Given a start point, initial bearing, and distance in km, this will calculate the destination point travelling along a (shortest distance) great circle arc.
/// See: http://www.movabletype.co.uk/scripts/latlong.html
/// </summary>
/// <param name="startPoint">The start point.</param>
/// <param name="bearing">The bearing in decimal degrees.</param>
/// <param name="distance">The distance in km</param>
/// <returns></returns>
public static PointLatLng GetPointLatLngFromStartPoint(PointLatLng startPoint, double bearing, double distance)
{
// convert distance to angular distance in radians
distance = distance / earthRadius;
// Convert bearing to Radians
bearing = ToRadians(bearing);
//Convert Degrees of startpoint to radians
double lat1 = ToRadians(startPoint.Lat);
double lon1 = ToRadians(startPoint.Lng);
double lat2 = Math.Asin(Math.Sin(lat1) * Math.Cos(distance) + Math.Cos(lat1) * Math.Sin(distance) * Math.Cos(bearing));
double lon2 = lon1 + Math.Atan2(Math.Sin(bearing) * Math.Sin(distance) * Math.Cos(lat1), Math.Cos(distance)  Math.Sin(lat1) * Math.Sin(lat2));
//normalise to 180..+180º
lon2 = (lon2 + 3 * Math.PI) % (2 * Math.PI)  Math.PI;
return new PointLatLng(ToDegrees(lat2), ToDegrees(lon2));
}
/// <summary>
/// Convert given decimal degrees to radians
/// </summary>
/// <param name="degrees">Degrees</param>
/// <returns>Radians</returns>
public static double ToRadians(double degrees)
{
return degrees * (Math.PI / 180d);
}
/// <summary>
/// Convert given radians to decimal degrees
/// </summary>
/// <param name="radians">Radians</param>
/// <returns>Degrees</returns>
public static double ToDegrees(double radians)
{
return radians * (180d / Math.PI);
}
P.S.: Why do you Convert your doubles from a String??



Dear Xandolph, thanks for your solution!! Is Great. I had no the bearing concept!! is that i need for this propouse!!
Thanks for help people like me, that has not yet the experience for this!!
PD_: I Convert from String because originally this code comes from a textbox!!

