Comment calculer la distance entre deux endroits? Existe-t-il un service disponible sur Google Map pour iphone?
Question
Je souhaite mettre en place une fonctionnalité permettant d'afficher la distance entre deux lieux sélectionnés par l'utilisateur.
Existe-t-il un exemple de code source / service disponible pour le faire?
Merci d'avance.
La solution
Le CoreLocation Framework permet de calculer la distance, en mètres, entre deux points:
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Vous pouvez initialiser un objet CLLocation
avec la latitude et la longitude:
- (id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude
Autres conseils
Si vous avez deux objets CLLocation, vous pouvez simplement faire:
[location1 getDistanceFrom:location2];
Cependant, ce n’est que point à point. Si vous voulez la distance sur un itinéraire spécifique, eh bien, c’est tout un tas de poissons.
Ceci est une tâche du framework CLLocation. Avec les coordonnées connues de 2 points, vous pouvez créer (si vous ne les avez pas déjà) 2 objets CLLocation et trouver une distance entre eux en utilisant
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
méthode.
Je ne connais pas bien le développement d'un iPhone, mais voici le code C # permettant de calculer la distance entre deux points à l'aide de la formule de Haversine:
/// <summary>
/// Computes the distance beween two points
/// </summary>
/// <param name="P1_Latitude">Latitude of first point (in radians).</param>
/// <param name="P1_Longitude">Longitude of first point(in radians).</param>
/// <param name="P2_Latitude">Latitude of second point (in radians).</param>
/// <param name="P2_Longitude">Longitude of second point (in radians).</param>
protected double ComputeDistance(double P1_Longitude, double P1_Latitude, double P2_Longitude, double P2_Latitude, MeasurementUnit unit)
{
double dLon = P1_Longitude - P2_Longitude;
double dLat = P1_Latitude - P2_Latitude;
double a = Math.Pow(Math.Sin(dLat / 2.0), 2) +
Math.Cos(P1_Latitude) *
Math.Cos(P2_Latitude) *
Math.Pow(Math.Sin(dLon / 2.0), 2.0);
double c = 2 * Math.Asin(Math.Min(1.0, Math.Sqrt(a)));
double d = (unit == MeasurementUnit.Miles ? 3956 : 6367) * c;
return d;
}
L'unité MeasurementUnit est définie comme suit:
/// <summary>
/// Measurement units
/// </summary>
public enum MeasurementUnit
{
Miles,
Kilometers
}
Cela dépend du type de différence que vous voulez avoir entre les deux points. Sur la carte, je pense que vous ne voulez pas la distance dans les airs. Ensuite, vous devriez vérifier http://iosboilerplate.com/
Si vous souhaitez toujours utiliser la distance dans les airs, utilisez Core Location.
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Renvoie la distance (en mètres) entre l'emplacement du destinataire et l'emplacement spécifié. (Obsolète dans iOS 3.2. Utilisation la distance de l'emplacement:
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location