Pasq.fr

Parce-qu'il y a forcément du sens à tout ce bordel !

Bienvenu.e à bord de l'ADMIN-EXPRESS 2/2

Rédigé par Alain Aucun commentaire
digital transformation

Où, comment j'ai découvert KNIME pour automatiser des fichiers. Le premier article est l'histoire, celui ci sera plus technique.

Ah, la découverte d'un nouveau monde, enfin presque, j'avais déjà tâter du geokettle, essayer des trucs comme SDI à l'époque, mais jamais de FME bizarrement, sans doute à cause du $€, pour finalement préférer le python ou les outils QGIS ("refactoriser les champs" est très souvent suffisant pour mon niveau).

Je ne vais pas tout expliquer dans le détail, ce n'est pas un tuto KNIME, étant moi même très mauvais, mais je vais vous partager mon expérience et voir à la fin si je jette ou si je garde. Je vous passe les détails des tuto toujours sympa pour se lancer dans un nouvel environnement.  J'avoue qu'au début, je ne savais pas trop où je mettais les pieds, assembler des briques, les relier entre elles, voir si le feu est vert (sous la brique) et comment je fais du spatial ?

Comme beaucoup d'autres logiciels, les extensions sont là pour ajouter les fonctionnalités, la communauté est active et il y a beaucoup d'ajouts, dont une extension geospatial estampillé Copyright by SDL, Harvard, Cambridge US quand même ! Donc avant d'en arriver là (cf. image, oui cela fait beaucoup de briques !) franchissons quelques étapes.

vue ensemble

Lire les fichiers

Pour rappel, dans l'article précédent, je veux séparer les fichiers les fichiers IGN en plusieurs fichiers. J'ai chois le geopackage IGN directement en WGS84, cela fiat toujours une transfo de projection de moins.

Ma technique consiste à tester des petites boucles, pour ensuite assembler tout ça. Donc d'abord la brique geopackage reader, simple, elle ouvre les geopakage, inconvénient : elle ouvre 1 couche à la fois par contre vous pouvez obtenir la liste des couches présentes dans le gpkg.

Il faut aussi s'habituer à l'interface. Dans l'exemple suivant, je ne garde que les colonnes qui m'intéresse grâce à un column filter : en 1 la 'brique' enfin plutôt le noeud (node) relié à me lecture de couche, en 2 ces paramètres du noeud, c'est toujours assez simple et intuitif et en 3 le résultat quand on 'execute' un preview de sortie y compris pour les variables.

interface

transformer la donnée, du tri, de la sélection, de la manipulation

Alors c'est là que je trouve que c'est parfois compliqué de faire simple dans KNIME, oui tous les noeuds sont logiques, font pour la plupart 1 tâche, mais il faut vraiment tout décomposer. Je m'explique, dans l'exemple qui suit

