Come calcolare la distanza tra due luoghi? Esiste un servizio disponibile da Google Map per iPhone?
Domanda
Voglio mettere la funzione per visualizzare la distanza tra due posti selezionati dall'utente.
È disponibile un codice / servizio di esempio per farlo?
Grazie in anticipo.
Soluzione
Il CoreLocation Framework offre la possibilità di calcolare la distanza, in metri, tra due punti:
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Puoi inizializzare un oggetto CLLocation
con latitudine e longitudine:
- (id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude
Altri suggerimenti
Se hai due oggetti CLLocation, puoi semplicemente fare:
[location1 getDistanceFrom:location2];
Tuttavia, è solo punto-punto. Se vuoi la distanza su un percorso specifico, beh, questo è un altro altro bollitore di pesce.
Questa è un'attività per il framework CLLocation. Con le coordinate note di 2 punti puoi creare (se non li hai già) 2 oggetti CLLocation e trovare una distanza tra loro usando
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
metodo.
Non ho familiarità con lo sviluppo di iPhone, ma ecco il codice C # per calcolare la distanza tra due punti usando la formula 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;
}
La MeasurementUnit è definita come:
/// <summary>
/// Measurement units
/// </summary>
public enum MeasurementUnit
{
Miles,
Kilometers
}
Dipende dal tipo di differenza che vuoi avere tra entrambi i punti. Sulla mappa penso che non vuoi la distanza aerea. Quindi dovresti controllare http://iosboilerplate.com/
Se vuoi ancora usare la distanza aerea, usa Core Location.
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Restituisce la distanza (in metri) dalla posizione del ricevitore alla posizione specificata. (Obsoleto in iOS 3.2. Uso the distanceFromLocation:
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location