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

 

Pied de page des forums

Powered by FluxBB