¿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

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

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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.