Conversion sexagésimale / décimale

Il n'est pas rare de voir sur un site l'affichage d'un endroit précis d'une carte grâce à des coordonnées géographiques. Les informations de localisation sont ajoutées à l'url ciblant l'outil et le lieu s'affiche

Voici un petit bout de code qui permettra de convertir les coordonnées dans le bon système numérique.


Les coordonnées GPS sont fournies soit en système sexagésimal (01°46'28.0"E 49°16'51.3"N) soit en décimal (1.7744445 49.2809167). Le but de cette fonction php sera de convertir les coordonnées, quelques soient leur mode numérique.

Conversion manuelle

Le système sexagésimal et une base 60, ainsi, elle fonctionne comme pour l'heure. On garde les degrés, on divise par 60 les minutes et par 3600 et seconde. Pour le mode décimal (base 10), on fait l'inverse. Les informations de cardinalité représentent le négatif pour l'ouest et le sud et le positif pour l'est et le nord.

Exemple avec la longitude 01°46'28.0"E :

  • 01° = 1
  • 46' = 46 / 60 = 0.7666667
  • 28.0" = 28 / 3600 = 0.0077778
  • E = +

On additionne le tout : 1 + 0.7666667 + 0.0077778 = 1.7744445 (longitude en décimal).

Exemple avec la latitude 49.2809167 :

  • 49 = 49°
  • 0.2809167 * 60 = 16.855002 = 16'
  • 0.00855002 * 60 = 51.30012 = 51.3"
  • + = N

On assemble le tout : 49°16'51.3"N (latitude en sexagésimal )

Conversion avec php

Voici donc la fonction qui permettra de tout faire quelque soit les valeurs indiquées. Il y a en fait 3 fonctions.

  1. <?php
  2. function convertDec($var) { // Sexagésimal vers décimal
  3.  
  4. $var = preg_replace('#([^.a-z0-9]+)#i', '-', $var);
  5. $tab = explode('-', $var);
  6. $varD = $tab[0] + ($tab[1] / 60) + ($tab[2] / 3600);
  7. $pattern = array('n', 's', 'e', 'o', 'N', 'S', 'E', 'O');
  8. $replace = array('', '-', '', '-', '', '-', '', '-');
  9. return str_replace($pattern, $replace, $tab[3]) . $varD;
  10. }
  11.  
  12. function convertSexa($var, $pos) { // Décimal vers sexagésimal
  13.  
  14. if ($pos == 'lat')
  15. {
  16. if ($var > 0)$card = 'N';
  17. else $card = 'S';
  18. }
  19. if ($pos == 'long')
  20. {
  21. if ($var > 0)$card = 'E';
  22. else $card = 'O';
  23. }
  24.  
  25. $var = abs($var);
  26. $deg = intval($var);
  27. $min = ($var - $deg)*60;
  28. $sec = ($min - intval($min))*60;
  29. return str_pad($deg, 2, '0', STR_PAD_LEFT).'°'.intval($min)."'".number_format($sec, 2).'"'.$card;
  30. }
  31.  
  32. function convertGPS($lat, $long) { // Fonction d'appel
  33. if (preg_match('#([nseo]+)#i', $lat)) // Vérification du type fourni
  34. {
  35. echo 'Latitude : '.$lat.' => '.convertDec($lat).'<br />Longitude : '.$long.' => '.convertDec($long);
  36. }
  37. else
  38. {
  39. echo 'Latitude : '.$lat.' => '.convertSexa($lat, "lat").'<br />Longitude : '.$long.' => '.convertSexa($long, "long");
  40. }
  41.  
  42. }
  43.  
  44. /* L'appel de la fonction doit être du type :
  45.  
  46. convertGPS('49°16'51.3"N', '01°46'28.0"E');
  47. ou
  48. convertGPS('49.2809167', '1.7744445');
  49.  
  50. Elle retournera :
  51.  
  52. Latitude : 49°16'51.3"N => 49.280916666667
  53. Longitude : 01°46'28.0"E => 1.7744444444444
  54.  
  55. Latitude : 49.2809167 => 49°16'51.30"N
  56. Longitude : 1.7744445 => 01°46'28.00"E
  57. */
  58. ?>

Vos avis

N'oubliez pas de noter l'article. ;-)

Message
Expéditeur et validation
Excellent script. Marche impec chez moi.
Merci.

Par contre, pour les newb, une petite explication du script aurait été sympa.
En effet, je mettrais une explication des principales difficultés dés que j'ai un moment.
Je n 'arrive pas à l' adapter au système vicésimal , pourrais tu m' aider
Je ne vois pas trop l'intérêt d'une conversion en base 20 pour faire de la géo localisation, mais tu peux utiliser une fonction php qui fait cela parfaitement :
base_convert ( string $number , int $frombase , int $tobase )
http://php.net/manual/fr/function.base-convert.php
Merci beaucoup cependant je rencontre un probléme, mon recepteur gps me renvoit les secondes sur 4 chiffres :s . Auriez vous une idée ?
Merci :>)
Bibi,
Qu'entends tu par 4 chiffres pour les secondes ?

Parce que par exemple, tu peux avoir 49°16'51.30"N et on a bien 4 chiffres pour les secondes : 51.30.
SVP pourquoi est ce que j'obtiens un résultat éroné ?
Latitude : '49°16'51.3"N' => 51.30.82111111111111
Longitude : '01°46'28.00"S' => 28.000.029444444444444

Voici pourtant le code que j'ai tapé:
$latitude="49°16'51.3"N";
$latitude="'".$latitude."'";
$longitude="01°46'28.00"S";
$longitude="'".$longitude."'";
convertGPS($latitude,$longitude);
Salut, bisugenik

Supprime ces lignes qui ne servent à rien :
$latitude="'".$latitude."'";
et
$longitude="'".$longitude."'";

Et bien penser à ajouter un caractère d'échappement soit aux guillemets soit aux apostrophes en fonction des sélecteurs choisis.