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 Wed 29 June 2016 12:05

JPr31
Participant occasionnel
Date d'inscription: 7 Jun 2012
Messages: 15

ArcGIS 10.2 : erreur python depuis migration depuis ArcGIS 10

Bonjour,

Ma société a migré de Arcgis 10 à Arcgis 10.2 depuis 2 mois. Mon soucis vient du fait qu'un script python qui fonctionnait parfaitement sous la version 10, change mes résultats depuis la passage à la version 10.2

Pour être plus précis, je récupère des valeurs de 2 champs différents, que je concatène dans un nouveau champ.
Il y a la récupération d'un texte (par exemple polyéthylène) et d'un nombre (par exemple 50).

Ces 2 valeurs sont concaténées dans un nouveau champ pour donner (pour ici: PE 50).
Depuis le changement de version d'Arcgis, j'obtiens comme résultat : PE 50.0

Je ne comprends pas pourquoi mon Calculate.field me rajoute un .0 à tous mes résultats.

Si vous avez des idées je suis preneur (je peux mettre mon code en exemple au cas ou)

Merci d'avance

Dernière modification par JPr31 (Wed 29 June 2016 13:50)

Hors ligne

 

#2 Thu 30 June 2016 08:15

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

Re: ArcGIS 10.2 : erreur python depuis migration depuis ArcGIS 10

Bonjour,

Sans le code, cela me difficile de vous aider...

Bonne journée

Franck

Hors ligne

 

#3 Thu 30 June 2016 10:30

JPr31
Participant occasionnel
Date d'inscription: 7 Jun 2012
Messages: 15

Re: ArcGIS 10.2 : erreur python depuis migration depuis ArcGIS 10

Bonjour,

Voici le code

Merci d'avance,

cdlt,


Code:

from __future__ import unicode_literals

import arcpy

mxd = arcpy.mapping.MapDocument("CURRENT")
path = arcpy.GetParameterAsText(0) #récupère la couche choisie en entrée


#########################################################################################################################
#########################################################################################################################
#########################################################################################################################

expression = "getDN(!Diametre!,!Materiau!,!Nature!,!Utilisatio!)"
codeblock = """
def getDN(Diametre, Materiau, Nature, Utilisatio):
    if Materiau == 'Acier' and Utilisatio != 'BRC' and Diametre != 0:
        if Nature == 'Centriflex':
            Nat = 'ACX'
        else:
            Nat = 'A'
    elif Materiau == 'Aluminium' and Utilisatio != 'BRC' and Diametre != 0:
            Nat = 'Al'
    elif Materiau == 'Amiante ciment' and Utilisatio != 'BRC' and Diametre != 0:
            Nat = 'AC'
    elif Materiau == 'Béton' and Utilisatio != 'BRC' and Diametre != 0:
            Nat = 'B'
    elif Materiau == 'Caoutchouc' and Utilisatio != 'BRC' and Diametre != 0:
            Nat = 'C'
    elif Materiau == 'Composite' and Utilisatio != 'BRC' and Diametre != 0:
        if Nature == 'PRV':
            Nat = 'PRV'
        else:
            Nat = 'PY'
    elif Materiau == 'Fonte' and Utilisatio != 'BRC' and Diametre != 0:
        if Nature == 'Fonte ductile' or Nature == 'Fonte ductile type jf' or Nature == 'Fonte ductile type standard' or Nature == 'Fonte ductile TAG 32':
            Nat = 'FD'
        elif Nature == 'Fonte grise' or Nature == 'Fonte grise type express' or Nature == 'Fonte grise type standard' or Nature == 'Fonte grise type plomb':
            Nat = 'FG'
        elif Nature =='Fonte TT':
            Nat = 'FT'
        elif Nature =='Blue Top':
            Nat ='FB'
        elif Nature =='Fonte intégrale':
            Nat ='FI'
        else:
            Nat = 'F'
    elif Materiau == 'Grés' and Utilisatio != 'BRC' and Diametre != 0:
            Nat = 'G'
    elif Materiau == 'Inox' and Utilisatio != 'BRC' and Diametre != 0:
            Nat = 'I'
    elif Materiau == 'Pvc' and Utilisatio != 'BRC' and Diametre != 0:
        if Nature == 'Pvc renforcé':
            Nat = 'PVCr'
        elif Nature == 'Pvc Bi-orienté':
            Nat = 'PVCbo'
        else:
            Nat = 'PVC'
    elif Materiau == 'Plomb' and Utilisatio != 'BRC' and Diametre != 0:
        if Nature == 'Plomb réhabilité':
            Nat = 'PBrh'
        else:
            Nat = 'PB'
    elif Materiau == 'Polyéthylène' and Utilisatio != 'BRC' and Diametre != 0:
        if Nature == 'Polyéthylène expansé basse densitè':
            Nat = 'PEBd'
        elif Nature == 'Polyéthylène expansé haute densité':
            Nat = 'PEHd'
        elif Nature == 'Polyfluorure de vinylidène':
            Nat = 'PEHd PVDF'
        elif Nature == 'Polybleu RD':
            Nat = 'PEHd RD'
        else:
            Nat = 'PE'
    elif Materiau == 'Drain' and Utilisatio != 'BRC' and Diametre != 0:
            Nat = 'D'
    else:
        Nat = ' '
    if Diametre != 0 and Utilisatio == 'TRC' and Materiau != 'Inconnu':
        diam = Diametre
    else:
        diam = ' '

    return Nat +' '+ str(diam)"""

