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
    mai 2006
    Emploi
    Topo-Sigiste
    Organisme
    Comm d'Agglo
    ge
    38
    Messages
    84

    Question Vrification/Rparation d'une classe d'entit ligne par ligne

    Bonjour,

    Cadre
    Je dispose d'une classe d'entits avec environ 8000 enregistrements avec de gros problmes de gomtries. Cre via ArcSDE sous Oracle, la validation automatique n'a pas vit des dizaines/centaines(/milliers? ) d'erreurs de gomtrie. Certaines, doivent pourvoir tre rpares par l'outil ddi... mais certaines le font planter. Lors de l'utilisation de l'outil vrifier, la table gnre est ternellement vide.

    But
    Je voudrais donc pouvoir lancer lancer une vrification/rparation, mais avec un affichage interactif de l'OBJECTID au fur et mesure du traitement. Ainsi,mme si le traitement plante, je saurais sur quel enregistrement, et je pourrai l'isoler dans une autre CE et d'un ct avoir une CE qui se valide et de l'autre une CE avec avec toutes mes entits pourries reprendre la mano.


    Petite prcision
    je suis un gros noob du de la cration du script Python, mme si j'ai des bases thoriques.


    Concept
    (ouais c'est un peu pompeux)
    Je pense utiliser un curseur pour travailler ligne par ligne.
    Un SearchCursor, si j'utilise l'outil de vrification (arcpy.CheckGeometry_management) devrait suffire?
    Lors de mes formations, on n'avait pas abord les curseurs avec le "nouveau" module d'accs aux donnes (arcpy.da). J'imagine que j'ai intrt l'utiliser ?
    Ensuite, de ce que je comprends, que j'utilise arcpy.CheckGeometry_management ou arcpy.RepairGeometry_management, dans tout les cas, je dois passer (une CE ou) une couche en argument.
    Est ce bien le cas ou est ce qu'il y a moyen de ne passer qu'une ligne directement avec un truc du style : arcpy.CheckGeometry_management(ce_a_tester.row, table)?



    Embryon de code
    Code:
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #
    # Vrification (sans correction) des gomtries
    #
    
    # Import modules
    import arcpy
    
    print("Initialisation ...")
    
    # Initialisation des variables
    
    # criture des chemins:
    # Avec antislash simple, lu dans ArcGIS mais pas dans PyScripter
    # Avec antislash double, lu dans ArcGIS et dans PyScripter
    # Avec slash simple, pas lu dans ArcGIS mais lu dans PyScripter
    
    arcpy.env.workspace = "D:\\99_Tmp\\1_Operations\\18033_641_Seraucourt_F\\SIG\\RecupSDE\\OA0610473_20180716.gdb"
    ce_cassee = "OA0610473__Habillage_Pgn"
    lyr_a_tester = 'temp_layer'
    
    print("Initialisation OK")
    
    # Cration du curseur de recherche
    print(u"Cration du curseur")
    rows = arcpy.da.SearchCursor(ce_cassee, ['OID@','SHAPE@'])
    #rows = arcpy.SearchCursor(ce_cassee)
    
    # Pour chaque ligne on affiche le numro et on vrifie la gomtrie
    print("Lancement du traitement ligne par ligne...")
    for row in rows:
        print "Traitement de l'enregistrement : ",row[0]
        # oid = row.OBJECTID
        # print "Traitement de l'enregistrement : ",oid
    
        # suppression d'une ventuelle couche lyr_a_tester rsiduelle
    
        if arcpy.Exists(lyr_a_tester):
            print "Suppression couche temporaire rsiduelle"
            arcpy.Delete_management(lyr_a_tester)
    
        # Cration d'une couche lyr_a_tester
        where_clause = 'OBJECTID = ' + str(row[0])
        # where_clause = 'OBJECTID = ' + str(oid)
        print u"Cration d'une couche temporaire avec la clause : ",where_clause
        arcpy.MakeFeatureLayer_management(ce_cassee, lyr_a_tester, where_clause )
        print u"Couche cre"
    
        # Contrle de l'entit
        #  arcpy.CheckGeometry_management(lyr_a_tester, "TableControle")
        # Rparation de l'entit
        # arcpy.RepairGeometry_management (ce_cassee.row, 1)
    
    #Suppression du curseur pour enlever le verrou sur les enregistrements
    del row, rows
    
    print(u"Youpipy !")


    Dj je ne comprends pas, a bloque... mais pas toujours au mme endroit!
    L, c'est au moment de la cration de ma couche pour la premire entit... rien ne se passe. Alors qu'il n'y apas de problme sur cette entite!
    Quelqu'un aurait une meilleure mthode ou des indices me donner?

    - - MISE A JOUR - -

    (Je n'arrive pas diter mon message - pour rduire le nombre de commentaires abscons -, c'est normal??)

  2. #2

    Date d'inscription
    mai 2006
    Emploi
    Topo-Sigiste
    Organisme
    Comm d'Agglo
    ge
    38
    Messages
    84

    Par dfaut Re : Vrification/Rparation d'une classe d'entit ligne par ligne

    Comme je n'arrive pas diter le corps de mon message, je m'auto-rponds...

    J'ai russi faire un script qui fonctionne (enfin qui remplit mon objectif initial): il corrige les erreurs ligne par ligne, en affichant les OID. Du coup, quand il plante, je sais sur quelle OID il est (info que les outils de gotraitements ne me donnent pas sur ce type de plantage). Et je peux mettre en quarantaine cette entit pour la corriger ultrieurement.

    Un de mes problmes semblait venir du fait que je lanais mon script depuis PyScripter. Depuis que je le fait dans IDLE, c'est beaucoup moin sexy mon got, mais a focntionne beaucoup mieux, et de manire beaucoup plus ritrable.

    Ci-dessous la dernire version de mon script :
    Code:
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #
    # Reprage des gomtries foireuses
    #
    # Import modules
    import arcpy
    import time
    
    # Initialisation des variables
    print("Initialisation ...")
    hdeb = time.clock()
    
    arcpy.env.overwriteOutput =True
    arcpy.env.workspace = "D:\\99_Tmp\\OA0610473_20180716.gdb"
    ce_cassee = "OA0610473__Habillage_Pgn_OK"
    lyr_a_tester = 'temp_layer'
    hfin = time.clock()
    print "Initialisation faite en ", round(hfin-hdeb,3), " s"
    
    # Cration du curseur de recherche
    print(u"Cration du curseur")
    hdeb = time.clock()
    rows = arcpy.da.UpdateCursor(ce_cassee, ['OID@'])
    #rows = arcpy.SearchCursor(ce_cassee)
    hfin = time.clock()
    print u"Curseur cr en", round(hfin-hdeb,3), "s"
    
    # Pour chaque ligne on affiche le numro et on vrifie la gomtrie
    hdeb = time.clock()
    print("Lancement du traitement ligne par ligne...")
    for row in rows:
        print "Traitement de l'enregistrement : ",row[0]
        # oid = row.OBJECTID
        # print "Traitement de l'enregistrement : ",oid
    
        # suppression d'une ventuelle couche lyr_a_tester rsiduelle
    
        if arcpy.Exists(lyr_a_tester):
            # print u"Suppression couche temporaire rsiduelle"
            arcpy.Delete_management(lyr_a_tester)
    
        # Cration d'une couche lyr_a_tester
        where_clause = 'OBJECTID = ' + str(row[0])
        # where_clause = 'OBJECTID = ' + str(oid)
        # print u"Cration d'une couche temporaire avec la clause {}".format(where_clause)
        arcpy.MakeFeatureLayer_management(ce_cassee, lyr_a_tester, where_clause )
        # print u"Couche cre"
    
        # Contrle de l'entit
        # arcpy.CheckGeometry_management(lyr_a_tester, "TableControle")
        # Rparation de l'entit
        try:
            arcpy.RepairGeometry_management (lyr_a_tester, 1)
        except Exception as e:
            hfin = time.clock()
            print "Mother Fucker step reached in",round(hfin-hdeb,3),"s"
            print e
    
    #Suppression du curseur pour enlever le verrou sur les enregistrements
    del row, rows, lyr_a_tester
    
    hfin = time.clock()
    print(u"Youpipy*!")
    print u"a n'a pris que",round(hfin-hdeb,3),"s*!"
    Ce qui pourrait tre amlior:

    • la vitesse (c'est lent... peut-tre y a-t-il moyen de faire sans passer par une couche temporaire?)
    • la gestion de l'erreur finale (qui ne fonctionne pas)

  3. #3
    Chasseur de Bots
    Date d'inscription
    aot 2011
    Localisation
    Paris > Strasbourg
    Emploi
    Charg de mission SIG
    ge
    34
    Messages
    1 460

    Par dfaut Re : Vrification/Rparation d'une classe d'entit ligne par ligne

    Merci pour le suivi.

 

 

Discussions similaires

  1. [ArcGIS Server 10.x] [PYTHON] Copier-coller classe d'entit vers classe d'entit globale
    Par Vince71 dans le forum Programmation
    Rponses: 1
    Dernier message: 27/10/2015, 16h04
  2. [ArcGIS 10.x] Remplacer une classe d'entit dans une liste de classe d'entit
    Par Imas dans le forum Programmation
    Rponses: 0
    Dernier message: 17/12/2014, 08h45
  3. [Illustrator] Rparation de PDF/AI en ligne
    Par L.Jgou dans le forum Ressources
    Rponses: 2
    Dernier message: 25/10/2010, 12h01
  4. Rponses: 15
    Dernier message: 28/06/2009, 23h15
  5. [ArcGIS 9.x] Vrification de l'galit de 2 entits de type ligne
    Par Mehdi (EHTP) dans le forum Programmation
    Rponses: 0
    Dernier message: 21/05/2008, 19h28

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
  •