[Addok] Utilisation d'Addok sur le projet NexSIS

Bonjour à tous !

Je pense qu’il ne serait pas inintéressant qu’on partage sur nos usages, nos contournements, nos configurations, nos petits ajustements, nos besoins, etc.

Je commence donc avec NexSIS, en prenant une approche plus fonctionnelle que technique…
Et je vais essayer de respecter au mieux la position de notre client (l’ANSC).

1. Données intégrées

Les adresses de la BAN

Nous intégrons bien évidemment les données de la BAN, à partir des fichiers JSON générés par Etalab. En effet, le tout premier objectif de NexSIS était d’avoir le même service que celui offert par api.adresse.data.gouv.fr, mais sans dépendre d’une connexion Internet.

À la cible, il est possible que l’on cherche à ne pas tout récupérer de la BAN. Par exemple, on pourrait se contenter des housenumbers et remplacer les locality/municipality par des données de l’IGN (voir plus bas).

Ce qu’on appelle des “Localisants”

Tous ces “localisants” sont typés. Le champ “type” exposé par Addok présente donc d’autres valeurs que les habituelles “street”, “housenumber”, etc. On y retrouve des valeurs comme “acces”, “activite”, “onf”, “pk”, etc.

Localisants métiers issus des SDIS

Dans Addok, nous intégrons également des données provenant des SDIS :

  • Activités (ERP, ICPE, commerces, etc.)
  • Points d’interet (POI)
  • Adresses complémentaires (des adresses absentes de la BAN)
  • Accès (PRM, etc.)
  • etc.

Localisants issus de référentiels externes

Et nous intégrons aussi des données provenant de fournisseurs (comme la BD TOPO de l’IGN, par exemple) :

  • Hydrographie (ponctuels et linéaires)
  • Point d’activité ou d’interet (PAI)
  • Point de Rencontre des Secours en Fôret (PRSF)
  • Parcelles forestières (ONF)
  • Points kilométriques (ne fonctionne pas vraiment pour le moment)
  • Communes (pour remplacer les communes ponctuelles de la BAN ?)
  • Routes nommées & numérotées (pour remplacer les routes ponctuelles de la BAN ?)
  • etc.

Nous réfléchissons aussi à l’intégration de POI venant d’OSM, afin de compléter les données des SDIS et les données de l’IGN…

2. Champs supplémentaires

Nous avons ajouté un champ “localisation” (qui est indexé), afin de pouvoir différencier le “nom” d’un localisant et son “adresse”. Cela concerne surtout les localisants (voir 1.2). Exemple : un localisant peut avoir un nom (Gazechim) et une localisation (13 rue Denis Papin). Les adresses BAN, elles, n’ont donc qu’une localisation (pas de nom).

Nous avons ajouté un champ “wkt” pour pouvoir afficher autre chose que des points sur une carte. Ainsi, pour chaque document présents dans Addok, nous avons un lon/lat (centroïde) et un WKT (géométrie). Cela concerne surtout les localisants (voir 1.2).

Nous avons modifié le formatter afin qu’il retourne un tableau de tous les noms présents dans les documents (et pas juste le premier nom).

3. Services recréés

Effectuer une recherche “géographique”

Nous avons abandonné la fonction de géocodage inverse d’Addok et avons décidé de recréer (au sein de notre API) un service GET de recherche géographique via les fonctions de PostGIS.

Ce service propose les mêmes filtres que ceux proposés par Addok et nous permet de :

  • trouver des résultats proches de coordonnées géographiques
  • trouver des résultats intersectant un polygone

Cela nous oblige par contre à bien synchroniser le contenu d’Addok et le contenu de notre BDD (voir paragraphe 5 sur ArchiBAN).

Lister les numéros d’une rue donnée

Nous avons crée (au sein de notre API) un service GET qui nous permet, pour un id de voie (street), de lister tous les numéros de cette voie (et leurs attributs).

Du coup, lorsqu’un utilisateur sélectionne un résultat de type “street”, une liste déroulante lui propose de faire un choix parmi tous les numéros de cette rue (avec auto-complétion et possibilité de saisir un numéro qui n’existe pas).

4. Infrastructures

Pour plus de résilience, nous avons mis en place des clusters Redis avec 2~3 Redis et un HA Proxy. Cela étant, j’ai l’impression que nous sommes en train de revenir sur cette décision (overkill ?).

