2010-09-09 25 views
5

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

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

+0

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

Respuesta

4

Dado que está utilizando GeoCoordinate, ¿por qué implementarlo usted mismo cuando ya está presente en esa clase?

var distance = coordinateA.GetDistanceTo(coordinateB); 

(donde coordinateA y B son de tipo geocoordenadas)

Véase el MDSN documentation.

+0

No tenía idea de que estaba allí. Amo stackoverflow ... ¡Gracias! – will

+0

¡Whoa! ¡No sabía que esto estaba allí tampoco! –

2

Una búsqueda rápida crió this page con una fórmula para el cálculo de la distancia entre dos puntos de la tierra. Citado directamente desde la página enlazada:

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). 

sólo tiene que conectar los valores de latitud/longitud de su ubicación actual y otro lugar y que debería obtener d, que es la distancia en km entre esos dos puntos.

+1

Este método es sólido, solo asegúrese de comprender sus limitaciones. No es exacto de ninguna manera, y si se encuentra en una región montañosa, también entran en juego drásticos cambios de elevación. Sin embargo, para la mayoría de los propósitos, esto debería estar bien. – Brad

+0

Gracias chicos. Sin tener en cuenta la pregunta de elevación por un minuto, ¿cuáles son las limitaciones con respecto a la precisión? ¿Estás diciendo que el grano más fino al que quería ir es menos preciso? es decir, un rango de 50 millas es bastante preciso, pero un rango de 50 metros no es muy preciso. – will

+1

Es un cálculo de gran círculo. El cálculo en sí no tiene ningún error, su posición estimada sí lo tiene. Su receptor GPS sabe dónde se encuentra +/- cierta cantidad (dependiendo del receptor, el número de satélites, etc.). Digamos, por ejemplo, es +/- 25m. Bueno, si estás hablando a una distancia de 50 millas, entonces, en porcentaje, no está tan lejos. Si hablas a una distancia de 50 m, entonces es una cantidad muy grande. – ctacke

Cuestiones relacionadas