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é ?

#1 Tue 06 October 2015 10:20

nitram
Participant assidu
Lieu: Brest
Date d'inscription: 19 May 2009
Messages: 990
Site web

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

nitram
Participant assidu
Lieu: Brest
Date d'inscription: 19 May 2009
Messages: 990
Site web

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

nitram a écrit:

@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

 

#6 Tue 06 October 2015 17:34

nitram
Participant assidu
Lieu: Brest
Date d'inscription: 19 May 2009
Messages: 990
Site web

Re: Détecter champ contenant la valeur max

Merci Pivès001 pour ces précisions.
Je suis parti sur la proposition d'Anne qui répond tout à fait au besoin.

Bonne fin de journée et encore merci!

Hors ligne

 

Pied de page des forums

Powered by FluxBB