#1 Sat 30 March 2019 08:39
- louloupzh18
- Participant occasionnel
- Lieu: Le Mans
- Date d'inscription: 9 Apr 2015
- Messages: 11
Accelérer exécution d'un script
Bonjour à tous,
Je cherche actuellement à réaliser des scripts directement dans la console python de mon arcgis 10.2.2. Or, le temps d’exécution est très long, j'aimerai pouvoir accélérer la durée de traitement.
Code:
POINTS = "POINTS" LIGNES = "LIGNES" liste = [] i = 0 #Boucle sur tous les Points with arcpy.da.SearchCursor("POINTS",["REFERENCE", "INSEE"]) as cursor: for row in cursor: arcpy.SelectLayerByAttribute_management("POINTS", where_clause='"REFERENCE" = ' + "'%s'" %row[0]) arcpy.SelectLayerByLocation_management ("LIGNES", "INTERSECT", "POINTS") with arcpy.da.SearchCursor("LIGNES",["OBJECTID", "OBJECTID"]) as cursor2: for row2 in cursor2: arcpy.SelectLayerByAttribute_management("LIGNES", where_clause="OBJECTID = " + str(row2[0])) arcpy.SelectLayerByLocation_management ("POINTS", "INTERSECT", "LIGNES") with arcpy.da.SearchCursor("POINTS",["REFERENCE", "INSEE"]) as cursor3: for row3 in cursor3: arcpy.SelectLayerByAttribute_management("POINTS", where_clause='"REFERENCE" = ' + "'%s'" %row[0]) if str(row[0]) != str(row3[0]) : liste.append(str(row[0]) + ";" + str(row3[0])) #print(liste) if i > 0 : if liste[i] != liste[i - 1] : print(str(row[0]) + ";" + str(row3[0]) + ";" + str(row2[1])) i = i + 1 else : i = i + 1 else : print(str(row[0]) + ";" + str(row3[0]) + ";" + str(row2[1])) i = i + 1
Voici mon code. Pour faire simple, j'ai des points et les lignes qui ont chacun des références. Je cherche à ressortir toutes les différentes lignes en les désignant par : la référence du point A, la référence du point B et l'OBJECTID de la ligne.
Ce script fonctionne parfaitement mais il est très long :
- nb de lignes : 95
- nb de points : 74
- Durée du script : 06min20sec
Avez-vous une idée pour permettre au script de s’exécuter de manière plus rapide ? Est-ce que le fait d'exporter les résultats directement en .csv plutôt que de les afficher dans la console me ferait gagner beaucoup de temps ? Dois-je passer par ArcCatalog ?
Merci d'avance pour voter aide
LoulouPzH
Dernière modification par louloupzh18 (Sat 30 March 2019 08:39)
Hors ligne
#2 Tue 02 April 2019 20:42
- carteq
- Participant assidu
- Date d'inscription: 8 Mar 2008
- Messages: 829
Re: Accelérer exécution d'un script
Obtenir ce résultat en SQL prendrait sûrement moins de 5 secondes pour si peu d'entités. Il y a sûrement moyen d'optimiser. Je vais essayer sans SQL si j'ai un peu de temps.
Hors ligne
#3 Wed 10 April 2019 07:54
- JPr31
- Participant occasionnel
- Date d'inscription: 7 Jun 2012
- Messages: 15
Re: Accelérer exécution d'un script
Essaye d'utiliser les dictionnaires plutôt que les listes. Plus efficace en python
Hors ligne
#4 Fri 12 April 2019 16:57
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: Accelérer exécution d'un script
Bonjour,
si je comprends bien, pour chaque ligne le code donne les références des 2 points d'extrémité.
Ne serait pas plus judicieux de faire une jointure spatiale de la couche ligne sur la couche point en mode "ONE TO MANY".
Ca fait la même chose que la fonction "arcpy.SelectLayerByLocation_management" sauf qu'elle ne s’exécute qu'une seule fois pour donner un shape de résultat complet avec tous les éléments.
détail ici : https://www.sigterritoires.fr/index.php … attributs/
Après s'il faut vraiment le faire en python ou l'intégrer dans un code, la fonction de jointure est accessible sous arcpy : arcpy.SpatialJoin_analysis(...)
L'autre solution qui existe aussi pour accélérer les traitements c'est au lieu d’exécuter le script python dans l'IDLE d'Argcis, c'est de l’exécuter dans la console windows, arcgis fermé.
A+
Nicolas GRANIER
Hors ligne
#5 Sun 14 April 2019 12:15
- Cornet Jérémie
- Participant assidu
- Lieu: Nouméa
- Date d'inscription: 6 Apr 2008
- Messages: 229
Re: Accelérer exécution d'un script
Bonjour,
A l'aide d'un 1er curseur, stocker dans un dictionnaire les références des points avec comme clé une concaténation des X/Y (ou le wkt du point).
Ensuite, curseur sur les lignes et récupérer dans le dico les références des points de début et de fin de la ligne.
Hors ligne
#6 Fri 19 April 2019 20:39
- louloupzh18
- Participant occasionnel
- Lieu: Le Mans
- Date d'inscription: 9 Apr 2015
- Messages: 11
Re: Accelérer exécution d'un script
Merci a tous pour vos réponses, ca me donne quelques pistes vers lesquelles je devrait me pecher pour la suite ?
Pour info je suis finalement passé par ArcCatalog, tout en gardant le fonctionnement par liste que je maîtrise bien plus que les dictionnaires ?
Je suis ainsi passé de 6 min a 10 secondes de traitement donc parfait ?
Merci encore pour votre aide.
Louloupzh18
Hors ligne