2010-09-09 12 views
5

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; 
    } 
+0

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

+0

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

risposta

4

Poiché si utilizza GeoCoordinate, perché implementarlo autonomamente quando è già presente in quella classe?

var distance = coordinateA.GetDistanceTo(coordinateB); 

(dove coordinateA e B sono di tipo GeoCoordinate)

Vedere le MDSN documentation.

+0

Non avevo idea che fosse lì. Adoro lo stackoverflow ... Grazie! – will

+0

Whoa! non sapevo nemmeno che fosse lì dentro! –

2

Una rapida ricerca portato this page con una formula per calcolare la distanza tra due punti sulla terra. Citato direttamente dalla pagina collegata:

Haversine formula: 

R = earth’s radius (mean radius = 6,371km) 
Δlat = lat2− lat1 
Δlong = long2− long1 
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2) 
c = 2.atan2(√a, √(1−a)) 
d = R.c 

(Note that angles need to be in radians to pass to trig functions). 

Basta collegare i valori di lat/long per la posizione corrente e un'altra posizione e si dovrebbe ottenere d, che è la distanza in km tra questi due punti.

+1

Questo metodo è solido, assicurati solo di capirne i limiti. Non è esatto in alcun modo, e se vi trovate in una regione montuosa, entrano in gioco drastici cambiamenti di elevazione. Per la maggior parte degli scopi, però, dovrebbe andare bene. – Brad

+0

Grazie ragazzi. Trascurando la domanda di elevazione per un minuto, quali sono le limitazioni relative all'accuratezza? Stai dicendo che il grano più sottile che volevo fosse meno accurato lo fosse? cioè un raggio di 50 miglia è abbastanza preciso ma un raggio di 50 metri non è molto preciso? – will

+1

È un grande calcolo del cerchio. Il calcolo in sé non ha errori, la tua posizione stimata lo fa. Il tuo ricevitore GPS sa dove sei +/- una certa quantità (a seconda del ricevitore, del numero di satelliti, ecc.). Diciamo, per esempio, è +/- 25m. Bene, se stai parlando di una distanza di 50 miglia, allora in termini percentuali non è poi così lontano. Se stai parlando di una distanza di 50 metri, allora è una quantità molto grande. – ctacke

Problemi correlati