#1 Fri 21 November 2014 17:01
- Samy-DT
- Participant assidu
- Date d'inscription: 5 Apr 2011
- Messages: 211
python : incrémenter une classe d'entité
Bonjour,
J'ai un script qui me sert à découper toutes les classes d'entité d'une géodatabase par les entités successives d'une couche de découpe.
J'ai d'abord testé le script avec un seul polygone à découper et ça marche (sans la fcList du code ci-dessous). En revanche, quand j'essaye sur toute la liste, le script bug après le premier découpage parce qu'il ne fait pas le passage à la classe d'entité suivante.
Or après avoir cherché toute l'aprem sur le net, je n'ai pas trouvé d'exemple pour incrémenter la liste des classes d'entités.
Le script devrait aider à comprendre :
Code:
import arcpy, os arcpy.env.workspace = r'Z:\Documents\SIG\tests\synthese_tocorrect.gdb' fcList = arcpy.ListFeatureClasses() clip = r'Z:\Documents\SIG\tests\decoupe.shp' rows = arcpy.SearchCursor(clip) #permet de parcourir toutes les entités de la couche de découpe count = 0 # incrémente les entités de la couche de découpe outFolder = r'Z:\Documents\SIG\tests\sorties' for fc in fcList: for row in rows: out = os.path.join(outFolder, "data_" + fc) arcpy.Clip_analysis(fc, row.Shape, out) count = count + 1 #et ici, il doit manquer l'incrément de fc, j'ai essayé break mais ça produit une erreur "Runtime error <type 'exceptions.RuntimeError'>: Object: Error in executing tool"
Voila, ça doit être bête mais je débute avec ça.
A+
Hors ligne
#2 Fri 21 November 2014 23:24
Re: python : incrémenter une classe d'entité
Bonjour,
Si le copier/coller de ton code dans le forum correspond exactement à ton code, c'est peut-être juste un problème d'indentation :
Code:
import arcpy, os arcpy.env.workspace = r'Z:\Documents\SIG\tests\synthese_tocorrect.gdb' fcList = arcpy.ListFeatureClasses() clip = r'Z:\Documents\SIG\tests\decoupe.shp' rows = arcpy.SearchCursor(clip) #permet de parcourir toutes les entités de la couche de découpe count = 0 # incrémente les entités de la couche de découpe outFolder = r'Z:\Documents\SIG\tests\sorties' for fc in fcList: for row in rows: out = os.path.join(outFolder, "data_" + fc) arcpy.Clip_analysis(fc, row.Shape, out) count = count + 1 #et ici, il doit manquer l'incrément de fc, j'ai essayé break mais ça produit une erreur "Runtime error <type 'exceptions.RuntimeError'>: Object: Error in executing tool"
Les incréments sont "automatiques" dans les boucles "for in" en Python.
A+
Franck
Hors ligne
#3 Mon 24 November 2014 09:33
- Samy-DT
- Participant assidu
- Date d'inscription: 5 Apr 2011
- Messages: 211
Re: python : incrémenter une classe d'entité
Bonjour,
Le problème ne venait pas de l'indentation (le copier/coller était mal fait), ni de l'incrément. En fait il fallait que je rajoute le count dans le nom du jeu de sortie car sinon, il y avait deux fois la création d'une couche d'un même nom et ça faisait planter.
J'en profite pour prolonger le sujet avec une autre question relative à ce code (si les modérateurs sont d'accord).
Avant de faire le découpage, je dois en fait vérifier que la géométrie de ma couche vecteur courante (fc) intersecte bien l'entité de la couche de découpe courante (row).
Sous ArcGIS 10, il semble exister une méthode à base de MakeFeatureLayer -> SelectFeatureByLocation ->CopyFeature -> GetRowCount -> if RowCount > 0
http://gis.stackexchange.com/questions/ … with-arcpy
Ma question, qui est la même que celle du post ci-dessous, est de savoir s'il n'existe pas quelque chose de plus simple type : if overlap == true do
et ce, que ce soit dans arcgis 10 ou au dessus.
A+
Hors ligne
#4 Mon 24 November 2014 10:59
Re: python : incrémenter une classe d'entité
(si les modérateurs sont d'accord).
L'idéal de manière générale est de créer un nouveau sujet + un nouveau titre avec un lien vers ce sujet si besoin
Ca évite les fils "assistance personnalisée pour untel"
Hors ligne
#5 Mon 24 November 2014 12:16
- Samy-DT
- Participant assidu
- Date d'inscription: 5 Apr 2011
- Messages: 211
Re: python : incrémenter une classe d'entité
C'est vrai, mais plus compliqué pour celui qui veut voir le résultat final du débogage et éventuellement réutiliser le script.
Mais je m'exécute et je crée un nouveau sujet
Hors ligne