177 votes

Calcul de la Distance entre deux de Latitude et de Longitude GeoCoordinates

Je suis le calcul de la distance entre les deux GeoCoordinates. Je suis de tester mon application contre les 3-4 autres applications. Quand je suis du calcul de la distance, j'ai tendance à avoir une moyenne de 3,3 km pour mon calcul, tandis que d'autres applications sont à l'obtention de 3,5 km. C'est une grande différence pour le calcul, je suis en train d'effectuer. Il y a aucune bonne classe bibliothèques pour le calcul de la distance? Je suis la calculer comme ça en C#:

public static double Calculate(double sLatitude,double sLongitude, double eLatitude, 
                               double eLongitude)
{
    var sLatitudeRadians = sLatitude * (Math.PI / 180.0);
    var sLongitudeRadians = sLongitude * (Math.PI / 180.0);
    var eLatitudeRadians = eLatitude * (Math.PI / 180.0);
    var eLongitudeRadians = eLongitude * (Math.PI / 180.0);

    var dLongitude = eLongitudeRadians - sLongitudeRadians;
    var dLatitude = eLatitudeRadians - sLatitudeRadians;

    var result1 = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) + 
                  Math.Cos(sLatitudeRadians) * Math.Cos(eLatitudeRadians) * 
                  Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);

    // Using 3956 as the number of miles around the earth
    var result2 = 3956.0 * 2.0 * 
                  Math.Atan2(Math.Sqrt(result1), Math.Sqrt(1.0 - result1));

    return result2;
}

Que pouvais-je fait de mal? Dois-je le calculer en km et puis les convertir en miles?

363voto

Nigel Sampson Points 6241

Le GeoCoordinate classe a déjà GetDistanceTo méthode.

var sCoord = new GeoCoordinate(sLatitude, sLongitude);
var eCoord = new GeoCoordinate(eLatitude, eLongitude);

return sCoord.GetDistanceTo(eCoord);

129voto

David Leitner Points 163

pour ceux qui ne peuvent pas utiliser GetDistance (par exemple, Application Universelle)

static public double DistanceTo(double lat1, double lon1, double lat2, double lon2, char unit = 'K')
{
    double rlat1 = Math.PI*lat1/180;
    double rlat2 = Math.PI*lat2/180;
    double rlon1 = Math.PI*lon1/180;
    double rlon2 = Math.PI*lon2/180;
    double theta = lon1 - lon2;
    double rtheta = Math.PI*theta/180;
    double dist = 
        Math.Sin(rlat1) * Math.Sin(rlat2) + Math.Cos(rlat1) * 
        Math.Cos(rlat2) * Math.Cos(rtheta);
    dist = Math.Acos(dist);
    dist = dist*180/Math.PI;
    dist = dist*60*1.1515;

    switch (unit)
    {
        case 'K': //Kilometers -> default
            return dist * 1.609344;
        case 'N': //Nautical Miles 
            return dist * 0.8684;
        case 'M': //Miles
            return dist;
    }

    return dist;
}

17voto

Elliot Wood Points 509

Voici la version JavaScript les gars et les filles

function distanceTo(lat1, lon1, lat2, lon2, unit) {
      var rlat1 = Math.PI * lat1/180
      var rlat2 = Math.PI * lat2/180
      var rlon1 = Math.PI * lon1/180
      var rlon2 = Math.PI * lon2/180
      var theta = lon1-lon2
      var rtheta = Math.PI * theta/180
      var dist = Math.sin(rlat1) * Math.sin(rlat2) + Math.cos(rlat1) * Math.cos(rlat2) * Math.cos(rtheta);
      dist = Math.acos(dist)
      dist = dist * 180/Math.PI
      dist = dist * 60 * 1.1515
      if (unit=="K") { dist = dist * 1.609344 }
      if (unit=="N") { dist = dist * 0.8684 }
      return dist
}

4voto

Basé sur Elliot Bois de la fonction, cette fonction de C est de travail...

#define SIM_Degree_to_Radian(x) ((float)x * 0.017453292F)
#define SIM_PI_VALUE                         (3.14159265359)

float GPS_Distance(float lat1, float lon1, float lat2, float lon2)
{
   float theta;
   float dist;

   theta = lon1 - lon2;

   lat1 = SIM_Degree_to_Radian(lat1);
   lat2 = SIM_Degree_to_Radian(lat2);
   theta = SIM_Degree_to_Radian(theta);

   dist = (sin(lat1) * sin(lat2)) + (cos(lat1) * cos(lat2) * cos(theta));
   dist = acos(dist);

//   dist = dist * 180.0 / SIM_PI_VALUE;
//   dist = dist * 60.0 * 1.1515;
//   /* Convert to km */
//   dist = dist * 1.609344;

   dist *= 6370.693486F;

   return (dist);
}

Vous pouvez la changer en double. Elle renvoie la valeur de km.

2voto

Mitch Wheat Points 169614

La terre rayon moyen = 6,371 km = 3958.76 miles

Plutôt que d'utiliser var je vous suggère d'utiliser double, juste pour être explicite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X