1

J'ai un tableau plein de longitudes et de latitudes. J'ai deux variables doubles avec l'emplacement de mes utilisateurs. Je voudrais tester la distance entre les emplacements de mon utilisateur par rapport à ma matrice pour voir quel emplacement est le plus proche. Comment puis-je faire cela?Trouver la longitude la plus proche et la latitude dans le tableau de l'emplacement de l'utilisateur

Cela permettra d'obtenir la distance entre 2 emplacements, mais stuggeling à comprendre comment je le testerais contre un tableau de lieux.

CLLocation *startLocation = [[CLLocation alloc] initWithLatitude:userlatitude longitude:userlongitude]; 
CLLocation *endLocation = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:annotation.coordinate.longitude]; 
CLLocationDistance distance = [startLocation distanceFromLocation:endLocation]; 

Répondre

3

Vous avez juste besoin de parcourir le tableau en vérifiant les distances.

NSArray *locations = //your array of CLLocation objects 
CLLocation *currentLocation = //current device Location 

CLLocation *closestLocation; 
CLLocationDistance smallestDistance = DOUBLE_MAX; 

for (CLLocation *location in locations) { 
    CLLocationDistance distance = [currentLocation distanceFromLocation:location]; 

    if (distance < smallestDistance) { 
     smallestDistance = distance; 
     closestLocation = location; 
    } 
} 

A la fin de la boucle, vous aurez la plus petite distance et emplacement le plus proche.

+0

À quoi sert le DOUBLE_MAX var? – user3626407

+0

DOUBLE_MAX définit la variable 'smallestDistance' au plus grand nombre possible qu'elle peut être. Vous pouvez le définir sur n'importe quoi, mais si vous le définissez sur '100' au début, vous aurez un problème si la plus petite distance du tableau est réellement' 150'. – Fogmeister

+0

@Fogmeister Ne devriez-vous pas mettre à jour "smallestDistance" au lieu de "distance"? –

2

@Fogmeister

Je pense que cela est une erreur qui doit être mis raison sur DBL_MAX et une mission.

Première: Utilisez DBL_MAX au lieu de DOUBLE_MAX. DBL_MAX est une variable #define dans math.h.
C'est la valeur du nombre maximal (double) de nombres flottants finis représentable.

Deuxième: Dans votre état, votre mission est faux:

if (distance < smallestDistance) { 
     distance = smallestDistance; 
     closestLocation = location; 
} 

Vous devez faire:

if (distance < smallestDistance) { 
     smallestDistance = distance; 
     closestLocation = location; 
} 

La différence est que sera assign valeur de distance en smallestDistance, et non la contraire.

Le résultat final:

NSArray *locations = //your array of CLLocation objects 
CLLocation *currentLocation = //current device Location 

CLLocation *closestLocation; 
CLLocationDistance smallestDistance = DBL_MAX; // set the max value 

for (CLLocation *location in locations) { 
    CLLocationDistance distance = [currentLocation distanceFromLocation:location]; 

    if (distance < smallestDistance) { 
     smallestDistance = distance; 
     closestLocation = location; 
    } 
} 
NSLog(@"smallestDistance = %f", smallestDistance); 

Pouvez-vous confirmer cela est exact?

+1

Il existe un bouton "modifier" pour une raison. – Fogmeister

Questions connexes