#1 Tue 06 October 2015 10:20
Détecter champ contenant la valeur max
Bonjour,
J'ai une couche contenant plusieurs champs de type numérique (DOUBLE) et 450000 entités.
Je souhaiterais, pour chaque entité, savoir dans lequel de ces 28 champs se trouve la valeur maximum.
L'idée est de récupérer ce nom de champ dans un autre champ.
La couche en question : Ilots déclarés à la PAC en 2014 et les surfaces en 28 groupes de cultures en Bretagne
http://geobretagne.fr/geonetwork/apps/g … 1634e80f03
Le but est, pour chaque parcelle, d'avoir un champ contenant le type de culture majoritaire.
Merci d'avance pour toutes suggestions.
Martin
Hors ligne
#2 Tue 06 October 2015 11:39
- anne13
- Participant actif
- Lieu: Villeurbanne
- Date d'inscription: 12 May 2009
- Messages: 71
Re: Détecter champ contenant la valeur max
Bonjour,
j'aurais fait un dev (model builder ou python) avec 28 if/then/else imbriqués, avec une variable X et un nouveau champ C :
Etape 1 : remplir X avec la valeur du 1er champ et remplir C avec le nom du 1er champ
Etape 2 : tester si la valeur du 2e champ est supérieure à la valeur de X, si oui remplir C avec le nom du 2e champ, si non, on ne fait rien
refaire l'étape 2 autant de fois que nécessaire pour tester les 28 champs les uns après les autres.
Bon courage!
Anne
Anne B, Ville de Villeurbanne
Hors ligne
#3 Tue 06 October 2015 11:50
- Pivès001
- Participant actif
- Date d'inscription: 23 Jan 2008
- Messages: 138
Re: Détecter champ contenant la valeur max
Bonjour,
il faut autant de colonnes "libellé culture" et "surface culture" que de groupe de culture. Ensuite en python (exemple avec 10 cultures) :
Code:
def myCalc(surfMax,surf01,surf02,surf03,surf04,surf05,surf06,surf07,surf08,surf09,surf10,lib01,lib02,lib03,lib04,lib05,lib06,lib07,lib08,lib09,lib10 ): if (surf01 == surfMax): return lib01 elif (surf02 == surfMax): return lib02 elif (surf03 == surfMax): return lib03 elif (surf04 == surfMax): return lib04 elif (surf04 == surfMax): return lib04 elif (surf05 == surfMax): return lib05 elif (surf06 == surfMax): return lib06 elif (surf07 == surfMax): return lib07 elif (surf08 == surfMax): return lib08 elif (surf09 == surfMax): return lib09 elif (surf10 == surfMax): return lib10
Code:
myCalc(!S_CULT_MAJ!,!S_CULT01!,!S_CULT02!,!S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10!,!CULT01!,!CULT02!,!CULT03!,!CULT04!,!CULT05!,!CULT06!,!CULT07!,!CULT08!,!CULT09!,!CULT10!)
Hors ligne
#4 Tue 06 October 2015 15:06
Re: Détecter champ contenant la valeur max
Merci pour vos réponses!
@ anne13 : En effet, ça semble jouable, je pense que je vais monter un petit model builder sur la base de votre proposition et donc de quelques if/then...
@Pivès001 : je me demande d'où sort le surfMax? À quoi correspond-il?
Et tout cas merci pour vos réponses!
Martin
Hors ligne
#5 Tue 06 October 2015 16:30
- Pivès001
- Participant actif
- Date d'inscription: 23 Jan 2008
- Messages: 138
Re: Détecter champ contenant la valeur max
@Pivès001 : je me demande d'où sort le surfMax? À quoi correspond-il?
Dans mon cas j'avais une couche vecteur des ilots et un tableur des cultures correspondantes par ilots. J'ai reconfiguré ma table pour avoir une colonne libellé et surface pour chaque culture. J’ai ensuite fait une recherche de max (par comparaison entre champs) et rapatriement du libellé associé.
C'est écrit très grossièrement et serait surement optimisable mais ca marche aussi comme ça :
Recherche du max
Code:
max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])
Recherche des libellés
Code:
if max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT01! return !Lib_Cult01! elif max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT02! return !Lib_Cult02! elif max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT03! return !Lib_Cult03! elif max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT04! return !Lib_Cult04! elif max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT05! return !Lib_Cult05! elif max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT06! return !Lib_Cult06! elif max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT07! return !Lib_Cult07! elif max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT08! return !Lib_Cult08! elif max([!S_CULT01!, !S_CULT02!, !S_CULT03!,!S_CULT04!,!S_CULT05!,!S_CULT06!,!S_CULT07!,!S_CULT08!,!S_CULT09!,!S_CULT10! ])==!S_CULT09! return !Lib_Cult09! else return !Lib_Cult10!
Hors ligne