#1 Tue 17 May 2011 14:29
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
[GRASS]un script pour automatiser l'import pas à pas?
Bonjour a tous,
Je travail sur GRASS et je dois faire un import en masse d'orthophotos, comme je suis un peut féniant, je cherchais un moyen d'automatiser la chose. J'ai lu sur le forum et ailleurs qu'il était possible de le faire grâce a un script bach ou python... Je ne suis pas forcement bon donc je voulais vous demander de l'aide.
Donc, toutes mes orthophotos sont dans le même répertoire et sont au format .tif
Je ne maitrise pas les techniques de script bach ou python alors je me suis lancé dans le premier...
J'ai donc fais un petit fichier "import.sh" qui contient
Code:
#!/bin/sh # Author: moi, 17.mai.2011; copyright: GPL 3 # Purpose: Script to automatic impotation of rast in a same file i=1; echo $i; for $i<300 do echo 'r.in.gdal input=/Users/ElCep/Documents/DonnéesCarto/*.tif output=0687-$i'; i=i+1; done;
J'essaye ensuite de lancer la chose depuis GRASS mais je dois m'y prendre comme un pied...
Est ce que vous pourriez m'aider a comprendre parce que là ça doit pas être bon :-S
merci
------EDIT-----
J'ai en particulier trouvé une ressource intéressante sur ici
http://forumsig.hostforumsig.com/forum/ … hp?t=17532
j'ai donc fait un test avec le code suivant
Code:
#!/bin/sh for FILE in /Users/ElCep/Documents/DonnéesCarto/*.tif; do r.in.gdal -o input=$FILE output=${FILE%.tif} done
mais je n'arrive toujours pas a la faire fonctioner...
Dernière modification par jack tippit (Tue 17 May 2011 15:16)
Hors ligne
#3 Tue 17 May 2011 14:56
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
haha baobazz :-) oui pourquoi pas ... mais comment je peux m'y prendre?
Heu en y repensant, je ne peux pas les ouvrir tous en même temps dans Qgis ... ça plante la machine... :-S c'est pour ça que je voulais passer par grass...
------EDIT-----
c'est vrai Gdal le fait très bien je n'y avais pas pensé. Mais c'est l'occasion de se frotter à un script...
Dernière modification par jack tippit (Tue 17 May 2011 16:17)
Hors ligne
#4 Tue 17 May 2011 15:14
- Denis.Degez
- Participant actif
- Lieu: Marseille
- Date d'inscription: 19 May 2008
- Messages: 51
Re: [GRASS]un script pour automatiser l'import pas à pas?
Bonjour, j'ai ecrit il a peu une commande qui permet d'importer une série de tif, et de les recomposer (r.in.gdal et r.composite) ... xchez moi ça marche, par contre je n'ai pas été jusqu'à en faire une script, je copie simplement la coammande dans le shell :
1 - La version r.in.gdal seule :
for i in `find /path/ -type f -name *.TIF -printf "%f\n"` ; do j=${i/.TIF/} ; r.in.gdal -o --overwrite input=/path/$i output=$j
2- La version r.composite en plus :
for i in `find /path/ -type f -name *.TIF -printf "%f\n"` ; do j=${i/.TIF/} ; r.in.gdal -o --overwrite input=/path/$i output=$j ; g.region rast=$j.blue res=0.5; r.composite --overwrite red=$j.red blue=$j.blue green=$j.green levels=32 output=$j ; done
find permet de conserver le nom du fichier, et g.region permet de ne travailler que sur l'emprise du raster (la résolution est en mètres)
C'est une base à modifier bien sur ...
Je sers la science et c'est ma joie ...
Hors ligne
#5 Tue 17 May 2011 15:23
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
Bonjour Denis
merci pour ce début de piste. Est-ce que le code pourrait donner cela?
Code:
. for i in `find /Users/ElCep/Documents/DonnéesCarto/*.tif -type f -name *.TIF -printf "%f\n"` ; do j=${i/.TIF/} ; r.in.gdal -o --overwrite input=/Users/ElCep/Documents/DonnéesCarto/*.tif$i output=$j
J'ai un peu du mal à comprendre toutes les options est ce que tu pourrais me les expliquer?
Hors ligne
#6 Tue 17 May 2011 15:42
- Denis.Degez
- Participant actif
- Lieu: Marseille
- Date d'inscription: 19 May 2008
- Messages: 51
Re: [GRASS]un script pour automatiser l'import pas à pas?
A priori tu n'as pas besoin de repeter *tif dans la path (il est mentionné après "name", tu obtiendrais donc cela :
for i in `find /Users/ElCep/Documents/DonnéesCarto/ -type f -name *.tif
-printf "%f\n"` ;
do j=${i/.TIF/} ;
r.in.gdal -o --overwrite input=/Users/ElCep/Documents/DonnéesCarto/$i
output=$j : done
Je sers la science et c'est ma joie ...
Hors ligne
#7 Tue 17 May 2011 15:49
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
Merci Denis
Code:
#!/bin/sh # Author: moi , 17.mai.2011; copyright: GPL 3 # Purpose: Script to automatic impotation in GRASS (rast in a same file) for i in `find /Users/ElCep/Documents/DonnéesCarto/ -type f -name *.tif -printf "%f\n"` ; do j=${i/.TIF/} ; r.in.gdal -o --overwrite input=/Users/ElCep/Documents/DonnéesCarto/$i output=$j : done
Arg damnation une erreur... line 9: syntax error: unexpected end of file
:S
Hors ligne
#8 Tue 17 May 2011 15:53
- Sylvain_M
- Membre
- Lieu: Lyon
- Date d'inscription: 3 Aug 2009
- Messages: 298
Re: [GRASS]un script pour automatiser l'import pas à pas?
ATTENTION!
"/Users/ElCep/Documents/" indique que l'ordinateur tourne sous windows (à moins d'avoir un sysop vraiment tordu) ... il faut donc écrire un script en BATCH et non pas en BASH ou SH qui sont des shells légérements différents fonctionnant sous linux !!!
du coup les solutions à base de "find" ne devraient pas non plus fonctionner ...
voir par exemple http://www.hotline-pc.org/batch.htm pour des infos sur le fonctionnement de "echo" ou la manière de faire une boucle
Hors ligne
#9 Tue 17 May 2011 15:53
- Denis.Degez
- Participant actif
- Lieu: Marseille
- Date d'inscription: 19 May 2008
- Messages: 51
Re: [GRASS]un script pour automatiser l'import pas à pas?
Très brièvement le commentaire :
la commande find recherche un fichier (type -f) dont le nom est *.tif (name) , n'affiche que le nom du fichier et pas tout le chemin (printf "%f\n"), tu peux essayer sans pour voir la différence ...
do j=${i/.TIF/} : la commande commence par définir une variable j qui est égale à la variable i sans le motif (.TIF) j=${variable i/motif_de_i_a_remplacer/motif_de_remplacement} ...
En fait ça n'est pas obligatoire si tu enlèves cette première option, tes rasters Grass s'appelleront exactement pareil (machin.TIF) ce qui n'est pas idéal par la suite si tu souhaites effectuer des traitements qui touchent au vecteur (ex r.in.vect ...)
ensuite c'estla commande grass r.in.gdal calssique avce l'option --overwrite qui permet d'ecraser les fichier (il m'a fallu pas mal d'essais pour reussir , du coup j'ecrasais au fur et a mesure les fichiers crée ...
Je sers la science et c'est ma joie ...
Hors ligne
#10 Tue 17 May 2011 15:56
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
@Yarma hehe non pas sous windows, mais sous MacOSX et il me semble que find fonctionne donc... :-)
Hors ligne
#11 Tue 17 May 2011 16:14
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
Donc je continue avec mes problèmes :-)
Une nouvelle erreur : "ERROR: Name for output raster map not specified" donc il ne comprend pas la variable $j...
mais pourquoi?
Voilà mon code actuel
Code:
#!/bin/sh # Author: moi, 17.mai.2011; copyright: GPL 3 # Purpose: Script to automatic impotation in GRASS (rast in a same file) for i in `find /Users/ElCep/Documents/DonnéesCarto/ -type f -name *.tif `; do J=${i/.TIF/ } ; r.in.gdal -o --overwrite input=/Users/ElCep/Documents/DonnéesCarto/$i output=$j ; done
je pense que la solution n'est pas loin mais je ne la trouve pas.
Dernière modification par jack tippit (Tue 17 May 2011 16:15)
Hors ligne
#12 Tue 17 May 2011 16:40
- Denis.Degez
- Participant actif
- Lieu: Marseille
- Date d'inscription: 19 May 2008
- Messages: 51
Re: [GRASS]un script pour automatiser l'import pas à pas?
Erreur de casse : le "J" de do J=${i/.TIF/ } est en majuscule, pas celui de l'output ...
par ailleurs le remplacement de motifs sont "case sensitive" du coup je suggère :
do j=${i/.tif/ }
Je sers la science et c'est ma joie ...
Hors ligne
#13 Tue 17 May 2011 16:41
Re: [GRASS]un script pour automatiser l'import pas à pas?
pour fusionner tous les tif en un seul, je crois qu'il suffit de faire cela:
Code:
gdalbuildvrt dalleUnique.vrt *.tif gdal_translate -of GTiff dalleUnique.vrt dalleUnique.tif r.in.gdal in=C:/dalleUnique.tif out=dalleUnique
Dernière modification par baobazz (Tue 17 May 2011 16:42)
geodata au cerema et petits billets en géomatique
Hors ligne
#14 Tue 17 May 2011 17:29
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
@Denis tu avais raison, c'est le "case sensitive" de do j=${i/.tif/ } donc maintenant les echos que j'avais rajoutés me renvoient bien les bonnes choses... mais ça ne fonctionne toujours pas ...
j'ai toujours cette erreur : ERROR: Name for output raster map not specified
Voilà donc le code actuel
Code:
#!/bin/sh # Author: Etienne DEALY, 17.mai.2011; copyright: GPL 3 # Purpose: Script to automatic impotation in GRASS (rast in a same file) for i in `find /Users/ElCep/Documents/DonnéesCarto/ -type f -name *.tif `; do j=${i/.tif/ } ; # echo "i est "$i; # echo "j est "$j; r.in.gdal -o --overwrite input=/Users/ElCep/Documents/DonnéesCarto/$i output=$j; done
l'echo $j renvoie /Users/ElCep/Documents/DonnéesCarto/trutruc et je voudrais bien que ce script renomme 1.2.3.4... les différentes tuiles....
Hors ligne
#15 Tue 17 May 2011 17:45
- Denis.Degez
- Participant actif
- Lieu: Marseille
- Date d'inscription: 19 May 2008
- Messages: 51
Re: [GRASS]un script pour automatiser l'import pas à pas?
Il manque en fin de commande "find" le
-printf "%f\n"
Celui ci permet d'isoler le nom du fichier du chemin complet , sans ça, j est égal à :
/Users/ElCep/Documents/DonnéesCarto/trutruc
ce qui ne passe pas en nom de fichier raster Grass
Si tu rajoutes le bouzin tu elimines ce qu'il y a de trop et tu obtiens j égal à :
tructruc
et la ça doit passer ...
donc la commande complête :
#!/bin/sh
# Author: Etienne DEALY, 17.mai.2011; copyright: GPL 3
# Purpose: Script to automatic impotation in GRASS (rast in a same file)
for i in `find /Users/ElCep/Documents/DonnéesCarto/ -type f -name *.t f-printf "%f\n" `;
do j=${i/.tif/ } ;
# echo "i est "$i;
# echo "j est "$j;
r.in.gdal -o --overwrite input=/Users/ElCep/Documents/DonnéesCarto/$i
output=$j;
done
Tiens le coup on va y arriver !
PS : si tu veux renommer tes fichiers de sortie avec in incrément, il te faut redéfinir ta variable j en compteur
j=$i+1 par exemple ...
Je sers la science et c'est ma joie ...
Hors ligne
#16 Tue 17 May 2011 18:01
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
yes on va surement y arrivé :-)
donc nouvelle Erreur (j'avais enlever printf "%f\n" a cause d'une Erreur) mais bon voilà :-)
Code:
#!/bin/sh # Author: Etienne DEALY, 17.mai.2011; copyright: GPL 3 # Purpose: Script to automatic impotation in GRASS (rast in a same file) for i in `find /Users/ElCep/Documents/DonnéesCarto/ -type f -name *.tif -printf "%f\n"`; do j=${i/.tif/ } ; # echo "i est "$i; echo "j est "$j; r.in.gdal -o --overwrite input=/Users/ElCep/Documents/DonnéesCarto/$i output=$j; done
et donc voilà l'Erreur : "find: -printf: unknown option"
Hors ligne
#17 Tue 17 May 2011 23:22
- Denis.Degez
- Participant actif
- Lieu: Marseille
- Date d'inscription: 19 May 2008
- Messages: 51
Re: [GRASS]un script pour automatiser l'import pas à pas?
pouf pouf ...
Chez moi, qui suis monté en linux, ça fonctionne, j'en deduit que le shell qui roule sous mac ne veut pas de l'option -printf, il faut donc trouver autre chose pour lister les fichiers en entrée :
for i in `ls -1 *.tif /path/` ; do j=${i/.tif/} ; r.in.gdal -o input=/path/$i output=$j --overwrite ;done
la commande "ls" liste les fichiers d'un répertoire, le tag -1 lui demande de lister sous forme d'une simple colonne, ce qui évite une sortie "trop riche en info".
En espérant que ça passe sous mac ...
Je sers la science et c'est ma joie ...
Hors ligne
#18 Wed 18 May 2011 18:48
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
Bonjour Denis,
je suis désolé de t'avoir laissé en plan hiers... le hotspot wifi sur lequel j'étais ma jetée. Donc, j'ai lancer ce que la ligne que tu me proposais... J'aimerai dire que ça fonctionne, et e fait ça fonctionne un peut. Pour chaque dalle qui est importée, il y a un flot d'erreurs (en plus de celles qui me disent que je suis en dehors de la région).
Au final, j'ai bien toutes mes dalles (ex : ortho1.red ortho1.blue, ortho1.green), et quelques autres ... Pour chaque Dalle j'ai un ortho1.aux1, ortho1.aux2, ortho1.aux3 qui sont des dalles vides
donc maintenant je voudrais supprimer ces aux1 aux 2 aux3 et appliquer r.patch a toutes ces dalles...
Est ce que tu peux me mettre sur la voie de la commande?
Merci
Etienne
-------------EDIT---------------
Je suis rentré au bureau à l'instant et je fais des tests sur Ubuntu, mais le ça ne fonctionne pas ... :S une erreur encore et encore comme dans la chanson le matou revient... erruer : "./import4.sh: 10: Bad substitution"
Code:
#!/bin/sh # Author: Etienne DEALY, 17.mai.2011; copyright: GPL 3 # Purpose: Script to automatic impotation in GRASS (rast in a same file) for i in `find /home/delaye/Documents/Données_Carto/ -type f -name *.tif -printf "%f\n"`; do j=${i/.tif/ } ; # echo "i est "$i; echo "j est "$j; r.in.gdal -o --overwrite input=/home/delaye/Documents/Données_Carto//$i output=$j; done
Dernière modification par jack tippit (Wed 18 May 2011 19:25)
Hors ligne
#19 Thu 19 May 2011 10:35
- Denis.Degez
- Participant actif
- Lieu: Marseille
- Date d'inscription: 19 May 2008
- Messages: 51
Re: [GRASS]un script pour automatiser l'import pas à pas?
Bonjour,
Cette fois ci tu boucles sur des fichiers Grass, c'est une peu plus simple, pour determiner l'input , le mieux c'est d'utiliser g.mlist :
for i in `g.mlist type=rast pattern=*aux*` ; do g.remove rast=$i ; done
en fait , toutes les commandes grass qui ne prennent qu'un seul fichier en input fonctionnent avec ce type de boucle
Pour r.patch, c'est différent, comme l'input supporte une liste de fichier séparées par des virgules, il ne s'agit plus de boucler une commande mais de bricoler pour que l'input soit compatible avec la syntaxe demandée en input ; g.mlist va être utilisé itou :
i=$(g.mlist type=rast pattern=ortho* separator=,) ; r.patch input=$i output=$i
vérifie la syntaxe de r.patch, je fais ça de mémoire, il y a sans doutes des options... cela dit , in fine si c'est une dalle unique que tu cherches à réaliser, la solution de baobazz (au dessus) semble plus simple et plus adaptée).
pour la region n'oublies pas que grass ne travaille que sur la region qui a été paramétrée, ca veux dire que tu dois avoir un réglage de région (cf g.region) qui couvre l'ensemble de ta zone, mais les temps de calcul peuvent être long suivant ce que tu demandes à grass, l'autre solution c'est d'introduire un g.region qui concerne le fichier travaillé voir plus haut itou.*
enfin, je ne suis pas sur que r.patch prennent des couche rouge vert bleu, peut être as tu intérêt a regarder du côté de r.composite (cf ma première réponse) ...
Je suis encore un peu en ligne jusqu'à demain, mais après j'ai une pause à faire d'à peu près 15 jours ...
Je sers la science et c'est ma joie ...
Hors ligne
#20 Thu 19 May 2011 13:47
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
Bonjour Denis,
merci pour ces boucles qui fonctionne à merveille. Je me tourne donc effectivement vers la méthode de Baobazz qui pour le moment a l'aire de fonctionner (j'ai assemblé avec gdal_merge toutes les dalles) mais maintenant ça c'est super long a importer dans GRASS.
Donc en parallèle j'essaye de découper la zone qui m'intéresse avec gdalwrap... mais là aussi c'est long et je ne sais pas ce qui va en sortir.
Je te tiendrais au courant en fin de journée
en tout cas merci pour le suivi
Hors ligne
#21 Thu 19 May 2011 17:10
Re: [GRASS]un script pour automatiser l'import pas à pas?
Bonjour,
Le site http://www.shockfamily.net/cedric/grass/grass.html offre un script qui permet de faire ce que vous voulez en utilisant GRASS et gdalwarp :
r.in.gdalwarp
A batch gdal import tool. Requires gdalwarp. Warps all of the files listed with gdalwarp, imports them into the current location, and patches them together.
Hors ligne
#22 Fri 20 May 2011 13:50
- Denis.Degez
- Participant actif
- Lieu: Marseille
- Date d'inscription: 19 May 2008
- Messages: 51
Re: [GRASS]un script pour automatiser l'import pas à pas?
Hello,
ravi que ça fonctionne, pour la lenteur possible des traitements je te suggère de prêter attention au g.region (emprise mais résolution également ...) en ce qui me concerne j'ai gagné beaucoup de temps, en insérant le paramétrage de la région dans la boucle ...
Je sers la science et c'est ma joie ...
Hors ligne
#23 Sat 21 May 2011 16:13
- jack tippit
- Participant actif
- Lieu: Limoges
- Date d'inscription: 3 Dec 2008
- Messages: 116
- Site web
Re: [GRASS]un script pour automatiser l'import pas à pas?
Encore merci Denis pour ton aide, et merci gene aussi il est intéressant ce site!!!
L'histoire de la région est tout le paradoxe du géomètre ou du géographe comme on veut À partir de quelle résolution de travail on gagne du temps sans perde l'information essentielle...
Pour moi et mes problèmes de viticultures de terrasse et maintenant d'ouvrage hydraulique sur mes terrasses j'ai besoin d'une résolution très fine... 20 cm parce que mes canaux font entre 40 et 60cm donc il me faut au moins deux pixels pour les voir lors du traitement (ou alors je n’ai pas compris le concept).... Du coup je me tape des temps de calcule de fou...
Enfin voilà merci encore !
Hors ligne