#1 Fri 11 October 2013 17:23
- mstcx
- Participant actif
- Lieu: Nîmes
- Date d'inscription: 21 Feb 2008
- Messages: 87
matrice carrée
Bonjour,
Mon sujet n'est peut être pas sans liens avec un des post récent "transposer des colonnes en lignes ", mais je n'ai pas trouvé là mon bonheur...
Je souhaite comparer 2 zonages entre eux et créer un matrice de comparaison.
J'utilise "AreaOnAreaOverlayer" ce qui me donne le résultat suivant
Zonage1 Zonage2 surface
A A 2
A A 3
C A 5
V Z 4
V R 1
C C 2
C C 1
Je pourrai passer ce tableau sur Excel et faire une matrice carrée, mais je souhaite réaliser le moins possible de manipulations hors FME
Je voudrai obtenir une matrice carrée :
Zonage1 en Colonnes
Zonage2 en lignes
Somme de surface en valeurs
A B C
A 5 0 5
B 0 0 0
C 5 0 3 etc...
Sachant que chacun de mes zonages ne comportent pas forcément toutes les 26 lettres de l’alphabet (c'est pour l'exemple) comme occurrences.
Je pense que c'est possible avec FME ?
Merci pour vos réponses !
Hors ligne
#2 Tue 15 October 2013 16:14
- FANTIN
- Juste Inscrit !
- Lieu: Winchester, UK
- Date d'inscription: 25 Feb 2008
- Messages: 6
Re: matrice carrée
Bonjour,
Voici quelques idees:
1. Explorer l'option d'utiliser un PythonCaller qui pourrait bien rendre les choses beaucoup plus simples!
2. Sinon, voici potentiellement un debut de raisonnement mais plutot complique (donc a tester et murir). Je pense qu'il y aura peut-etre besoin de custom transformer pour utiliser des 'looper'.
Le but ultime est de creer un fichier texte et de l'ecrire ligne par ligne. L'information doit etre groupee et ordonnees. Il devrait y avoir des elements qui peuvent vous mettre sur la piste dans le raisonnement ci-dessous...
Raisonnement:
Flux de donnee principal
- creer 3 attributs sur votre 1er flux de donnees (f1):
. z1z2 et z2z1 qui correspondent a la concatenation des noms de chaque zone (e.g.: z1z2=AC, z2z1=CA) (StringConcatenator)
. zOrd qui correspond a la plus petite valeur parmi les 2 precedents attributs (e.g.: AC) (Tester)
- creer un autre flux (f2) pour
. faire la somme des surfaces pour chacun des couples de zones zOrdonne (StatisticsCalculator & GroupBy sur zOrd)
. ordonner le flux de donnees par nom de zonage (Sorter ou ListSorter sur zOrd)
- ajouter la somme obtenue a toutes les entites qui sont cernees (FeatureMerger de f2 sur f1 groupe par zOrd)
Pour construire le contenu non null de la matrice: (1)
- ajouter a chaque entite un attribute surface dont la valeur est 0
- construire des listes: grouper les entites par nom de z1 (ListBuilder)
- ordonner les entites par z1 croissant (sorter)
- ordonner les elements de chaque liste par nom de z2 croissant (listsorter)
Pour construire la structure de la matrice: (2)
- ne garder que les attributs qui enregistrent le nom des zones (z1 et z2)
- utiliser un duplicate remover sur z1
- construire une liste de z1 (ex.: liste des noms de champs verticale)
- utiliser un duplicate remover sur z2
- construire une liste de z2 (ex.: liste des noms de champs horizontale)
faire en sorte que les 2 listes soient sur un meme object 'structure'
Pour remplir la matrice:
Pour naviguer a chaque position de la matrice:
- eclater les listes de la structure de la matrice (2) en gardant les valeurs des attributs
- utiliser un custom transformer et des looper input/output pour simuler 2 boucles (verticale et horizontale)
- pour chaque couple d'index, chercher l'element correspondant dans le contenu non-null de la matrice (1)
. s'il existe, remplacer la valeur par default de l'attribute surface de la matrice par la valeur
Pour ecrire:
- creer le header du fichier:
. grouper les zones de l'object qui comporte la structure de la matrice en liste
. ordonner les valeurs des listes de noms de zones
. concatener les elements de la liste z1 ou z2 (qui devraient etre les memes) en utilisant la virgule comme separateur
- ordonner vos donnees dans des listes:
. grouper par z1
. ordonner les listes selon leur valeur z1
. ordonner les elements des listes z2
. ajouter en element en position zero de la liste surface: le nom de z1
. concatener en 1 seul attribut les valeurs des surfaces en les separant par des virgules
faire en sorte d'obtenir 1 entite par ligne de fichier.
ecrire un fichier text qui contient l'ensemble de ces donnees en reliant l'attribute
Dernière modification par FANTIN (Tue 15 October 2013 16:14)
Hors ligne
#3 Mon 21 October 2013 16:53
- mstcx
- Participant actif
- Lieu: Nîmes
- Date d'inscription: 21 Feb 2008
- Messages: 87
Re: matrice carrée
Bonjour,
Hélas, je ne connais pas le langage python. Effectivement, la solution FME proposée semble bien compliquée et je n'ai que peu de temps pour la développer. Tant pis, un tableau croisé sous Excel (même incomplet) fera l'affaire en sortie de "l'AreaOnAreaOverlayer".
Encore merci d'avoir pris le temps de me répondre longuement !
Hors ligne
#4 Mon 21 October 2013 17:54
- Sarah - VEREMES
- Participant actif
- Date d'inscription: 21 Apr 2009
- Messages: 51
Re: matrice carrée
Bonjour,
J'arrive un peu après la bataille mais il me semble que le nouveau Transformer AttributePivoter peut répondre à votre problème.
Je mets en pièce jointe un modèle de projet fmw en utilisant un fichier Excel qui reprend le tableau du début, à savoir :
Zonage1 Zonage2 surface
A A 2
A A 3
C A 5
V Z 4
V R 1
C C 2
C C 1
Pour récupérer en sortie :
[img]http://img577.imageshack.us/img577/6100/i9v0.png[/img]
Uploaded with ImageShack.us
Dernière modification par Sarah - VEREMES (Mon 21 October 2013 17:54)
Sarah MOURE
Veremes : support FME & version française
Hors ligne