Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Sarah MOURE
Veremes : support FME & version française

Hors ligne

 

Pied de page des forums

Powered by FluxBB