我需要在C#中使用一个函数来执行以下操作:在gps-point B的方向上从gps-point A移动50米并计算该点的GPS坐标。
例如,我有两个坐标:
LatLon LatLonA = new LatLon(51.83966, 5.04631); // Latitude 51.83966, Longitude 5.04631
LatLon LatLonB = new LatLon(51.84172, 5.01961); // Latitude 51.84172, Longitude 5.01961
我想要的是这样的功能:
function LatLon MoveTowards(LatLon A, LatLon B, double MetersOverGround)
{
//code here
}
该函数将返回距离A方向为x米的坐标。
答案 0 :(得分:2)
地球不是球体,也不是椭圆。在没有购买商业图书馆的情况下,您可以获得的最佳效果将是近似值(对大多数人来说已经足够了)。
您可以先查看Haversine formula,然后this page会有很大的帮助。
或者,如果您想要一个商业图书馆,我已经使用ProLat取得了巨大成功
答案 1 :(得分:0)
这是你想要的。只需使用Math.Atan2
获取A-to-B向量的方位并获取bearing
参数。
/// <summary>
/// Calculates the end-point from a given source at a given range (meters) and bearing (degrees).
/// This methods uses simple geometry equations to calculate the end-point.
/// </summary>
/// <param name="source">Point of origin</param>
/// <param name="range">Range in meters</param>
/// <param name="bearing">Bearing in degrees</param>
/// <returns>End-point from the source given the desired range and bearing.</returns>
public static PointLatLng CalculateDerivedPosition(PointLatLng source, double range, double bearing)
{
double latA = source.Lat * DEGREES_TO_RADIANS;
double lonA = source.Lng * DEGREES_TO_RADIANS;
double angularDistance = range / EARTH_RADIUS_M;
double trueCourse = bearing * DEGREES_TO_RADIANS;
double lat = Math.Asin(
Math.Sin(latA) * Math.Cos(angularDistance) +
Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse));
double dlon = Math.Atan2(
Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA),
Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat));
double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI;
return new PointLatLng(
lat / DEGREES_TO_RADIANS,
lon / DEGREES_TO_RADIANS);
}