Rexact
Cheatsheet

Regex coordonnées GPS décimales

Des coordonnées GPS décimales, ce n'est pas juste « deux nombres séparés par une virgule » : la latitude doit rester entre -90 et 90, la longitude entre -180 et 180. La réponse à 140 votes sur Stack Overflow ignore complètement ces bornes — un commentaire signale qu'elle accepte « 91,181 ». La réponse à 288 votes, la plus votée du fil, corrige bien les bornes... mais un autre commentateur a dû publier un correctif quelques mois plus tard pour gérer un espace avant la virgule, que l'auteur original n'avait pas prévu. Voici un motif qui couvre aussi ce dernier cas, comparé aux trois réponses du même fil.

/^[-+]?([1-8]?[0-9](\.[0-9]+)?|90(\.0+)?)\s*,\s*[-+]?(180(\.0+)?|((1[0-7][0-9])|([1-9]?[0-9]))(\.[0-9]+)?)$/
passe 20/20 cas

Comparatif des patterns existants

Implémentation

const re = new RegExp("^[-+]?([1-8]?[0-9](\\.[0-9]+)?|90(\\.0+)?)\\s*,\\s*[-+]?(180(\\.0+)?|((1[0-7][0-9])|([1-9]?[0-9]))(\\.[0-9]+)?)$", "");
re.test(input);

Limites

  • Valide seulement la FORME et les bornes numériques (-90/90, -180/180) : n'a aucun moyen de vérifier qu'un point donné correspond à un lieu réellement accessible ou cohérent (le milieu d'un océan est une coordonnée parfaitement valide).
  • Ne gère qu'un seul séparateur littéral (la virgule) entre latitude et longitude : les formats DMS (degrés/minutes/secondes, « 48°51'24"N ») ou avec lettres cardinales (« 48.8566N, 2.3522E ») nécessitent un motif complètement différent.
  • N'impose aucune précision minimale ou maximale de décimales : « 45, 90 » (entiers) et « 45.123456789012, 90.987654321098 » (12 décimales, bien plus précis que ce que le GPS civil permet réellement) passent tous deux ce test.
  • Le séparateur virgule crée une ambiguïté avec la notation décimale à la française (« 45,123 » peut se lire comme une paire lat/lon 45 et 123, ou comme le nombre décimal unique 45,123) — ce motif tranche toujours en faveur de la paire, sans pouvoir deviner l'intention réelle de qui l'a saisi.