Bienvenue! Inscrivez-vous et rejoignez notre communaut :)
  • Login:

Bienvenue sur Forum SIG - Systmes d'Information Gographique et Gomatique.

Bienvenue sur le forumSIG. S'il s'agit de votre premire visite, assurez vous de faire une recherche pralable dans les FAQ SIG. Vous devez vous inscrire avant de pouvoir poster.

Affichage des rsultats 1 9 sur 9
  1. #1

    Date d'inscription
    avril 2015
    Emploi
    Charg d'tude
    Messages
    68

    Par dfaut Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    Bonjour tous,

    Je viens vers vous car je rencontre un problme lors de la rdaction de mon script.

    Pour commencer, voici la situation de mes donnes :

    Cliquez sur l'image pour la voir en taille relle 

Nom : 		DONNEES.jpg 
Affichages :	62 
Taille :		25,2 Ko 
ID : 			8693

    Donnes d'entres :
    - Routes (2 types : lignes secondaires et ma route principale slectionne en bleu)
    - Carrefours (points turquoises)
    - Adresses (points bleus)

    Le but de mon script est qu'en renseignant l'ID de ma route principale (ici il y en a qu'une), le script m'indique le nombres de routes secondaires qui intersectent mes carrefours le long de cette route principale. Si par exemple 3 lignes secondaires intersectent mon carrefour, je veux ajouter un champ "NB_lignes_sec" ma couche CARREFOURS avec le nombre d'intersections entre ces deux couches.

    Sur l'exemple illustr ci-dessus, j'aurai donc ma couche CARREFOURS avec un nouveau champs "NB_lignes_sec" qui va avoirs 3 valeurs : 5, 1 et 3.

    Voici le script que j'ai implment jusque l :

    Code:
    import arcpy.mapping as mapping
    
    mxd = mapping.MapDocument("CURRENT")
    mxd.title = "ROUTES"
    df = arcpy.mapping.ListDataFrames(mxd, "*")[0]
    idRoutePrincipale = arcpy.GetParameter(0)
    
    
    
    
    layers = mapping.ListLayers(mxd)
    
    
    for fts in layers :
        if fts.name == "CARREFOURS":
            arcpy.AddField_management ("CARREFOURS", "NB_lignes_sec", "LONG",1)
    
    
    #2 : Selection des cables de desserte
    
    
    for layer in layers :
        if layer.name == "ROUTES":
            query = '"type" = '+ str(2) #Les routes secondiares ont comme "type" "2"
            layer.definitionQuery=query
            with arcpy.da.SearchCursor("CARREFOURS",("OBJECTID")) as cursor:
                for row in cursor:
                    selection_routesSecondaires=arcpy.SelectLayerByLocation_management ("ROUTES", "intersect", "CARREFOURS")
                    cnt = arcpy.GetCount_management(selection_routesSecondaires)
                    print(cnt)
    Le script ainsi excut me slectionne l'ensemble des entits de la couche ROUTES qui intersectent ma couche CARREFOURS alors que seuls les routes de type "2" sont destines tre slectionnes en boucle pour chaque carrefour.

    RESULTAT :
    9
    9
    9

    Avez-vous une ide de la manire dont je dois m'y prendre pour raliser cela ?

  2. #2
    Quasi-modo Supporter(rice)

    Date d'inscription
    octobre 2008
    Messages
    998

    Par dfaut Re : Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    Bonjour,
    Si le script n'a pas vocation a tre paramtr, je conseillerai de le simplifier.
    ensuite les definition querry peuvent se matrialiser par une whereclause en crant une nouvelle layer
    (je pense plus stable que les defquerry qui peuvent ncessiter des refresh)

    Code:
    arcpy.AddField_management ("CARREFOURS", "NB_lignes_sec", "LONG",1)
    arcpy.MakeFeatureLayer_management("ROUTE", "routeLyr, '"type" = 2')
    with arcpy.da.SearchCursor("CARREFOURS",("OBJECTID")) as cursor:
                for row in cursor:
                    # Ici slectionner le carrefour en question !!! sinon toute la couche est prise en compte !!!
                    arcpy.SelectLayerByAttribute_management("CARREFOURS", where_clause="OBJECTID = " + str(row[0]))
                    arcpy.SelectLayerByLocation_management ("routeLyr", "intersect", "CARREFOURS")
                    cnt = arcpy.GetCount_management("routeLyr")
                    print(cnt)
    Aprs ton code peut sans doute trs bien fonctionner mais en terme de perf, je pense que c'est mieux de passer par des feature layer et slections plutt que par des querryfilter
    Mais le soucis principal c'est qu'il te manque la ligne qui slectionne le carrefour de la row.
    "Les sig, c'est la balle !"
    Joey StarApic et Kool Shape du groupe MNT
    Album: Laisse pas trainer ton TIN

  3. #3

    Date d'inscription
    avril 2015
    Emploi
    Charg d'tude
    Messages
    68

    Par dfaut Re : Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    Merci beaucoup pour cette rponse c'est clair, net et prcis

    En ce qui concerne le "where_clause" je ne l'avais jamais utilis auparavant, je pense que je vais en effet m'y intresser plus srieusement lorsque je veux effectuer mes requtes.
    Ayant l'habitude de raliser mes scripts via Qgis, j'ai encore un peu de mal avec les fonctions d'arcpy et mon script reste trs brouillon, mme si fonctionnel.

    Sinon,en effet il me manquait bien la ligne qui permet de slectionner une entit de "row" , j'aurai pourtant du le savoir depuis le temps
    Merci en tout cas

  4. #4

    Date d'inscription
    avril 2015
    Emploi
    Charg d'tude
    Messages
    68

    Par dfaut Re : Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    Bonjour tous,

    je me permets de r-ouvrir ce sujet car le problme se pose encore moi aujourd'hui.

    La rponse que Speed-Popeye m'avait apport l'poque m'a beaucoup aid et je m'en tais content. Par contre, aujourd'hui je dois simplement crire ma valeur "cnt" dans ma table, afin de mettre jour mon champ "nb_routes" cr auparavant. Or, j'ai toujours une erreur et aprs avoir cherch pendant plusieurs jours je suis cours d'ides.. Auriez-vous une solution m'apporter ?

    Voici mon bout de code, qui pour moi devrait fonctionner sans trop de problmes pourtant :

    Code:
    arcpy.AddField_management ("CARREFOURS", "Nb_routes", "LONG", 1)
    arcpy.MakeFeatureLayer_management("ROUTE", "routeLyr", '"type" = 2')
    with arcpy.da.SearchCursor("CARREFOURS",("OBJECTID")) as cursor: 
        for row in cursor: 
            # Ici slectionner le carrefour en question !!! sinon toute la couche est prise en compte !!! 
            arcpy.SelectLayerByAttribute_management("CARREFOURS", where_clause="OBJECTID = " + str(row[0])) 
            arcpy.SelectLayerByLocation_management ("routeLyr", "intersect", "CARREFOURS") 
            cnt = arcpy.GetCount_management("routeLyr") 
            arcpy.CalculateField_management ("CARREFOURS", "Nb_routes", cnt, "VB", "")


    Voici l'erreur que j'obtiens tout le temps :
    Code:
    Runtime error  Traceback (most recent call last):   File "<string>", line 9, in <module>   
    File "c:\program files (x86)\arcgis\desktop10.2\arcpy\arcpy\management.py", line 3354, in CalculateField     
    raise e ExecuteError: ERROR 999999: Erreur lors de lexcution de la fonction. 
    Impossible dacqurir un verrouillage. Impossible dacqurir un verrouillage. chec de lexcution de (CalculateField).
    Pas beaucoup d'infos sur la toile ce sujet donc si quelqu'un dj rencontr ce problme, je suis tout oue Merci d'avance pour votre aide

  5. #5
    Quasi-modo Supporter(rice)

    Date d'inscription
    octobre 2008
    Messages
    998

    Par dfaut Re : Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    Bonjour,
    Impossible d’acqurir un verrouillage : cela signifie que la classe d'entit est locke.
    Il faut librer les locks en fermant les sessions d'edition en cours, voire en fermant arcmap si inutile.
    "Les sig, c'est la balle !"
    Joey StarApic et Kool Shape du groupe MNT
    Album: Laisse pas trainer ton TIN

  6. #6

    Date d'inscription
    mars 2006
    Localisation
    Paris
    Emploi
    Carto
    Messages
    539

    Par dfaut Re : Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    slt,

    tu peux peut tre trouv des solutions ici https://pro.arcgis.com/fr/pro-app/ar...onnectuser.htm

    tu peux tester si des utilisateurs sont connects et les dconnects

    Code:
    adminConnection = r'Database Connections\example.sde' 
    connected_users = arcpy.ListUsers(adminConnection)
    
    arcpy.DisconnectUser(adminConnection, "ALL")
    attention !! le ALL dconnecte tous les utilisateurs...tu peux aussi crer une liste d’utilisateurs dconnecter...
    Dernire modification par bernards111 ; 29/01/2018 10h27.
    Il est aussi difficile de se voir soi mme que de regarder en arrire sans se retourner

  7. #7

    Date d'inscription
    avril 2015
    Emploi
    Charg d'tude
    Messages
    68

    Par dfaut Re : Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    Citation Envoy par Speed-Popeye Voir le message
    Bonjour,
    Impossible dacqurir un verrouillage : cela signifie que la classe d'entit est locke.
    Il faut librer les locks en fermant les sessions d'edition en cours, voire en fermant arcmap si inutile.
    C'est ce que j'avais vu en regardant sur Internet oui effectivement. Mais mme en fermant Arcmap, en stoppant les processus et en enlevant les couches je tombe toujours sur ce message d'erreur :/ Bien entendu, j'ai galement essay en redmarrant le PC, rien ne fonctionne.

    Merci quand mme pour cette piste.

    Citation Envoy par bernards111 Voir le message
    slt,

    tu peux peut tre trouv des solutions ici https://pro.arcgis.com/fr/pro-app/ar...onnectuser.htm

    tu peux tester si des utilisateurs sont connects et les dconnects

    Code:
    adminConnection = r'Database Connections\example.sde' 
    connected_users = arcpy.ListUsers(adminConnection)
    
    arcpy.DisconnectUser(adminConnection, "ALL")
    Je ne connaissais pas cette fonction, a pourra me servir pour plus tard. Malheureusement, pour l'exemple donn ici je n'utilise pas de SDE, j'ai export les donne en local afin d'viter justement tous ces problmes.
    Je garde la solution mais cela ne m'aidera malheureusement pas pour ce problme.

    Merci pour vos rponses, je continue de chercher.

  8. #8

    Date d'inscription
    mars 2006
    Localisation
    Paris
    Emploi
    Carto
    Messages
    539

    Par dfaut Re : Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    slt,


    Utilise l'outil compacter sur ta geodatabase...http://desktop.arcgis.com/fr/arcmap/...nd-locking.htm

    essaye de le calculer en python plutt que en VB..... arcpy.CalculateField_management ("CARREFOURS", "Nb_routes", cnt, "PYTHON_9.3", "")
    Il est aussi difficile de se voir soi mme que de regarder en arrire sans se retourner

  9. #9

    Date d'inscription
    avril 2015
    Emploi
    Charg d'tude
    Messages
    68

    Par dfaut Re : Boucle sur le nombre d'entits qui intersectent chaque lment d'une couche

    Citation Envoy par bernards111 Voir le message
    slt,Utilise l'outil compacter sur ta geodatabase...http://desktop.arcgis.com/fr/arcmap/...nd-locking.htmessaye de le calculer en python plutt que en VB..... arcpy.CalculateField_management ("CARREFOURS", "Nb_routes", cnt, "PYTHON_9.3", "")
    Bonjour Bernards,Merci de prendre le temps de m'aider. Malheuresement, je viens de tester cela ne fonctionne toujours pas, j'obtiens le message suivant : Runtime error Traceback (most recent call last): File "", line 35, in File "c:\program files (x86)\arcgis\desktop10.2\arcpy\arcpy\management.py ", line 3354, in CalculateField raise e ExecuteError: ERROR 999999: Erreur lors de lexcution de la fonction. Impossible dacqurir un verrouillage. Impossible dacqurir un verrouillage. chec de lexcution de (CalculateField).Je continue de chercher ...

 

 

Discussions similaires

  1. [ArcGIS 10.x] Cration d'un outil pour slectionner des entits pour chaque polygones d'une couche
    Par Yennaiv dans le forum Assistance Technique
    Rponses: 2
    Dernier message: 27/06/2014, 14h32
  2. [QGIS 2.x] Mettre le nombre de points de chaque chaque entit dans la lgende
    Par Alexis86 dans le forum Assistance et Programmation
    Rponses: 1
    Dernier message: 02/06/2014, 15h10
  3. [ArcGIS 9.x] Gnrer une boucle pour selectionner des entits
    Par depdep dans le forum Assistance Technique
    Rponses: 0
    Dernier message: 28/03/2011, 16h03
  4. [VBA Excel] Boucles et boucle et boucle et ... Tiens, une boucle!
    Par Speed-Popeye dans le forum Assistance Logiciel
    Rponses: 9
    Dernier message: 17/06/2010, 10h22
  5. [ArcGIS 9.x] Visualisation d'entits dans une boucle
    Par eoux dans le forum Programmation
    Rponses: 9
    Dernier message: 10/04/2009, 08h33

Les tags pour cette discussion

Liens sociaux

Rgles de messages

  • Vous ne pouvez pas crer de nouvelles discussions
  • Vous ne pouvez pas envoyer des rponses
  • Vous ne pouvez pas envoyer des pices jointes
  • Vous ne pouvez pas modifier vos messages
  •