Par contre, nous nous posons des questions sur le fait d’avoir 2 instances d’Addok différentes :

  • une pour les données froides (BAN, IGN, etc.)
  • une pour les données chaudes (localisants, etc.)

Notre API, qui sert un peu de proxy, pourrait jouer le rôle de Y (comme le ferait Metaddok ?).

5. ArchiBAN

ArchiBAN est un outil développé en Python par Camptocamp pour NexSIS. Nous sommes sur le point d’ouvrir son code source, avec l’accord de notre client (ANSC). Il visait à répondre aux 3 problématiques suivantes.

Téléchargement de la BAN et import dans PgSQL

ArchiBAN vise à automatiser :

  • le téléchargement des données de la BAN (HTTP)
  • le fait de décompresser ces données (GZ)
  • le fait de nettoyer ces données (présence d’ids en doublon !)
  • de les importer dans une base PgSQL (deux tables + une vue matérialisée)

Indexation unitaire d’un document

ArchiBAN offre un endpoint PUT permettant d’indexer un document dans Addok, à chaud. Nous faisons des appels à cet endpoint PUT lorsqu’un nouveau document doit être disponible immédiatement dans les applications NexSIS.

Au sein de notre API, le service qui permet de créer/modifier un localisant (POST & PUT = INSERT INTO & UPDATE) va se charger de faire un appel à ce service PUT, afin que ce localisant soit disponible en recherche textuelle (Addok) et en recherche géographique (PostGIS) immédiatement et en même temps.

Synchronisation entre PgSQL et Addok

ArchiBAN vise à automatiser :

  • la comparaison entre les données PgSQL et les donneés présentes dans Addok
  • l’identification des données à créer/modifier/supprimer dans Addok (différentiel)
  • l’indexation/désindexation de ces données identifiées (afin d’avoir un Addok synchronisé avec nos tables PgSQL)

On part du principe, en effet, que notre BDD PgSQL a raison (master) et qu’Addok doit suivre (sorte de replica ?). L’étape suivante, ce serait de lier fortement notre BDD à Addok (comme le fait le plugin pgstore).

6. Besoins

Enrichir les filtres sur les résultats

Notre urgence est de pouvoir mieux filtrer les résultats remontés par Addok.

Filtrer sur plusieurs valeurs pour un champ donné :

  • … WHERE citycode IN (77288, 77487)
  • … WHERE type IN (“housenumber”, “acces”)
  • … WHERE type IN (“housenumber”, “acces”) AND citycode IN (77288, 77487)

Filtre en excluant des valeurs

  • … WHERE citycode NOT IN (77288)

Retrouver lequel des noms a matché

Quand plusieurs noms sont indiqués dans un document (array), Addok retourne le premier nom (array[0]). On a fait en sorte de remonter tous les noms (voir paragraphe 2) mais on aimerait aussi pouvoir connaître lequel de ces noms a matché et a donc fait en sorte que le document soit pertinent pour la requête réalisée.

2 « J'aime »

Merci Adrien !

C’est vraiment très intéressant que chacun fasse le point sur son usage et ses ajouts/contournements.

J’ai ajouté 2 autres types de localisations sur mon instance de démo:

Le géocodage inverse d’addok est un petit bonus qu’avait apporté l’index redis basé sur le geohash ajouté pour permettre la préférence géographique.

Un postgis est bien plus simple et efficace, je suis entièrement d’accord.

Il me semble que ce serait assez simple à ajouter directement dans addok.

C’est très intéressant pour votre besoin et l’architecture centrée sur postgresql que vous avez.

L’approche par trigger dans PG pour générer les diff n’a pas été envisagée ?

J’ai implémenté cela dans ma branche avec peu de modif de code.
Pour ne pas impacter les perfs, j’ai ajouté un cache sur ces filtres combinés, ce qui est très efficace pour l’autocomplétion… moins sur les CSV sauf si ils sont triés pour avoir les filtres identiques à la suite.

Exemple: https://demo.addok.xyz/search?q=pont+de+creteil&citycode=94028+94068&type=street

C’est un problème de standard de données?

Ca ca fonctionne pas mal sur des grosses chaînes de magasins (genre ‘Fnac + commune’) même sur un hypermarché Leclerc, (qui pourrait être confondu avec un nom de voie), si on met ‘Leclerc + commune’. Ca fonctionne aussi sur des localisants, type églises, arrêts de bus, gare,…
Y a de quoi améliorer de ce côté-là, même si j’ai compris que ce n’était pas dans les priorités.

