Estoy escribiendo una aplicación para Windows Phone 7 que necesita conocer la ubicación. Específicamente, quiero que se ejecute algún código (C#) cuando el teléfono se encuentre dentro de un rango (fijo) de una ubicación en particular, digamos 0.5 millas. Tengo todos los datos lat/long para las ubicaciones físicas en la memoria. Utilizaré el Geo Coordinate Watcher class para obtener las coordenadas actuales de los dispositivos. Ahora, el único truco es calcular si el usuario está dentro del alcance de cualquiera de las ubicaciones.Calcular si una coordenada está dentro del rango de otra
Gracias!
Actualización: como se prometió aquí está la pequeña función C# que usa el método Spherical Law of Cosines de cálculo de distancias. Espero que pueda ayudar a alguien más. Nota: Estoy escribiendo una aplicación para Windows Phone 7, así que utilicé la clase GeoLocation. Si usa C# "normal", puede cambiar la función para aceptar los dos pares de coordenadas que necesita la función.
internal const double EarthsRadiusInKilometers = 6371;
/// <summary>
/// The simple spherical law of cosines formula
/// gives well-conditioned results down to
/// distances as small as around 1 metre.
/// </summary>
/// <returns>Distance between points "as the crow flies" in kilometers</returns>
/// <see cref="http://www.movable-type.co.uk/scripts/latlong.html"/>
private static double SpericalLawOfCosines(GeoCoordinate from, GeoCoordinate to)
{
return (Math.Acos (
Math.Sin(from.Latitude) * Math.Sin(to.Latitude) +
Math.Cos(from.Latitude) * Math.Cos(to.Latitude) *
Math.Cos(to.Longitude - from.Longitude)
) * EarthsRadiusInKilometers)
.ToRadians();
}
/// <summary>
/// To a radian double
/// </summary>
public static double ToRadians(this double d)
{
return (Math.PI/180) * d;
}
Por curiosidad, ¿por qué no usaste la ley sperical más simple (y más rápida) de los cosenos presentada en la misma página donde vas a la fuente java de tu haversine? El autor señala que es recomendado y preciso para distancias> 1 m. – ctacke
Estaba volviendo a leer el artículo y tiene razón, la Ley Esférica de Coseno es más simple. De hecho, implementé ambos para ver cómo se hizo: publicaré ese código también. Gracias ... – will