1 je lis le fichier, je récupère quelques colonnes (2), le flux de ces colonnes va s'écrire dans le geofile. Simple. Sauf que je veux que le geofile s'écrive dans un répertoire particulier qui correspond à ma couche extraite : je créée donc une colonne (en 4)  qui contient le chemin et le nom du fichier (le répertoire de de base (basepath propre à mon pc)+le nom du geopackage de base pour savoir de quel source cela vient + le nom du fichier

string($${Sbasepath}$$)+string($${Soriginpath}$$)+string("/France/region.geojson")

sauf que je peux passer cette colonne en texte directement en variable, il faut lui dire que c'est un chemin de fichier (5), pour la passer en variable (6), mais le noeud geofile n'accepte pas directement les chemins en variable, faut la mettre en texte, donc je repasse la variable chemin en texte (7) pour l'imposer comme nom de fichier en variable dans le nom de fichier (8). Simple...Bon cela vient du fait que le geofile n'accepte pas un 'path' comme chemin de fichier, sans doute du à son ancienneté. Mais bon, voilà le genre de truc où vous passez qq heures à vous demandez pourquoi cela ne marche pas si vous faîtes pas toutes ces transformations...

enchainements

et ça 4 fois pour les fichiers France entière. C'était la partie la plus simple, mais je ne savais pas encore.

Par région

Toujours pour illustrer cette complexité et vous partager mes galères, maintenant, sortons les fichiers par région.

Même principe, mais il faut que j'extrait le nom de la région, pour faire le répertoire type 53-bretagne, et que les fichiers soient nommés type 53-bretagne-communes.geojson. Et cela pour toutes les régions avec 4 fichiers (contours de la region, département de la région, epci de la région, et communes de la région...). J'ai tout ça dans les couches avec les attributs qui vont bien...

Je en vais pas vous tout décrire, mais si on regarde dans le détail pour la sortie des contours de régions et des départements de la région :

Bon je lis le fichier, je garde quelques colonnes, et là je veux trier par code_insee de région donc row filter (en 2), sauf que je rends vite compte à l'essai, que j'ai qu'une région qui sort (01 La guadeloupe), bin oui, faut faire une boucle. Je crée donc un boucle sur le code_insee de la région. Je récupère au passage ce code_insee comme variable pour faire le tri sur les départements

Viens ensuite le nom des fichiers...attention suivez bien. Je suis obligé de réagencer (1 - column resorter) les colonnes de ma table car sinon le code_insee était après le nom de régions, car oui, pour concaténer (2-column aggregator) les colonnes, il faut qu'elles soient dans l'ordre, vous ne pouvez pas faire 53-bretagne si les colonnes sont NOM - CODE_INSEE, il faut que ce soit CODE_INSEE - NOM dans la table !!!

En 3 je crée mon nom du répertoire, vous voyez le trait rouge en haut, il me donne le chemin de base, et la source

string($${Sbasepath}$$) + string($${Soriginpath}$$) + string("/Region/")+string($nom-region$) + string("/")

la manipulation du 4 crée le nom du fichier : la variable target est le chemin du répertoire créé avant, et nom-region est le nom concaténer dans le 2, cela sort 01-Guadeloupe, par exemple. Vous nnoterez que je transforme ce nom région en variable (en 6) pour pouvoir enregistrer le nom du répertoire pour les autres fichiers.

string($target$) +string("/") + string($nom-region$) + string(".geojson")

faut transformer en chemin (en 5) appelé "filepath"

Mais pourquoi as-tu mis une boucle (1 ci dessous qui finit en 3) avant de transformer la variable en texte (en 2) ?? Bin, pareil, aux essais, j'avais bien ma boucle mais 1 seul fichier en sortie, le dernier de la liste, j'ai mis du temps à me rendre compte que le nom du fichier ne changeait pas, et donc il fallait aussi un boucle pour que chaque table sortie s'écrivent dans le fichier qui va bien. Le noeud de fin 4 est le neoud de fin de la boucle des régions, pareil, j'ai mis du temps à trouver le bon emplacement pour que cela ne boucle en rond, pas assez ou sur toujours les même fichiers. Quand je regarde après coup, cela me parait logique, mais je vous promet que les boucles et leur imbrications sont pas faciles à gérer.

4eme encart

Bon voilà pour les départements, c'est un peu la même problématique avec application des mêmes recettes. Vous avez le fichier complet dans le codeberg, si vous voulez étudier ou améliorer le bousin.

et le géospatial dans tout ça...

C'est vrai, à part lire du geopackage et écrire du geojson, pas beaucoup de geospatial, sauf que j'ai voulu sortir les EPCI par région et par département, et là gros piège : la table des epci ressemble à ça

table epci

Pas de relation avec la région, et une relation en liste pour les départements. Alors j'ai bien essayé les regex, les jointures compliquées pour sortir les département /région puis comparer avec un regex sur la liste, pour ensuite....aahhh, trop compliqué. Donc plus simple, je vais faire une intersection entre les epci et la région (ou le département) et basta. Ok, je fais un petit test dans un autre fichier knime, je vous met la copie et je vous explique

geospatial epci

J'extrais mon contour de région, ma couche d'epci. Vous remarquerez le noeud Geospatial view pour voir le résultat (les captures ci-dessous).

La jointure spatiale permet plusieurs type de jointure et plusieurs prédicat, et après avoir tout essayé, l'intersection est le plus efficace, mais ressort les surfaces qui touchent le contour initial. Cela ne m'arranges pas, il faut donc trouver le moyen de supprimer les epci qui ne sont pas concernées

Vue 1 : le contour de la région, extraction simple.

vue 1

vue 2 : la première intersection, qui sort toutes les EPCI qui intersectent et qui touchent la surface.

vue 3 : les epci qui touchent seulement le contour de région. parce-que l'idée, c'est de les repérer pour les supprimer de la vue 2

 vue 3

vue 4 : après une jointure des 2 tables, qui exclue les différences entre la vue 2 et la vue 3, et tada, cela fonctionne plutôt bien. j'ai donc appliqué cela dans le flux complet.

Et après

Voilà le traitement KNIME sort ce que je voulais, C'est à dire une séparation des répertoires en France, Région, Département, suivant 3 sources et suivant 3 niveaux de  simplification. Ah oui, j'ai pas fait la simplification.

Alors j'ai tenté d'intégrer cela dans le traitement, mais je n'ai pas réussi à intégrer mapshaper (cf article précédent) dans un noeud d'application externe. Je me suis donc rabattu sur du python...oui, bin au bout d'un moment, faut reprendre le connu et rapide. et j'avoue il est passé par l'IA pour l'optimiser.

Donc le script python récupére tous les fichiers de façon récursive, les passe dans mapshaper, et les enregistre suivant la même structure. Après le script de commande reste à optimiser car il faut que je lance 6 fois les scripts (3 sources et 1 fois à 25% et une fois 5%), pas terrible, mais j'y pense.

Conclusion

Enfin la conclusion, le montage de tout ça a été passionnant, énervant, et après beaucoup de mécanique bizarre, je commence à apprécier KNIME, car la courbe d'apprentissage est rapide, il m'a fallut quelques semaines pas à temps plein pour générer le flux complet. Donc je commence à m'attacher, j'ai testé aussi les tableaux de bord, les sorties de rapport PDF. J'ai effleuré le logiciel, j'ai posé très peu de question à l'IA intégré car chaque fois elle m'a plus embrouiller je trouve, heureusement il y a beaucoup d'exemple, une communauté importante et un forum qui répond par des fichiers exemples. Le plus compliqué est de trouver le bon noeud (tout est en anglais) pour la bonne tâche.

Je vous livre tout ça, car un plus, j'en ai fait un site (là j'avoue, j'ai utilisé l'IA, mais faut connaitre le php et le css pour corriger ces erreurs !!). et tout les fichiers techniques sont sur codeberg.

https://geojson.pasq.fr/

https://codeberg.org/pasq_fr/ADE-Geojson

N'hésiter pas à commenter, partager, améliorer, critiquer, poser des questions....


Écrire un commentaire

Quelle est le quatrième caractère du mot vs10iq ?