Et pour celui-ci, j’avais poussé les cas tordus et il m’a toujours tout trouvé, même sur des voies n’étant pas sur le même département et/ou commune et n’ayant pas de connexion directe (grâce au buffer; intéressant quand les victimes ne savent pas trop où elles sont). Le problème est que ce script n’est pas automatique et nécessite de réimporter toutes les voies (et surtout les nouvelles ou renommer) à chaque fois. Ca n’aura d’intérêt pour NexSIS que si c’est fait en continu ou presque.

@cquest Non, on n’a pas chercher à travailler sur des triggers PG car la philosophie (archi) du projet, c’est de ne pas mettre d’intelligence ni de métier dans la base de données…

@gendy54 Le problème avec les PK, c’est que la string "A4 - PK52’ est probablement assez difficile à indexer. Et d’un point de vue modélisation, il faudrait probablement reprendre celle des street/housenumbers.

Je ne pense pas, pour les intersections ça fonctionne très bien.
Le défaut est d’avoir un grand nombre d’entrées indexées (pour A4) et donc de la RAM utilisée.

Pour ce type de recherches très peu « full text » addok n’apporte par contre pas grand chose si ce n’est d’avoir un outil unique.

Je ne comprends pas les détails techniques mais en tout cas dans la ref nationale des PK autoroutes, il y a en plus le côté G ou D qui est ajouté.
Ce qui est peut-être gênant c’est que ce sont des voies de grandes longueurs qui dépassent les frontières départementales (donc priorisation sur une zone notamment départementale au niveau du localisant plus difficile) et sans aide des automobilistes qui ont peu de repères pour aider. Et pourtant c’est bien sur ce type de localisant qu’il y a le plus d’enjeux car il faut envoyer les engins vers la bonne entrée et dans le bon sens, sinon on perd beaucoup de temps. Bon après, avec l’AML, en théorie, il y a moins de problèmes (sauf peut-être celui du sens de circulation).

Pour le sens, il faudrait l’ajouter en contexte avec la destination principale, car gauche/droite il faut connaître le sens de référence !

Oui, je ne sais pas comment s’est fait le choix. Tu as sûrement connu l’époque où on parlait de Paris/Province vs Province/Paris :wink:

Il y a des chances pour que le sens de référence ce sont les PK ascendants… enfin, c’est ce que j’aurais fait.

@cquest @gendy54 Merci pour vos retours, je prends note de tout ça et vous tiens au courant de l’amélioration de l’indexation des PK

1 « J'aime »

@cquest @ybon On aimerait bientôt ouvrir le code source d’ArchiBAN (voir paragraphe 5). Pensez-vous envisageable qu’il rejoigne l’organisation Github d’addok ? Ça nous semble l’endroit le plus approprié…

Plutôt favorable, ou a minima avoir au moins dans addok une liste des projets périphériques pour facilement les retrouver.

@cquest On aimerait éviter de le stocker sur le GH de camptocamp et l’ANSC ne souhaite pas maintenir un GH en son nom. Donc ça nous paraît la meilleure solution :slight_smile:

Si c’est un projet spécifique “BAN” ou disons peu détachable du contexte de la BAN c’est peut-être pas forcément adéquat.
On risque quand même d’avoir n façons différentes de faire plus ou moins la même chose. Je suis d’accord avec Christian avec l’idée d’avoir une page qui référence des utilisations pertinentes/avancées de addok par contre :slight_smile:

@jdesboeufs Non, non, ce n’est pas un projet spécifique à la BAN. On l’a pensé générique, au delà de la BAN. Cela dit, ta remarque me fait dire qu’il faudrait peut-être changer le nom d’ArchiBAN car 1) c’est confusant et 2) je ne veux pas créer d’ambiguïté avec la marque “BAN”…

Favorable aussi sur le principe. On dit qu’on se regarde le code ensemble un de ces quatre ?

@ybon Avec plaisir ! On est en train de le préparer pour son ouverture. On revient vers toi dès que c’est fait…

Bonjour, j’ai lu ça récemment, je pose ça là à toutes fins utiles pour alimenter votre sujet ! : IJGI | Free Full-Text | Automatic Identification of Addresses: A Systematic Literature Review | HTML (mdpi.com)

1 « J'aime »