Необходимо всегда использовать второй (выдающий исключения) подход.
Также, если Вы работаете (и имеют сборку конечных версий), лучше выдать исключение (и позволить сбою приложения в худшем случае), чем работа с недопустимыми значениями и возможно уничтожить данные Вашего клиента (который может стоить тысячу долларов).
CoreLocation Framework предоставляет возможность определять расстояние в метрах между двумя точками:
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Вы можете инициализировать объект CLLocation
с широтой и долготой:
- (id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude
Если у вас есть два объекта CLLocation, вы можете просто сделать:
[location1 getDistanceFrom:location2];
Однако это просто точка-точка. Если вам нужна дистанция по определенному маршруту, ну, это совсем другое дело.
Это задача для платформы CLLocation. С известными координатами 2 точек вы можете создать (если у вас их еще нет) 2 объекта CLLocation и определить расстояние между ними с помощью метода
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
.
Я не знаком с разработкой для iPhone, но вот - это код C # для вычисления расстояния между двумя точками с использованием формулы Хаверсина:
/// <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;
}
Единица измерения определяется как:
/// <summary>
/// Measurement units
/// </summary>
public enum MeasurementUnit
{
Miles,
Kilometers
}