De la géo et des maths

Bien qu’en cette période estivale du mois juillet, l’école soit désormais terminée et le bac plus qu’un lointain souvenir, un petit rappel sur la géolocalisation et certains concepts mathématiques sont peut-être les bienvenus si vous souhaitez réaliser des applications Open Data avec des données géo-localisées.

En effet, il est probable (surtout si vous êtes intéressé par un projet d’application mobile à destination de Smartphones) qu’à un moment donné vous voudriez réaliser des opérations telles que lister les données dans un périmètre autour d’un point de référence ou bien encore calculer la distance entre 2 points à partir de leurs latitudes et longitudes.

Ça tombe bien, c’est justement ces 2 points que nous allons traiter dans ce billet en essayant d’être le plus intéressant possible. Nous commençons par une introduction sur les concepts de latitude et de longitude avant de rentrer dans le « vif du sujet » et de voir comment on peut convertir ces latitudes et longitudes en distances; ce dont vous aurez besoin.

Latitude et longitude

Ça ne vous aura pas échappé, la Terre est ronde. On ne peut donc pas identifier un point par de simples coordonnées x et y comme dans un plan en deux dimensions. Il est donc nécessaire d’utiliser un système un peu plus complexe, c’est-à-dire un système géodésique qui permet, pour faire court, de définir un repère tridimensionnel défini par son centre O et ses 3 axes orthonormés Ox, Oy et Oz.

C’est ici qu’entrent en jeu la notions de cercles terrestres. On peut ainsi représenter 2 types de cercles à la surface de la Terre :

  1. Les grands cercles, ayant tous le même centre que la Terre. Ce sont en fait les intersections entre la Terre et tous les plans passant par son centre.
  2. Les petits cercles, qui correspondent à tous les autres cercles ne passant pas par son centre.

Essayez de visualiser ces différents cercles et passons maintenant aux définitions de la latitude et de la longitude. Vous pouvez voir sur l’image suivante plusieurs grands cercles représentés autour d’une sphère.

image

Source Wikipedia

Latitude

La latitude se mesure le long des méridiens qui sont tous des demi-grands cercles. Ils ont donc tous la même longueur. Par convention, il y a 360 méridiens séparés d’un degré d’arc. Sachant que la circonférence de la Terre est de 40 000 km, on peut en déduire la formule suivante : 360° = 40 000 km, donc 1° de latitude (arc de méridien) vaut 40 000/ 360 = 111,11 km.

image

Source Wikipedia

Longitude

La longitude se mesure pour sa part le long des parallèles. Mis à part l’équateur qui est un cas particulier, tous les parallèles sont des petits cercles. Et plus la latitude est élevée (proche de 90°), plus le cercle est petit (c’est-à-dire plus proche des pôles). Par conséquent, si sur l’équateur 1° de longitude vaut bien 111,11km, pour tous les autres parallèles, 1° de longitude sera plus petit que 111,11 km. Il faut donc appliquer la fonction cosinus à la latitude du parallèle en question pour calculer la longueur de 1° de longitude.

Ainsi, par exemple à 60° de latitude, cos 60° = 0,5. 1° de longitude à 60° de latitude vaut donc 111,11 * 2 = 55,555 km. De manière générale, 1° de longitude vaut 111,11km * cos (latitude) .

On peut aussi en déduire la valeur de la longueur du rayon à 60° de latitude sachant que le rayon terrestre moyen vaut 6370 km :

r = Rt * cos 60° => r = 6370 * 0,5 => r = 3185 km.

image

Les concepts de latitude et longitude étant introduits, passons aux choses sérieuses !

Retourner les données comprises autour d’un rayon spécifié

C’est un problème qui peut se poser surtout dans le cas des applications mobiles lorsque l’on souhaite apporter une réponse à un scénario du type « Nous avons la position de l’utilisateur donnée par son Smartphone, et nous souhaitons lui retourner la listes des places de parking situées dans un rayon de 200 mètres » par exemple.

La démarche consiste à partir d’un jeu de produits en croix et de conversion grâce aux formules données précédemment à retourner les longitudes et latitudes maximales et minimales pour définir un périmètre à la surface terrestre. Il suffira ensuite d’aller filtrer les données dont les longitudes et latitudes sont comprises entre ces bornes.

Voici tout de suite le code correspondant dans le langage C# :

public static CalculateAmplitudeResult CalculateAmplitude(double latitude, double longitude, int rayon)

{

   // 1° de latitude = 111,11 Km, on fait donc un produit en croix

  double offSetLat = rayon / 111110d;

 

   // 1° de longitude à 'latitude' degrés de latitude correspond à

   // OneLongitudeDegree mètres. On passe à la méthode Math.Cos

   // des radians

   double OneLongitudeDegree = 111110 * Math.Cos(latitude * Math.PI / 180);

 

   // Produit en croix pour trouver le nombre de degrés de longitude auquel

   // correspond la longueur de notre rayon

   double offSetLong = rayon / OneLongitudeDegree;

 

   return new CalculateAmplitudeResult

   {

      MaxLatitude = latitude + offSetLat,

      MinLatitude = latitude - offSetLat,

      MaxLongitude = longitude + offSetLong,

      MinLongitude = longitude - offSetLong

   };

}

Calculer la distance entre deux points donnés

C’est un autre problème très classique : nous avons un point A et un point B, nous désirons calculer la distance entre ces deux points.

Sans plus attendre, voici le code C# permettant de retourner la distance entre ces deux points (définis par leurs longitudes et latitudes).

public static double Distance(double lat1, double long1, double lat2, double long2)

{

    var latitude1 = lat1 * Math.PI / 180;

    var latitude2 = lat2 * Math.PI / 180;

 

    var longitude1 = long1 * Math.PI / 180;

    var longitude2 = long2 * Math.PI / 180;

 

    var R = 6371d;

 

    var d = R * Math.Acos(Math.Cos(latitude1) * Math.Cos(latitude2) *

            Math.Cos(longitude2 - longitude1) + Math.Sin(latitude1) *

                     Math.Sin(latitude2));

 

    return d;

}

En guise de conclusion

Nous venons de voir comment vous pouvez tirer au mieux parti des données géo-localisées grâce à des formules qui ne sont pas forcément faciles à trouver de prime abord mais qui se révèlent à l’usage très utiles. En espérant vous avoir fait gagner du temps dans vos développements. A ce propos, les codes C# proposés s’inspirent de l’article Calculate distance, bearing and more between Latitude/Longitude points.

Enfin, pour revoir d’autres formules de calcul, n’hésitez pas à faire un tour sur https://www.chimix.com.

Program.cs