# Open Location Code

L'Open Location Code est un système de géocodage permettant d'identifier une zone n'importe où sur Terre à l'aide d'un code alphanumérique de la forme :
AA BB CC DD + EE F G H ...
Chaque doublet du début fonctionne comme une grille de bataille navale et désigne une zone particulière de coordonnées géographiques. Chaque ajout d'un doublet améliore la précision en dessinant une nouvelle grille 20 fois plus petite à l'intérieur de la case précédente. Si une précision plus grande est désirée, on peut alors ajouter des caractères un à un, des simplets, selon un autre découpage.
La grille la plus large désigne des blocs de 20 ° de côté en deux caractères. Tandis qu'un code de 10 caractères seulement désigne une zone d'environ 13 mètres de côté (permettant de localiser une maison). L'ajout de simplets éventuels permet de désigner un objet précis, par exemple une porte d'accès.

## Aperçu

La grille la plus large couvre le monde entier (un seul doublet). En contrepartie, sa précision est faible : les mailles de la grille couvrent des zones de 20° de large (soit près de 2 000 km).
L'origine de la grille se trouve au sud-ouest (le premier carré, noté "22") et s'étend jusqu'à l’extrême nord-est (dernier carré, noté "CV"), soit du coin en bas à gauche vers la droite et le haut). Ainsi, l'origine des coordonnées géographiques (longitude 0°; latitude 0°) correspond au milieu des zones 6C et 6F.
NB : l'étendue affichée par Google Maps est plus restreinte, et ne dépasse pas la latitude 85° nord ou sud.

## Origine

Ce codage OLC a été développé au bureau d'ingénierie de Google à Zurich, et a été publié fin octobre 2014. Il est donc connu en détails. Les codes qu'il génère sont appelés "Codes Plus" par Google.
Le code d'emplacement ouvert (ou OLC) est un moyen plus facile à utiliser que des coordonnées numériques habituelles, dites GPS, sous forme de latitude et de longitude. Les Codes Plus sont conçus pour remplacer des adresses et sont particulièrement utiles dans les endroits où il n'y a pas de système formel d'identification des bâtiments ou des rues (il n'y a pas partout un numéro de maison et un code postal). Soulignons toutefois qu'un "Code Plus" désigne une zone (une case dans une grille) contrairement au GPS (qui désigne un point).
Les codes "Code Plus" sont dérivés, via un algorithme, des coordonnées GPS, ils existent donc déjà partout. Ils sont de longueur similaire à un numéro de téléphone (par exemple 849VCWC8+R9 pour le campus de Google). Les emplacements proches les uns des autres ont des codes similaires. Ils peuvent être encodés ou décodés facilement sans base de données et sans internet.
Le jeu de caractères évite les risques d'erreur en éliminant les caractères semblables, pour réduire toute confusion. On supprime aussi les voyelles pour rendre improbable qu'un code épelle des mots existants. Les codes Plus sont insensibles à la casse (majuscules/minuscules) et peuvent donc être facilement échangés par téléphone.
Depuis août 2015, Google Maps prend en charge les codes plus dans son moteur de recherche.
L'algorithme de codage/décodage est sous licence Apache License 2.0 et disponible sur GitHub.
Google déclare que les Codes Plus sont acceptés comme adresses postales au Cap-Vert, dans certaines parties de Calcutta et par la nation Navajo.

## Spécifications

