Formats d’adresses en Europe : codes postaux, numéros et pièges par pays

Un formulaire d’adresse conçu pour un pays casse sans bruit dans le suivant. Le code postal n’a pas la même forme, le numéro se place de l’autre côté du nom de rue, et certains lieux n’ont pas de rue du tout. Ce guide liste ce qui change dans les pays de la feuille de route d’Addrova, pour concevoir un formulaire et un validateur qui ne rejettent pas de vraies adresses.

C’est un guide de terrain, pas une spécification. La référence faisant foi est la documentation d’adressage postal de l’Union postale universelle et celle de chaque opérateur postal national. [À VÉRIFIER : relire chaque règle contre la fiche UPU du pays avant publication.]

En un coup d’œil

Pays Code postal Place du numéro Piège
France 5 chiffres, 90000 Avant la rue : 4 place d'Armes CEDEX et BP, lieux-dits sans rue
Pays-Bas 4 chiffres et 2 lettres, 1012 AB Après la rue : Damrak 1 Compléments : une lettre ou un suffixe après le numéro
Espagne 5 chiffres, les deux premiers donnent la province Après la rue : Calle de Alcalá, 10 s/n (sans numéro), étage et porte : 3º B
Tchéquie 5 chiffres, écrits 110 00 Après la rue, souvent deux numéros : 837/1 Deux numéros par bâtiment ; villages sans rues
Autriche 4 chiffres, 1010 Après la rue Escalier et logement : Stiege 1, Top 5
Luxembourg 4 chiffres, souvent écrits L-1111 Varie selon la langue [À VÉRIFIER] Trois langues administratives pour les noms de rues
Pologne 5 chiffres avec un tiret, 00-001 Après la rue, logement après une barre : 10/12 Abréviations de type de voie : ul., al., pl.

Les formes de code postal vérifiables en code

Validez la forme, jamais l’existence : un code bien formé peut ne pas être attribué. Ce code s’exécute seul, sans l’API.

import re

POSTCODE = {
    "FR": r"\d{5}",
    "NL": r"\d{4} ?[A-Za-z]{2}",
    "ES": r"\d{5}",
    "CZ": r"\d{3} ?\d{2}",
    "AT": r"\d{4}",
    "LU": r"(L-)?\d{4}",
    "PL": r"\d{2}-\d{3}",
}

def looks_like_postcode(country: str, value: str) -> bool:
    return re.fullmatch(POSTCODE[country], value.strip()) is not None

assert looks_like_postcode("NL", "1012 AB")
assert looks_like_postcode("PL", "00-001")
assert looks_like_postcode("LU", "L-1111")
assert not looks_like_postcode("PL", "00001")
print("formes de code postal OK")

Les règles de conception qui en découlent

  1. Un champ libre d’abord. Laissez saisir l’adresse comme on l’écrit, puis structurez après. Ce sont les champs rue/numéro/ville rigides qui rejettent 837/1 ou 10/12.
  2. Ne forcez jamais une rue. Certains lieux-dits français et villages tchèques s’adressent par lieu et numéro seuls.
  3. Gardez le pays avec l’adresse. Les mêmes quatre chiffres sont un code postal valide dans plusieurs pays.
  4. Gardez ce que vous ne savez pas analyser. Un logement, un escalier ou un complément relève de la livraison, pas du géocodeur ; stockez-le, ne le jetez pas.
  5. Ne passez pas en majuscules et ne retirez pas les accents avant de géocoder. Les registres les conservent.

Géocoder les cas difficiles

Envoyez la chaîne entière et le code pays ; le service la structure. Pour une adresse française avec une ligne CEDEX, le résultat revient en précision locality avec components.cedex renseigné : voir les niveaux de précision.

curl -s https://api.addrova.eu/v1/geocode \
  -H "X-API-Key: $ADDROVA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q": "4 place d'\''Armes 90000 Belfort", "country": "FR", "limit": 1}'

Les pays qui renvoient des résultats aujourd’hui sont listés sur la page couverture. Un pays de la feuille de route a sa page ici, avec sa source et sa licence, mais aucun chiffre de couverture avant d’avoir été mesuré. [À VÉRIFIER : service ouvert ; pays réellement servis au lancement.]