#########################################################################################################################
##################################################
#########################################################################################################################

arcpy.AddField_management(path,"DN","TEXT")
arcpy.CalculateField_management(path,"DN",expression,"PYTHON_9.3",codeblock)

#########################################################################################################################
#####################################################################################
#########################################################################################################################

input_feature_class = path
input_layer_file = br"chemin_acces couche lyr"
df = arcpy.mapping.ListDataFrames(mxd)[0]

layer_file_object = arcpy.mapping.Layer(input_layer_file)
original_fc_name = str(layer_file_object.name)

input_layer_object = arcpy.mapping.ListLayers(mxd, input_feature_class)[0]
input_fc_name = str(input_layer_object.datasetName)
input_fc_toc_name = str(input_layer_object.name)
input_fc_workspace = str(input_layer_object.workspacePath)

workspace_id = str(arcpy.Describe(input_fc_workspace).workspaceFactoryProgID)

if workspace_id == "esriDataSourcesGDB.AccessWorkspaceFactory.1":
     workspace_type = "ACCESS_WORKSPACE"
elif workspace_id == "esriDataSourcesGDB.FileGDBWorkspaceFactory.1":
     workspace_type = "FILEGDB_WORKSPACE"
elif workspace_id == "esriDataSourcesGDB.SdeWorkspaceFactory.1":
     workspace_type = "SDE_WORKSPACE"
else:
    workspace_type = "SHAPEFILE_WORKSPACE"

arcpy.mapping.UpdateLayer(df, input_layer_object, layer_file_object, False)

refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]

refocus_layer.replaceDataSource(input_fc_workspace, workspace_type, input_fc_name)

refocus_layer.name = input_fc_toc_name

arcpy.RefreshTOC()

arcpy.RefreshActiveView()

Dernière modification par JPr31 (Thu 30 June 2016 11:30)

Hors ligne

 

#4 Thu 30 June 2016 16:10

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

Re: ArcGIS 10.2 : erreur python depuis migration depuis ArcGIS 10

Bonjour,

Je ne sais pas pourquoi cela ne fonctionne plus en version 10.2, le changement de la version de Python ?

Mais, si tu remplace ce code :

Code:

return Nat +' '+ str(diam)"""

par celui-ci :

Code:

return '{0} {1:.0f}'.format(Nat, diam)"""

, cela fonctionnera peut-être comme avant...

A+

Franck

Hors ligne

 

#5 Thu 30 June 2016 16:26

JPr31
Participant occasionnel
Date d'inscription: 7 Jun 2012
Messages: 15

Re: ArcGIS 10.2 : erreur python depuis migration depuis ArcGIS 10

Alors il y a du nouveau et une erreur.

Si je remplace par

Code:

return '{0} {1:.0f}'.format(Nat, diam)"""

la moulinette me met une erreur

Code:

Traceback (most recent call last):
  File "U:\PYTHON\etiquettes DN_MATERIAU\Etiquettes_Dn_Materiau_AEP.py", line 90, in <module>
    arcpy.CalculateField_management(path,"DN",expression,"PYTHON_9.3",codeblock)
  File "d:\arcgis\desktop10.2\arcpy\arcpy\management.py", line 3354, in CalculateField
    raise e
ExecuteError: ERROR 000539: Error running expression: getDN(0.0,u"Inconnu",u"Inconnu",u"TRC") 
Traceback (most recent call last):
  File "<expression>", line 1, in <module>
  File "<string>", line 70, in getDN
ValueError: Unknown format code 'f' for object of type 'str'

Échec de l’exécution de (CalculateField).


Échec de l’exécution de (Etiquettes).

En fait le script ne finit pas son action, mais il réussit à me créer le nouveau champ avec quelques valeurs.... où le ".0"  n’apparaît plus. Donc y'a du positif dans ton aide....

Mais ma moulinette ne marche plus smile

Hors ligne

 

#6 Fri 01 July 2016 07:41

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

Re: ArcGIS 10.2 : erreur python depuis migration depuis ArcGIS 10

Bonjour,

J'y ai pensé ce matin au petit déj... ma solution ne pouvait pas fonctionner complètement smile
Le type des variables et leur conversion en chaîne de caractères est mal géré...

Le correctif serait plutôt ceci :

Code:

    if Diametre != 0 and Utilisatio == 'TRC' and Materiau != 'Inconnu':
        diam = '{0:.0f}'.format(Diametre) #conversion du type flottant en string
    else:
        diam = ' '

    return '{0} {1}'.format(Nat, diam)"""

Bonne journée

Franck

PS : la doc de la méthode format() qui permet de géréer les conversion en chaîne de caractères d'autres types de données

Hors ligne

 

#7 Tue 12 July 2016 09:18

JPr31
Participant occasionnel
Date d'inscription: 7 Jun 2012
Messages: 15

Re: ArcGIS 10.2 : erreur python depuis migration depuis ArcGIS 10

Cela marche, merci de votre aide.
Je n'avais pas pu tester avant pour vous répondre.

bonne journée

Hors ligne

 

Pied de page des forums

Powered by FluxBB