Le système Open Location Code est basé sur des coordonnées WGS 84. Chaque code décrit une zone délimitée par deux parallèles et deux méridiens dans une grille fixe, identifiée par la position de son coin sud-ouest et sa taille. La plus grande grille a des carrés de 20 degrés par 20 degrés (9 lignes et 18 colonnes pour couvrir les 180° et 360° du globe).
On peut diviser jusqu'à quatre fois de suite un des carrés en une nouvelle grille plus petite de 20×20 sous-blocs. Puis à partir de ce niveau, la division se fait autrement, par une nouvelle grille de 5 lignes et 4 colonnes mais autant de fois que nécessaire, sans limite absolue.
La taille réelle de chaque carré dépend de l'endroit où il se situe sur le globe (puisqu'on découpe des angles et non des distances la largeur d'un bloc diminue en s'éloignant de l'équateur). Le tableau suivant montre la taille maximale (donc près de l'équateur) de chaque niveau de précision. Ce tableau permet aussi en sens inverse de convertir un code Plus vers des coordonnées GPS.
| Nombre de doublets | 1 | 2 | 3 | 4 | + | 5 | +1car |
| nombre de caractères | 2 | 4 | 6 | 8 | + | 10 | 11 |
| Dimension du bloc | 20 ° | 1 ° | 0,05 ° (3′) | 0,0025 ° (9″) | | 0,000125 ° (0,45″) | |
| Approximativement | 2200 km | 110 km | 5,5 km | 275 m | | 14 m | 3,5 m |
La grille OLC a pour origine le pôle Sud (–90°) et l'antiméridien (–180°). L'alphabet utilise 20 caractères ce qui revient à utiliser une numération mathématique en base 20. Pour éviter de mal orthographier une adresse voici l'alphabet retenu, excluant les voyelles et les symboles proches :
| Valeur décimale | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| Code en base20 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | C | F | G | H | J | M | P | Q | R | V | W | X |
Un code OLC commence donc par des paires de caractères, jusqu'à 5 paires maximum. Chacune composée d'un premier caractère représentant la latitude et d'un second représentant la longitude. Juste après le 8e caractère, un signe plus "+" est inséré dans le code comme délimiteur pour faciliter l'analyse visuelle.
Il est optionnel d'ajouter d'autres caractères après ce "+", on ne le fait que pour gagner en précision. Mais à droite du symbole "+" il n'y a qu'un seul dernier doublet. Au delà de ces 11 caractères (en comptant le symbole "+"), chaque nouvelle subdivision se fait par ajout d'un simplet, donc d'un caractère unique, définissant une position dans la nouvelle grille 5×4 comme suit :
| | longitude → | longitude → | longitude → | longitude → |
| latitude | R | V | W | X |
| latitude | J | M | P | Q |
| latitude | C | F | G | H |
| latitude | 6 | 7 | 8 | 9 |
| latitude | 2 | 3 | 4 | 5 |

## Cas particulier : le Plus Code

