2011-10-18 2 views
0

J'ai besoin d'une fonction en C# pour faire ce qui suit: se déplacer de 50 mètres du point gps A dans la direction du point gps B et calculer le GPS -coordonne pour ce point.Déplacement de # mètres (au sol) de LatLonA vers LatLonB (WGS84)

Par exemple, j'ai deux coordonnées:

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 

Ce que je voudrais est une fonction comme ceci:

function LatLon MoveTowards(LatLon A, LatLon B, double MetersOverGround) 
{ 
    //code here 
} 

Cette fonction retourneraient la coordonnée qui est x mètres de A dans la direction de B.

+0

Je l'ai utilisé la formule Haversine pour calculer les distances entre les points, mais je ne suis pas sûr de savoir comment envelopper un algorithme qui fonctionne comme je demande ... – frankhommers

Répondre

2

La Terre n'est pas une sphère, ni même une ellipse. Le mieux que vous puissiez espérer sans avoir à acheter une bibliothèque commerciale serait une approximation (ce qui, pour la plupart des gens, est suffisant).

Vous pouvez commencer par regarder dans le Haversine formula, et this page vous sera d'une grande aide.

Ou si vous voulez une bibliothèque commerciale, je l'ai utilisé avec succès ProLat

+0

Je l'ai utilisé la Formule de Haversine pour calculer les distances entre les points avant. Une approximation serait suffisante. – frankhommers

0

Voici ce que vous voulez. Utilisez simplement Math.Atan2 pour obtenir le relèvement de votre vecteur A-to-B et obtenez le paramètre 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); 
    } 
Questions connexes