从LatLonA到LatLonB(WGS84)“移动”#米(地面)

时间:2011-10-18 20:56:56

标签: c# algorithm gis

我需要在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米的坐标。

2 个答案:

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