Google désigne par "Plus Codes" sa version d'OLC utilisée dans Google Maps. Ce dernier accepte des codes tronqués, plus courts, et d'une précision plus faible. Si on désire ne définir qu'une zone large sur le globe, c'est-à-dire en utilisant moins de huit caractères, on doit compléter par des zéros jusqu'au symbole plus "+" (et ne rien mettre ensuite). Ce qui permet dans tous les cas de comprendre que l'on a bien un code Plus. Pour garder le même exemple sur le campus de Google, au lieu de "849VCWC8+R9" (qui désigne une zone précise, un amphithéâtre) on peut indiquer 84000000+ (une zone très large, toute la côte ouest américaine et une bonne partie de l'océan). Ou disons juste une région : 849V0000+ ... allant de San Francisco à San José.
Google propose également de raccourcir le code mais en précisant alors une ville proche, pour une meilleure compréhension humaine. Sur notre exemple "CWC8+R9 Mountain View" au lieu de "849VCWC8+R9" en retirant donc ici les quatre premiers caractères. Indiquer la ville semble contre-productif par rapport à l'objectif de concision ; il y a alors clairement un usage postal, pour remplacer les adresses là où il n'y en a pas. Comme désigner un igloo sur une banquise ou une case africaine dans un village. Le village porte déjà un nom (qui doit être connu de Google !), le code permet de préciser un bâtiment précis.
Mieux vaut éviter ce genre de raccourci à l'international. Par exemple il existe plusieurs villes nommées Paris aux États-Unis. Le code "V75V+9Q Paris" entré dans Google Maps propose cinq options : une en France et quatre aux États-Unis. Le code complet 8FW4V75V+9Q est donc indispensable quand on veut éviter toute ambiguïté.

## Exemple

Le tableau ci-dessous détaille les étapes du calcul permettant de passer de coordonnées géographiques (latitude et longitude) au code open location, d'une maille à la suivante.
Exemple : Latitude 48,85892 N, Longitude 2,29411 E (un banc au bas de la tour Eiffel)
| N° de paire | N° de car. | taille maille N-1 | limite sud ou ouest | limite nord ou est | Lat. ou Lon. (zéro décalé) | Taille maille N | mailles à parcourir (division) | Partie entière | caractère associé | Reste | code Code Plus |
| 1 | 1 | Monde | -90 ° | +90 ° | 138,85892 ° | 20 ° | 6,942946 | 6 | 8 | 0,942946 | 8F000000+ |
| 1 | 2 | Monde | -180 ° | +180 ° | 182,29411 ° | 20 ° | 9,114706 | 9 | F | 0,114705 | 8F000000+ |
| 2 | 3 | 20 ° | 30 ° | 50 ° | 0,942946 × 20° = 18,85892 ° | 1 ° | 18,85892 | 18 | W | 0,858920 | 8FW40000+ |
| 2 | 4 | 20 ° | 0 ° | 20 ° | 0,114705 × 20° = 2,29411 ° | 1 ° | 2,29411 | 2 | 4 | 0,294110 | 8FW40000+ |
| 3 | 5 | 1 ° | 48 ° | 49 ° | 0,85892 ° | 1/20e ° | 17,1784 | 17 | V | 0,178400 | 8FW4V700+ |
| 3 | 6 | 1 ° | 2 ° | 3 ° | 0,29411 ° | 1/20e ° | 5,8822 | 5 | 7 | 0,882200 | 8FW4V700+ |
| 4 | 7 | 1/20e ° | 48,85 ° | 48,90 ° | 0,00892 ° | 1/400e ° | 3,568 | 3 | 5 | 0,568000 | 8FW4V75V+ |
| 4 | 8 | 1/20e ° | 2,25 ° | 2,30 ° | 0,04411 ° | 1/400e ° | 17,644 | 17 | V | 0,644000 | 8FW4V75V+ |
| 5 | 9 | 1/400e ° | 48,8575 ° | 48,8600 ° | 0,00142 ° | 1/8000e ° | 11,36 | 11 | H | 0,360000 | 8FW4V75V+HJ |
| 5 | 10 | 1/400e ° | 2,2925 ° | 2,2950 ° | 0,00161 ° | 1/8000e ° | 12,88 | 12 | J | 0,880000 | 8FW4V75V+HJ |
| fin des doublets, viennent les simplets... |||||||||||||
| | 11 | 1/8000e ° qu'on va diviser par 5 | 48,858875 ° | 48,859 ° | 0,000045 ° | 1/40000e ° | 1,80 | 1 | 9 | 0,8 | 8FW4V75V+HJ9 |
| | 11 | 1/8000e ° qu'on va diviser par 4 | 2,294000 ° | 2,294125 ° | 0,000110 ° | 1/32000e ° | 3,52 | 3 | 9 | 0,52 | 8FW4V75V+HJ9 |
À ce niveau de résolution (11 caractères pour 2,8 × 3,5 m), il est donc possible de distinguer un simple banc.

### Autre méthode

Plutôt que de procéder étape par étape, comme on le ferait à la main, il est bien sûr plus rapide de calculer directement les éléments du code par un algorithme. De plus chaque découpe se fait en 20 éléments, qui correspond à une conversion en base 20, ce qu'on sait faire par un calcul direct.
Pour le même exemple que ci-dessus :
| Latitude | 48,85892 | N | Longitude | 2,29411 | E |
On exprime ces valeurs par rapport à l'origine Sud (-90) et Ouest (-180) :
| Latitude | 138,85892 | Longitude | 182,29411 |
et on les convertit en 1/8000e de degré (la précision du 5e doublet de caractères) :
| Latitude | 1110871,36 | Longitude | 1458352,88 |
Reste à convertir ces valeurs en base 20, en respectant l'alphabet du protocole (23456789CFGHJMPQRVWX)
| Latitude | 8WV5H | Longitude | F47VJ |
Le code final s'obtient en intercalant les parties entières des codes de latitude et longitude, soit :
8F W4 V7 5V HJ
noté "8FW4V75V+HJ" dans la forme adoptée par Google. (Reste à augmenter la précision par l'ajout de simplets si nécessaire, pas à pas cette fois)