¿Cómo calcular la distancia entre dos lugares? ¿Hay algún servicio disponible en Google Map para iphone?
Pregunta
Quiero poner la facilidad para mostrar la distancia entre dos lugares seleccionados por el usuario.
¿Hay algún código fuente / servicio de muestra disponible para hacerlo?
Gracias de antemano.
Solución
El CoreLocation Framework proporciona la capacidad de calcular la distancia, en metros, entre dos puntos:
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Puede inicializar un objeto CLLocation
con latitud y longitud:
- (id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude
Otros consejos
Si tiene dos objetos CLLocation, simplemente puede hacer:
[location1 getDistanceFrom:location2];
Sin embargo, eso es solo punto a punto. Si desea la distancia sobre una ruta específica, bueno, esa es otra caldera de pescado.
Esta es una tarea para el marco CLLocation. Con coordenadas conocidas de 2 puntos, puede crear (si aún no los tiene) 2 objetos CLLocation y encontrar una distancia entre ellos usando
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
método.
No estoy familiarizado con el desarrollo de iPhone, pero aquí está el código C # para calcular la distancia entre dos puntos usando la fórmula 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;
}
La Unidad de medida se define como:
/// <summary>
/// Measurement units
/// </summary>
public enum MeasurementUnit
{
Miles,
Kilometers
}
Depende del tipo de diferencia que quieras tener entre ambos puntos. En el mapa creo que no quieres la distancia aérea. Entonces debe verificar http://iosboilerplate.com/
Si todavía quieres usar la distancia aérea, usa la Ubicación Central.
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Devuelve la distancia (en metros) desde la ubicación del receptor a la ubicación especificada. (Desaprobado en iOS 3.2. Uso the distanceFromLocation:
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location