Sto scrivendo un'app di Windows Phone 7 che deve essere localizzata. Nello specifico voglio che un codice (C#) venga eseguito quando il telefono arriva entro un raggio (fisso) di una particolare posizione, ad esempio 0,5 miglia. Ho tutti i dati lat/long per le locazioni fisiche in memoria. Utilizzerò lo Geo Coordinate Watcher class per ottenere le coordinate correnti dei dispositivi. Ora l'unico trucco è calcolare se l'utente si trova nel raggio d'azione di una qualsiasi delle posizioni.Calcola se una coordinata rientra nell'intervallo di un'altra
Grazie!
Aggiornamento: come promesso, ecco la piccola funzione C# che utilizza il metodo Spherical Law of Cosines per calcolare le distanze. Spero che possa aiutare qualcun altro. Nota: sto scrivendo un'app di Windows Phone 7, quindi ho utilizzato la classe GeoLocation. Se si utilizza "normale" C#, è possibile modificare la funzione per accettare le due coppie di coordinate necessarie per la funzione.
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;
}
Per curiosità, perché non hai usato la più semplice (e più veloce) legge spettrale dei cosini presentata nella stessa pagina in cui vai alla fonte java della tua haversine? L'autore sottolinea che è raccomandato e preciso per distanze> 1m. – ctacke
Stavo solo rileggendo l'articolo e hai ragione, la legge sferica dei coseni è più semplice. In effetti ho implementato entrambi per vedere come è stato fatto - pubblicherò anche quel codice. Grazie ... – will