Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Le portail retrouve peu à peu ses fonctionnalités.

Les listes ne fonctionnent pas mais nous mettons tout en oeuvre pour les réactiver rapidement.

Si vous avez pris contact avec l'association (petite enveloppe en haut/droite), sachez que nous lisons vos messages mais que les mails ne partent pas (#bug).

Ne soyez pas surpris si vous ne recevez pas de réponse.

#1 Sat 30 March 2019 08:39

louloupzh18
Membre
Date d'inscription: 9 Apr 2015
Messages: 7

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
Membre
Lieu: Côte-Nord, Québec
Date d'inscription: 8 Mar 2008
Messages: 610

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.


Vincent Fréchette
Responsable de la géomatique
Boisaco inc.

Hors ligne

 

#3 Wed 10 April 2019 07:54

JPr31
Membre
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
Membre
Date d'inscription: 19 Apr 2007
Messages: 260

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
Membre
Lieu: Nouméa
Date d'inscription: 6 Apr 2008
Messages: 218

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
Membre
Date d'inscription: 9 Apr 2015
Messages: 7

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

Partagez  |