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

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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.