Je calcule la distance entre deux GeoCoordinates. Je teste mon application avec 3-4 autres applications. Lorsque je calcule la distance, j'ai tendance à obtenir une moyenne de 3,3 miles pour mon calcul, tandis que d'autres applications obtiennent 3,5 miles. C'est une grande différence pour le calcul que j'essaie d'effectuer. Existe-t-il de bonnes bibliothèques de classes pour calculer la distance? Je le calcule comme ça 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;
}
Que pourrais-je faire de mal? Dois-je d'abord le calculer en km, puis le convertir en miles?
c#
windows-phone-7
geocoding
latitude-longitude
Jason N. Gaylord
la source
la source
Réponses:
La classe GeoCoordinate (.NET Framework 4 et supérieur) a déjà une
GetDistanceTo
méthode.La distance est en mètres.
Vous devez référencer System.Device.
la source
GetDistance est la meilleure solution , mais dans de nombreux cas, nous ne pouvons pas utiliser cette méthode (par exemple, application universelle)
Pseudocode de l'algorithme pour calculer la distance entre les coorindates:
Implémentation Real World C # , qui utilise des méthodes d'extension
Usage:
La mise en oeuvre:
la source
Et voici, pour ceux qui ne sont toujours pas satisfaits, le code original de la
GeoCoordinate
classe .NET-Frameworks , refactorisé en une méthode autonome:la source
double oneDegree = Math.PI / 180.0;
?Voici la version JavaScript les gars et les filles
la source
Pour ceux qui utilisent Xamarin et n'ont pas accès à la classe GeoCoordinate, vous pouvez utiliser la classe Android Location à la place:
la source
Vous pouvez utiliser cette fonction:
Source: https://www.geodatasource.com/developers/c-sharp
la source
Il existe cette bibliothèque GeoCoordinate pour ces plates-formes:
L'installation se fait via NuGet:
Usage
La distance entre les deux coordonnées, en mètres .
la source
Basé sur la fonction d'Elliot Wood, et si quelqu'un est intéressé par une fonction C, celle-ci fonctionne ...
Vous pouvez le changer pour doubler . Il renvoie la valeur en km.
la source
Calcul de la distance entre les points de latitude et de longitude ...
la source
C'est une vieille question, néanmoins les réponses ne m'ont pas satisfait en termes de performances et d'optimisation.
Voici ma variante C # optimisée (distance en km, sans variables et calculs redondants, très proche de l'expression mathématique de Haversine Formular https://en.wikipedia.org/wiki/Haversine_formula ).
Inspiré par: https://rosettacode.org/wiki/Haversine_formula#C.23
la source
Essaye ça:
la source
Vous pouvez utiliser
System.device.Location
:bonne chance
la source
Lorsque la puissance de calcul CPU / math est limitée:
Il y a des moments (comme dans mon travail) où la puissance de calcul est rare (par exemple pas de processeur à virgule flottante, travaillant avec de petits microcontrôleurs) où certaines fonctions trigonométriques peuvent prendre une quantité exorbitante de temps CPU (par exemple plus de 3000 cycles d'horloge), donc quand je seulement besoin d'une approximation, surtout si si le CPU ne doit pas être lié pendant une longue période, je l'utilise pour minimiser la surcharge du CPU:
Le crédit va à https://github.com/kristianmandrup/geo_vectors/blob/master/Distance%20calc%20notes.txt .
la source