Estoy calculando la distancia entre dos GeoCoordinates. Estoy probando mi aplicación contra otras 3-4 aplicaciones. Cuando calculo la distancia, tiendo a obtener un promedio de 3.3 millas para mi cálculo, mientras que otras aplicaciones obtienen 3.5 millas. Es una gran diferencia para el cálculo que estoy tratando de realizar. ¿Hay alguna buena biblioteca de clases para calcular la distancia? Lo estoy calculando así en C #:
public static double Calculate(double sLatitude,double sLongitude, double eLatitude,
double eLongitude)
{
var radiansOverDegrees = (Math.PI / 180.0);
var sLatitudeRadians = sLatitude * radiansOverDegrees;
var sLongitudeRadians = sLongitude * radiansOverDegrees;
var eLatitudeRadians = eLatitude * radiansOverDegrees;
var eLongitudeRadians = eLongitude * radiansOverDegrees;
var dLongitude = eLongitudeRadians - sLongitudeRadians;
var dLatitude = eLatitudeRadians - sLatitudeRadians;
var result1 = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
Math.Cos(sLatitudeRadians) * Math.Cos(eLatitudeRadians) *
Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);
// Using 3956 as the number of miles around the earth
var result2 = 3956.0 * 2.0 *
Math.Atan2(Math.Sqrt(result1), Math.Sqrt(1.0 - result1));
return result2;
}
¿Qué podría estar haciendo mal? ¿Debería calcularlo primero en km y luego convertirlo en millas?
c#
windows-phone-7
geocoding
latitude-longitude
Jason N. Gaylord
fuente
fuente
Respuestas:
La clase GeoCoordinate (.NET Framework 4 y superior) ya tiene
GetDistanceTo
método.La distancia es en metros.
Debe hacer referencia a System.Device.
fuente
GetDistance es la mejor solución , pero en muchos casos no podemos usar este método (por ejemplo, aplicación universal)
Pseudocódigo del algoritmo para calcular la distancia entre los coorindatos:
Real World C # Implementation , que utiliza métodos de extensión
Uso:
Implementación:
fuente
Y aquí, para aquellos que aún no están satisfechos, el código original de la
GeoCoordinate
clase .NET-Frameworks , refactorizado en un método independiente:fuente
double oneDegree = Math.PI / 180.0;
?Aquí está la versión de JavaScript chicos y chicas
fuente
Para aquellos que usan Xamarin y no tienen acceso a la clase GeoCoordinate, puede usar la clase de Ubicación de Android en su lugar:
fuente
Puedes usar esta función:
Fuente: https://www.geodatasource.com/developers/c-sharp
fuente
Existe esta biblioteca GeoCoordinate para estas plataformas:
La instalación se realiza a través de NuGet:
Uso
La distancia entre las dos coordenadas, en metros .
fuente
Basado en la función de Elliot Wood, y si alguien está interesado en una función C, esta está funcionando ...
Puedes cambiarlo al doble . Devuelve el valor en km.
fuente
Cálculo de la distancia entre los puntos de latitud y longitud ...
fuente
Esta es una vieja pregunta, sin embargo, las respuestas no me satisfacen con respecto al rendimiento y la optimización.
Aquí mi variante C # optimizada (distancia en km, sin variables y cálculos redundantes, muy cerca de la expresión matemática de Haversine Formular https://en.wikipedia.org/wiki/Haversine_formula ).
Inspirado por: https://rosettacode.org/wiki/Haversine_formula#C.23
fuente
Prueba esto:
fuente
Puedes usar
System.device.Location
:buena suerte
fuente
Cuando la potencia de cálculo de CPU / matemáticas es limitada:
Hay momentos (como en mi trabajo) en que la potencia de cálculo es escasa (por ejemplo, sin procesador de punto flotante, trabajando con microcontroladores pequeños) donde algunas funciones trigonométricas pueden tomar una cantidad exorbitante de tiempo de CPU (por ejemplo, más de 3000 ciclos de reloj), por lo que cuando solo necesito una aproximación, especialmente si la CPU no debe estar atada por mucho tiempo, la uso para minimizar la sobrecarga de la CPU:
El crédito va a https://github.com/kristianmandrup/geo_vectors/blob/master/Distance%20calc%20notes.txt .
fuente