Selecionando todos os arquivos no diretório para mesclagem no QGIS Processing?

8

Estou escrevendo um script genérico que envolve a gravação de shapefiles em um diretório que são mesclados. Depois de gravar os arquivos na pasta Saída , estou tentando obter o algoritmo saga: mergeshapeslayers para mesclar todos os arquivos na pasta Saída . Eu usei o Model Builder e, embora seja útil até certo ponto, acho que ele é usado para fins específicos, enquanto estou tentando criar um script para fins genéricos.

Código:

##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
fonte
1
Desculpe, mas não sei o que você está tentando fazer. O que é Z? O que o function(Z)serviço serve se não retornar nada? Qual é a diferença entre glob.glob(Z + './*.shp')e glob.glob("*.shp")?
gene
Obrigado @gene e desculpas, editou o código para que, esperançosamente, pareça melhor. Para meu entendimento limitado, a diferença é que glob.glob(path_1 + './*.shp')define onde estão os arquivos .shp; e glob.glob("*.shp")busca os nomes dos arquivos .shp. Por favor, corrija-me se eu estiver enganado.
Joseph
Para tentar ser mais claro quanto ao que eu quero: Eu posso gravar os shapefiles de uma determinada pasta em "C: \ Users \ Me \ Desktop \ Output \\". Gostaria então da saga: mergeshapeslayers para mesclar todos os arquivos nessa pasta Saída. O código para o algoritmo de mesclagem está incorreto e gostaria de saber quaisquer soluções.
Joseph

Respostas:

5

Você pode simplificar o seu script sem usar while...e x, x+1: a simples lista Python, seria melhor usar forou compreensões lista :

##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)

Algumas explicações:

#  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 melhor com os.path.join(universal, 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
gene
fonte
Muito claro, conciso e incrivelmente útil. Muito obrigado! Uma pergunta: a linha 3 não deveria ser ##Result=output vector?
Joseph
sim e graças, corrigido, mas é a sua idéia (adaptada por mim)
gene
Sua adaptação tem definitivamente me ensinou, muito apreciado :)
Joseph
4

Encontrei a resposta graças aos comentários de @gene, que me ajudaram a focar na área certa. Bastava simplesmente usar glob para a função saga: mergeshapeslayers para chamar:

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

Adicionado isso ao código acima, que agora mescla todos os arquivos na pasta.

Joseph
fonte
você pode corrigir o recuo do seu script, por favor. Conforme proposto, ele não funciona.
gene
ok, mas você pode simplificar seu script (veja abaixo)
gene
1
Apenas no caso de alguém encontrar o mesmo problema que eu. saga: mergeshapeslayers não foi encontrado, mas saga: mergelayers faz a mesma coisa. Isso foi em 2.12.1 (OS X 10.11.3).
Cmyk
@cmyk - Obrigado amigo, eu não mencionei no post, mas era uma versão antiga do QGIS e do plugin Processing (acho que a v2.2 para ambos).
Joseph