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 3 sur 3
  1. #1

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

    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 :	27 
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
    985

    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
    62

    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

 

 

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
  •