¿Seleccionar todos los archivos en el directorio para fusionarlos en el procesamiento QGIS?

8

Estoy escribiendo un script genérico que implica escribir archivos de forma en un directorio que luego se fusionan. Después de escribir los archivos en la carpeta de Salida , estoy tratando de obtener el algoritmo saga: mergeshapeslayers para fusionar todos los archivos en la carpeta de Salida . He utilizado el Model Builder y, aunque es útil hasta cierto punto, creo que se utiliza para fines específicos, mientras que estoy intentando crear un script con fines 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
José
fuente
1
Lo siento, pero no sé qué estás tratando de hacer. ¿Qué es Z? ¿Qué sirve el function(Z)servicio si no devuelve nada? ¿Cuál es la diferencia entre glob.glob(Z + './*.shp')y glob.glob("*.shp")?
gen
Gracias @gene y disculpas, edité el código para que se vea mejor. A mi entender limitado, la diferencia es que glob.glob(path_1 + './*.shp')define dónde están los archivos .shp; y glob.glob("*.shp")busca los nombres de archivo de los archivos .shp. Por favor corrígeme si me equivoco.
Joseph
Para tratar de ser más claro en cuanto a lo que quiero: puedo escribir los archivos de forma de una carpeta en "C: \ Users \ Me \ Desktop \ Output \\". Entonces me gustaría que la saga: mergeshapeslayers combine todos los archivos en esa carpeta de Salida. El código para el algoritmo de fusión es incorrecto y quisiera conocer cualquier solución.
Joseph

Respuestas:

5

Puede simplificar su secuencia de comandos sin usar while...y x, x+1para una lista simple de Python, sería mejor usar foro enumerar las comprensiones :

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

Algunas explicaciones:

#  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']

o mejor con 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
fuente
Muy claro, conciso e increíblemente útil. ¡Muchas gracias! Una pregunta: ¿no se supone que es la línea 3 ##Result=output vector?
Joseph
sí y gracias, corregido, pero es tu idea (adaptada por mí)
gen
Su adaptación definitivamente me ha enseñado, muy apreciada :)
Joseph
4

Encontré la respuesta gracias a @gene, cuyos comentarios me ayudaron a centrarme en el área correcta. Simplemente tenía que usar glob para la saga: la función mergeshapeslayers para llamar:

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

Se agregó esto al código anterior que ahora combina todos los archivos en la carpeta.

José
fuente
¿Puedes corregir la sangría de tu script, por favor? Según lo propuesto, no funciona.
gen
ok pero puedes simplificar tu script (ver abajo)
gene
1
En caso de que alguien se encuentre con el mismo problema que yo. saga: mergeshapeslayers no se encontró, pero saga: mergelayers hace lo mismo. Esto fue en 2.12.1 (OS X 10.11.3).
cmyk
@ cmyk - Gracias amigo, no lo mencioné en la publicación, pero era una versión anterior de QGIS y el complemento Processing (creo que v2.2 para ambos).
Joseph