2011-02-03 11 views

Répondre

3

Si vous voulez obtenir la distance de deux coordonnées, vous pouvez utiliser cet extrait:

#include <math.h> 
#define DEG2RAD(degrees) (degrees * 0.01745327) 
#define RADIUS_OF_EARTH 6378.1 

+ (float) getDistanceFromStartCoords:(CLLocationCoordinate2D)start andEndCoords:(CLLocationCoordinate2D)end 
{ 
    float dist = acos((cos(DEG2RAD(start.latitude))* 
       cos(DEG2RAD(end.latitude))* 
       cos((-1*DEG2RAD(end.longitude))- 
        (-1*DEG2RAD(start.longitude)))) + 
       (sin(DEG2RAD(start.latitude))* 
       sin(DEG2RAD(end.latitude)))) * 
      RADIUS_OF_EARTH; 

    return dist; 
} 
+0

Le monde n'est pas sphérique. Votre calcul de la position par rapport au géoïde a une erreur de 21 km. –

+1

@Graham correct ... mais Manish Jain ne vérifiera pas les points sur DEUX MÈTRES de distance !!! A deux mètres, le fusible mondial ne change pas! – elp

+0

mais ma distance dans la variable CLLocation n'est pas dans CLLocationCoordinate2D –

3

Il n'y a pas de mesure de distance sur l'iPhone qui vous donnera une résolution de 2 mètres. Vous pouvez utiliser la méthode de base Emplacement -[CLLocation distanceFromLocation: otherLocation] pour obtenir un déplacement en mètres entre deux endroits, mais garder à l'esprit:

  • nulle part que j'ai vu n'explique d'Apple ce Geode est utilisé pour leurs coordonnées, et bien que ce soit la la même géode pour différents calculs de position
  • le modèle qu'ils utilisent ne tient pas compte de l'altitude, ce qui est assez moche pour calculer les distances entre des objets de taille humaine dans une zone de la taille d'un champ. C'est bien pour estimer la distance entre Londres et Moscou, cependant - l'erreur est faible.
  • lorsque votre appareil est pas branché, en utilisant très-haut données de localisation de précision associée à une détection de mouvement va aspirer complètement la batterie
  • sans utiliser la détection de mouvement, vous ne pouvez dire où l'appareil est de within tens of metres.
2

Ceci est un « improvment » à la solution ci-dessus. Il ajoute des informations d'altitude. Il semble que l'altitude que la pomme renvoie soit en mètres. Ne convient pas pour voler ou orbite ou comme cela, mais fonctionnera si quelqu'un est de 15 étages directement au-dessus de l'autre personne, sur une montagne à proximité, etc. Pas largement testé. Il suppose que vous ne vous souciez pas de l'altitude pour quelque chose de plus de 20 km. Il se nourrit ensuite d'une correction d'altitude lorsque vous êtes plus près de l'autre personne. Donc, pour deux personnes à 20 mètres l'une de l'autre, mais 100m plus haut, vous obtenez une distance d'environ 102 mètres. Juste à la fin je passe en km pour le retour. Aussi trouvé un bug nan dans le code original.

#define DEG2RAD(degrees) (degrees * 0.01745329251) 
#define RADIUS_OF_EARTH 6371000.0 
// km 
+ (double)getDistanceFromStartCoords:(CLLocationCoordinate2D)start altStart:(double)altStart andEndCoords:(CLLocationCoordinate2D)end altEnd:(double)altEnd; 
{ 
    double argument = (cos(DEG2RAD(start.latitude))* 
       cos(DEG2RAD(end.latitude))* 
       cos((-1*DEG2RAD(end.longitude))- 
        (-1*DEG2RAD(start.longitude)))) + 
       (sin(DEG2RAD(start.latitude))* 
       sin(DEG2RAD(end.latitude))); 

    double dist = 0.0; 
    if (argument < 1.0 && argument > -1.0) // acos will return nan for very small (0) distance 
     dist = acos(argument)*RADIUS_OF_EARTH; 
// else 
//  NSLog(@"found bug, %f", acos(argument)); 


    // Altitude hack. 
    // blend in an altitude correction (blend for smoothness) 
    // add in altitude difference 
    double altDiff = fabs(altStart - altEnd); // altdiff 
    double factor = 1.0 - dist/20000.0; 
    if (factor < 0.0) 
     factor = 0.0; 

    dist += sqrt(dist*dist + factor*altDiff*altDiff); 

    //NSLog(@"distance found, %f", dist); 
    return dist/1000.0; // return km 
} 
Questions connexes