datagouv / decoupage-administratif

Données concernant le découpage administratif français, au format JSON
MIT License
55 stars 8 forks source link

Communes avec un mauvais code postal #25

Closed mquandalle closed 2 years ago

mquandalle commented 2 years ago

Bonjour,

J'utilise les données @etalab/decoupage-administratif/data/communes.json sur https://mesaidesvelo.fr et plusieurs utilisateurs m'ont averti que leur commune était renseignée avec le mauvais code postal. Il s'agit de cas ou le fichier fourni plusieurs codes postaux, et où je choisi arbitrairement le premier.

Le premier code postal de la liste semble être le bon dans certains cas, mais pas pour d'autres villes comme « Mauguio » (34280 au lieu de 34130). https://github.com/mquandalle/mesaidesvelo/issues/75. À quoi correspond cette liste de codes postaux dans le fichier etalab (données historiques ?) et y a t-il un ordre particulier ?

La base des codes postaux de La Poste fournit un unique code postal par code Insee, et dans les quelques cas que l'on m'a remonté la valeur du fichier La Poste correspondait à ce qui était attendu. Ça pourrait être pratique d'avoir l'information du code postal principal de La Poste directement dans ce paquet.

ThomasG77 commented 2 years ago

Nous n'utilisons pas les données https://www.data.gouv.fr/fr/datasets/base-officielle-des-codes-postaux/ mais celles-ci pour des raisons de licence https://www.data.gouv.fr/fr/datasets/codes-postaux/

Comme cité

Un code postal peut être associé à plusieurs communes (par exemple 54490 est partagé par 7 communes), et une commune peut avoir plusieurs codes postaux (par exemple Metz a 3 codes postaux différents).

Je suis donc étonné que pour un code INSEE dans les données La Poste, on ne puisse avoir qu'un code postal car même si c'est vrai pour la majorité des cas qu'un code INSEE n'a qu'un même code postal, un code INSEE peut avoir plusieurs codes postaux.

L'ordre des codes postaux selon le code https://github.com/BaseAdresseNationale/codes-postaux/blob/master/build/extract-fimoct.js#L69 qui alimente les données "codes postaux" de l'API, semble venir de l'ordre dans le fichier FIMOCT. Il n'y a pas à ma connaissance une hiérarchie permettant d'établir quel est le code postal principal d'une commune en partant de ce fichier même si d'après votre retour, c'est le cas du côté des données de La Poste

mquandalle commented 2 years ago

Merci beaucoup pour le retour rapide et ces explications détaillées.

Je suis allé un peu vite dans mon analyse du fichier de La Poste, certaines ville comme Metz sont présentes sur plusieurs lignes avec un code Insee identique mais des codes postaux distincts.

Je vais essayer de rassembler quelques exemples de différences entre les données du fichier La Poste et celle d'Etalab :

Ville CP La Poste CP Etalab CP recherche internet
Metz 57000, 57050, 57070 57000, 57050, 57070, 57140 idem La Poste
Maugio 34130 34280, 34130 idem La Poste
mquandalle commented 2 years ago

J'ai fait tourné un petit script avec le résultat suivant : https://gist.github.com/mquandalle/fce85527ddc3279712b5a6d864b67204#file-diff-md

Dans un certains nombres de cas le fichier La Poste ne contient qu'un seul code postal tandis qu'Etalab en indique deux ou plus.

ThomasG77 commented 2 years ago

Un code postal est associé à un nombre d'adresses. Certaines voies dans une commune sont associées à un autre code postal que le principal.

J'ai à priori une piste.

On obtient du fichier FIMOCT traité par https://github.com/BaseAdresseNationale/codes-postaux un fichier codes-postaux-full.json On l'épure ensuite selon les voies en utilisant https://unpkg.com/browse/codes-postaux@3.4.0/full.js et cela donne un fichier codes-postaux.json

Il semblerait que si je repars du fichier "full"

wget https://unpkg.com/codes-postaux@3.4.0/codes-postaux-full.json
codeInsee="07079"
jq -c '.[] | select(.codeVoie == "XXXX" and .codeCommune == "'$codeInsee'")' codes-postaux-full.json |grep $codeInsee

j'obtiens le code postal principal. Cela reste une première approche et reste à confirmer en essayant plus de cas depuis ton fichier généré. Comme on est dimanche, je vais essayer de regarder dans la semaine si cela semble la bonne piste puis voir les corrections à faire sur le package @etalab/decoupage-administratif si cela se confirme.

Il y aura possibilité d'utiliser la version de codes-postaux-full.json filtrée par .codeVoie == "XXXX" en attendant en utilisant le fichier généré depuis la commande

jq -c '.[] | select(.codeVoie == "XXXX")' codes-postaux-full.json | ndjson-reduce '(p[d.codeCommune] = p[d.codePostal] || []).push(d.codePostal), p' '{}' >| codes-postaux-main.json

PS: nécessite jq and ndjson-cli

mquandalle commented 2 years ago

En fait j'ai l'impression qu'il y a un problème avec la méthode que tu décris qui a pour conséquence d'inclure parfois un code postal d'une commune limitrophe. Quelques exemples issus de mon fichier diff.md où c'est particulièrement visible :

Code Insee Nom CP La Poste CP Etalab
13204 Marseille 4e Arrondissement 13004 13004, 13005
92012 Boulogne-Billancourt 92100 92100, 75016
92040 Issy-les-Moulineaux 92130 92130, 75015

Je pense que l'essentiel des différences entre les données Etalab et La Poste vient de ce problème.

ThomasG77 commented 2 years ago

Nous avons basculé pour utiliser les codes postaux de La Poste suite à un changement de licence. Merci de fermer cette issue et les issues associées si ces changements résolvent vos problèmes

mquandalle commented 2 years ago

Merci pour la correction !

(Pour info j'ai remarqué que api-adresse.data.gouv n'a pas encore été mis à jour https://api-adresse.data.gouv.fr/search/?q=78600&type=municipality)

mquandalle commented 2 years ago

À noter aussi que la liste des codes postaux inclut souvent le même code postal dupliqué, exemple :

curl https://unpkg.com/@etalab/decoupage-administratif@1.0.0/data/communes.json | grep Hornoy-le-Bourg

# "codesPostaux":["80640","80640","80640","80640","80640","80640","80640"]

(ça me fait un bug côté ré-utilisateur image )

ThomasG77 commented 2 years ago

Point évoqué dans dernier commentaire résolu. Le reste de la discussion se passe sur #29