#1 Thu 09 December 2010 09:56
- Vincent87
- Participant actif
- Date d'inscription: 26 Jun 2006
- Messages: 113
Traitement par Lots
Bonjour à tous,
Petit besoin sur une question dont je ne trouve pas la réponse.
Je souhaite lancer sur une arborescence comptant 200 dossiers contenant 20 shapes chacun, l'outil de correction de géométrie se trouvant dans mon arctoolbox préféré. Afin de corriger tous les shapes avant un import.
Soucis je ne sais comment faire, et n'ai pas trouvé de reponse par mes propres recherches.
La solution serait de tout faire à la main...mais j'en ai pour une éternité...le traitement par lots même long serait largement plus confortable pour moi ^^
Si l'un d'entre vous à déjà fait se genre de manipulation je suis preneur !
Merci de votre aide.
Hors ligne
#2 Thu 09 December 2010 10:20
- n314
- Participant assidu
- Date d'inscription: 6 Sep 2005
- Messages: 706
Re: Traitement par Lots
En réponse one shot rapide:
1) regarder la syntaxe de l'outil en ligne de commande correction de géométrie
2) lister les shapes (avec leur chemin d'accès): sous dos utiliser dir avec l'argument /s et le filtre *.shp, le tout redirigé (signe >) dans une fichier texte (ex: http://stackoverflow.com/questions/2376801)/recursive-directory-listing-in-dos)
3) sous un tableur, créer assembler syntaxe et liste des fichier pour créer la liste des commandes
4) copier/coller cette liste et boire un café.
Dernière modification par n314 (Thu 09 December 2010 10:21)
Hors ligne
#3 Thu 09 December 2010 10:59
- Vincent87
- Participant actif
- Date d'inscription: 26 Jun 2006
- Messages: 113
Re: Traitement par Lots
merci du coups de pouce je vais regarder ça de près !
Hors ligne
#4 Thu 09 December 2010 13:27
- gglafouine
- Participant actif
- Lieu: Montpellier
- Date d'inscription: 28 Feb 2006
- Messages: 118
Re: Traitement par Lots
Salut, la arctoolbox ne fait pas de dos si je ne m'abuse....
Lister récursivement en dos c'est pas très adapté mais en python j'avais tester un truc pour tous intégrer en géodatabase personnel à partir de la racine d'un répertoire.
voilà le script python:
Code:
# -*- coding:Latin1 -*- #Import Standard library modules import sys, os try: #pour les utilisateurs ArcGIS 9.2/9.3 import arcgisscripting gp = arcgisscripting.create() print "\n" + "Utilisation de ArcGIS 9.2 ou supérieure avec arcgisscripting..." + "\n" gp.AddMessage("\n" + "Utilisation de ArcGIS 9.2 ou supérieure avec arcgisscripting..." + "\n") except: #pour les utilisateurs ArcGIS 9.0/9.1 import win32com.client gp = win32com.client.Dispatch("esriGeoprocessing.GpDispatch.1") print "\n" + "Utilisation de ArcGIS 9.0/9.1 ou supérieure avec win32com.client.Dispatch..." + "\n" gp.AddMessage("\n" + "Utilisation de ArcGIS 9.0/9.1 ou supérieure avec win32com.client.Dispatch..." + "\n") def listFiles(dir_name, subdir, *args): '''Return a list of file names found in directory 'dir_name' If 'subdir' is True, recursively access subdirectories under 'dir_name'. Additional arguments, if any, are file extensions to match filenames. Matched file names are added to the list. If there are no additional arguments, all files found in the directory are added to the list. Example usage: fileList = dirEntries(r'H:\TEMP', False, 'txt', 'py') Only files with 'txt' and 'py' extensions will be added to the list. Example usage: fileList = dirEntries(r'H:\TEMP', True) All files and all the files in subdirectories under H:\TEMP will be added to the list. ''' fileslist = [] for file in os.listdir(dir_name): dirfile = os.path.join(dir_name, file) if os.path.isfile(dirfile): if not args: fileslist.append(dirfile) else: if os.path.splitext(dirfile)[1][1:] in args: fileslist.append(dirfile) # recursively access file names in subdirectories elif os.path.isdir(dirfile) and subdir: print "Accès au répertoire :", dirfile fileslist.extend(listFiles(dirfile, subdir, *args)) return fileslist # MAIN if __name__ == '__main__': # Allow output file to be overwritten if it already exists gp.OverwriteOutput = 1 #Arguments #startdir = sys.argv[1]#à l'ancienne startdir = gp.getparameterastext(0) 'localisation racine subdir = gp.getparameterastext(1) 'true pour la récursivité #startdir = "D:\temp" #subdir = True filetype = 'shp' #filtre de type d'extension à prendre en compte dans le listing try: print "*"*10 print "Processus : conversion des shapes contenu dans \n" + startdir gp.AddMessage("*"*10) gp.AddMessage("Processus : conversion des shapes contenu dans \n" + startdir) #Lister des fichiers à insérer en base myFileList = [] myFileList = listFiles(startdir, subdir, filetype); #Recupere l espace de travail for f in myFileList: filepath = os.path.dirname(f); filename = os.path.basename(f).split(".")[0]; fileext = os.path.basename(f).split(".")[1]; #traitement sur le fichier print "export du fichier :", os.path.basename(f) gp.AddMessage("export du fichier :" + os.path.basename(f)) gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/[b]TOOLBOX.tbx[/b]") [b]ici ton traitement[/b] print "Processus : Fin du traitement" print "*"*10 gp.AddMessage("Processus : Fin du traitement") gp.AddMessage("*"*10) except: gp.AddMessage(gp.GetMessages(2)) print gp.GetMessages(2)
comme ça tous sera intégrer dans arc catalogue
Dernière modification par gglafouine (Thu 09 December 2010 13:28)
Jérôme
Hors ligne
#5 Thu 09 December 2010 14:02
- Vincent87
- Participant actif
- Date d'inscription: 26 Jun 2006
- Messages: 113
Re: Traitement par Lots
le python je maitrise pas trop trop donc je vais galérer mais je vais jeter un coups d'oeil quand même !
Merci ^^
Hors ligne
#6 Thu 09 December 2010 14:26
Re: Traitement par Lots
Hello,
Beaucoup plus simple, si on parle bien de cet outil :
1. Tu ouvres l'outil de recherche windows, et tu lances sur l'ensemble de tes 200 répertoires une recherche de *.shp
2. Tu clic droit sur l'outil dans l'arctoolbox et tu sélectionnes "traitement par lot" (ou un truc équivalent à Batch en anglais)
[img]http://img526.imageshack.us/img526/433/batch.jpg[/img]
3. Tu sélectionnes tous tes résultats de recherche et tu les déplaces dans ta boite de traitement par lot (la souris devrait avoir une icone spécifique avec un "+")
Et hop, il n'y a plus qu'à envoyer
Hors ligne
#7 Thu 09 December 2010 14:34
- gglafouine
- Participant actif
- Lieu: Montpellier
- Date d'inscription: 28 Feb 2006
- Messages: 118
Re: Traitement par Lots
Perso, je dirai que la maitrise arrive seulement en pratiquant.
Il y a des doc sur comment mettre en place un géotraitement sur le net en utilisant arcgisscripting.
C'était mon premier script.... donc je peux dire que c'est accessible et polyvalent et que ça évite d'utiliser un processus manuel et donc d'insérer d'éventuelle erreur de manipulation.
ps : avec python tu peux tous exécuter sans lancer Arcatalog ou Arcmap. C'est pratique quand tu n'as pas énormément de ressource mémoire ou qui tu veux faire des traitements programmés.
Jérôme
Hors ligne
#8 Thu 09 December 2010 14:47
- Vincent87
- Participant actif
- Date d'inscription: 26 Jun 2006
- Messages: 113
Re: Traitement par Lots
merci Robin pour cette astuce, je test de suite.
GGlafouine ouaip je sais que l'on devient forgeron en forgeant alors je vais m'y mettre petit à petit ^^
Merci de votre aide !
Hors ligne
#9 Thu 09 December 2010 14:51
- n314
- Participant assidu
- Date d'inscription: 6 Sep 2005
- Messages: 706
Re: Traitement par Lots
Hello,
Beaucoup plus simple, si on parle bien de cet outil :
1. Tu ouvres l'outil de recherche windows, et tu lances sur l'ensemble de tes 200 répertoires une recherche de *.shp
2. Tu clic droit sur l'outil dans l'arctoolbox et tu sélectionnes "traitement par lot" (ou un truc équivalent à Batch en anglais)
http://img526.imageshack.us/img526/433/batch.jpg
3. Tu sélectionnes tous tes résultats de recherche et tu les déplaces dans ta boite de traitement par lot (la souris devrait avoir une icone spécifique avec un "+")
Et hop, il n'y a plus qu'à envoyer
ca revient au même que ma propostition mais c'est effectivement plus simple...
Hors ligne
#10 Thu 09 December 2010 15:51
Re: Traitement par Lots
Je faisais référence au codage surtout. Le coup de la recherche windows qui est commun à nos deux méthodes est très pratique, mais ta méthode via Excel est plus adaptée lorsqu'il y a passage de paramètres différents en fonction des fichiers et pour les requêtes plus complexes passées via la boîte de commandes (qui me fait penser à la fenêtre Mapbasic, d'ailleurs ).
Dans le cas de cet outil en particulier, il n'y a rien à indiquer spécifiquement, c'est la principale différence
Hors ligne
#11 Thu 09 December 2010 16:23
- n314
- Participant assidu
- Date d'inscription: 6 Sep 2005
- Messages: 706
Re: Traitement par Lots
Je faisais référence au codage surtout. Le coup de la recherche windows qui est commun à nos deux méthodes est très pratique, mais ta méthode via Excel est plus adaptée lorsqu'il y a passage de paramètres différents en fonction des fichiers et pour les requêtes plus complexes passées via la boîte de commandes (qui me fait penser à la fenêtre Mapbasic, d'ailleurs ).
Dans le cas de cet outil en particulier, il n'y a rien à indiquer spécifiquement, c'est la principale différence
pas de critique dans mon propos et entièrement d'accord avec ta proposition... A force d'avoir à faire des choses complexes, on en oublie la simplicité!
Hors ligne