Sélection de tous les fichiers du répertoire à fusionner dans QGIS Processing?

8

J'écris un script générique qui implique d'écrire des fichiers de formes dans un répertoire qui sont ensuite fusionnés. Après avoir écrit les fichiers dans le dossier de sortie , j'essaie d'obtenir l' algorithme saga: mergeshapeslayers pour fusionner tous les fichiers du dossier de sortie . J'ai utilisé le Model Builder et bien qu'il soit utile dans une certaine mesure, je trouve qu'il est utilisé à des fins spécifiques alors que j'essaie de créer un script à des fins génériques.

Code:

##Test=name
##Select_folder=folder
##Result=output vector

import os
import glob

path_1 = Select_folder
path = path_1
os.chdir(path)

def function():

    output = glob.glob(path_1 + './*.shp')
    x = 0

    while output[x]:
        for fname in glob.glob("*.shp"):
            outputs_1 = processing.runandload("qgis:fieldcalculator", output[x], 'Number', 1, 10, 0, True, 1 , "C:\Users\Me\Desktop\Output\\"  + fname)
            multiple_0 = glob.glob("*.shp")
            x = x + 1

        if x + 1 > len(output):
            processing.runalg("saga:mergeshapeslayers", output[0], ";".join(multiple_0) , Result)
            break
        else:
            continue

if path_1:
    function()
else:
   pass
Joseph
la source
1
Désolé, mais je ne sais pas ce que vous essayez de faire. Qu'est-ce que c'est Z?. À quoi sert le function(Z)service s'il ne renvoie rien? Quelle est la difference entre glob.glob(Z + './*.shp')et glob.glob("*.shp")?
gène
Merci @gene et excuses, nous avons modifié le code pour qu'il soit meilleur, espérons-le. À ma connaissance limitée, la différence est que glob.glob(path_1 + './*.shp')définit où se trouvent les fichiers .shp; et glob.glob("*.shp")récupère les noms de fichiers des fichiers .shp. Veuillez me corriger si je me trompe.
Joseph
Pour essayer d'être plus clair sur ce que je veux: je peux écrire les fichiers de formes d'un dossier donné dans "C: \ Users \ Me \ Desktop \ Output \\". J'aimerais alors que la saga: mergeshapeslayers fusionne tous les fichiers de ce dossier de sortie. Le code de l'algorithme de fusion est incorrect et souhaite connaître les solutions.
Joseph

Réponses:

5

Vous pouvez simplifier votre script sans utiliser while...et x, x+1: pour Python liste simple, il serait préférable d'utiliser forou liste compréhensions :

##Test=name
##Select_folder=folder
##Result=output vector

import os
import glob
# folder path of Result shapefile
path_res = os.path.dirname(Result)
# go to Select_folder
os.chdir(Select_folder)
# copy the shapefiles (you don't need to load the shapefiles, so use runalg)
for fname in glob.glob("*.shp"):
     outputs_1 = processing.runalg("qgis:fieldcalculator", fname, 'Number', 1, 10, 0, True, 1 , path_res  + "/"+ fname) 

# paths of the shapefiles in the Result folder with list comprehension
output = [path_res + "/"+ shp for shp in glob.glob("*.shp")]
# merge the shapefiles
processing.runalg("saga:mergeshapeslayers", output[0], ";".join(output) , Result)

Quelques explications:

#  folder path of the Result shapefile # = path_res
print  os.path.dirname("/Users/Shared/test.shp")
/Users/Shared

# list comprehension
print [shp for shp in glob.glob("*.shp")]
['shape1.shp', 'shape2.shp',..., 'shapen.shp']
print [path_res + "/"+ shp for shp in glob.glob("*.shp")]
['/Users/Shared/shape1.shp', '/Users/Shared/shape2.shp', ...,'/Users/Shared/shapen.shp']

ou mieux avec os.path.join(universel, Windows, Linux, Mac OS X):

print [os.path.join(path_res, shp) for shp in glob.glob("*.shp")]
print [os.path.join(path_res, shp) for shp in glob.glob("*.shp")][0] # = output[0]
/Users/Shared/shape1.shp
gène
la source
Très clair, concis et incroyablement utile. Merci beaucoup! Une question: la ligne 3 n'est-elle pas censée l'être ##Result=output vector?
Joseph
oui et merci, corrigé, mais c'est votre idée (adaptée par moi)
gène
Votre adaptation m'a définitivement appris, très appréciée :)
Joseph
4

J'ai trouvé la réponse grâce à @gene qui les commentaires m'ont aidé à me concentrer sur le bon domaine. Il suffit de simplement utiliser glob pour la fonction saga: mergeshapeslayers pour appeler:

multiple_0=glob.glob("*.shp")

Ajouté ceci au code ci-dessus qui fusionne maintenant tous les fichiers du dossier.

Joseph
la source
pouvez-vous corriger l'indentation de votre script, s'il vous plaît. Comme proposé, cela ne fonctionne pas.
gène
ok mais vous pouvez simplifier votre script (voir ci-dessous)
gène
1
Juste au cas où quelqu'un rencontrerait le même problème que moi. saga: mergeshapeslayers est introuvable, mais saga: mergelayers fait la même chose. C'était sur 2.12.1 (OS X 10.11.3).
cmyk
@cmyk - Merci mon pote, je n'ai pas mentionné dans le post mais c'était une ancienne version de QGIS et du plugin Processing (je pense que v2.2 pour les deux).
Joseph