Alle Dateien im Verzeichnis zum Zusammenführen in QGIS Processing auswählen?

8

Ich schreibe ein generisches Skript, bei dem Shapefiles in ein Verzeichnis geschrieben werden, die dann zusammengeführt werden. Nachdem ich die Dateien in den Ausgabeordner geschrieben habe, versuche ich, den Algorithmus saga: mergeshapeslayers zu erhalten, um alle Dateien im Ausgabeordner zusammenzuführen . Ich habe den Model Builder verwendet und obwohl er bis zu einem gewissen Grad hilfreich ist, stelle ich fest, dass er für bestimmte Zwecke verwendet wird, während ich versuche, ein Skript für allgemeine Zwecke zu erstellen.

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
quelle
1
Entschuldigung, aber ich weiß nicht, was Sie versuchen zu tun. Was ist Z? Was macht der function(Z)Aufschlag, wenn er nichts zurückgibt? Was ist der Unterschied zwischen glob.glob(Z + './*.shp')und glob.glob("*.shp")?
Gen
Vielen Dank an @gene und Entschuldigung, den Code so bearbeitet, dass er hoffentlich besser aussieht. Nach meinem begrenzten Verständnis besteht der Unterschied darin, dass glob.glob(path_1 + './*.shp')definiert wird, wo sich die .shp-Dateien befinden. und glob.glob("*.shp")ruft die Dateinamen der .shp-Dateien ab. Bitte korrigieren Sie mich, wenn ich mich irre.
Joseph
Um klarer zu machen, was ich möchte: Ich kann die Shapefiles aus einem bestimmten Ordner in "C: \ Users \ Me \ Desktop \ Output \\" schreiben. Ich möchte dann, dass die Saga: mergeshapeslayers alle Dateien in diesem Ausgabeordner zusammenführt. Der Code für den Zusammenführungsalgorithmus ist falsch und möchte Lösungen kennen.
Joseph

Antworten:

5

Sie können Ihr Skript ohne vereinfachen while...und x, x+1: für einfache Python - Liste, wäre es am besten zu nutzen foroder Comprehensions Liste :

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

Einige Erklärungen:

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

oder besser mit 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
Gen
quelle
Sehr klar, prägnant und unglaublich hilfreich. Vielen Dank! Eine Frage: Soll Zeile 3 nicht sein ##Result=output vector?
Joseph
Ja und danke, korrigiert, aber es ist Ihre Idee (von mir angepasst)
Gen
Ihre Anpassung hat mich definitiv gelehrt, sehr geschätzt :)
Joseph
4

Ich habe die Antwort dank @gene gefunden, dessen Kommentare mir geholfen haben, mich auf den richtigen Bereich zu konzentrieren. Musste einfach glob für die Saga verwenden: mergeshapeslayers Funktion, um aufzurufen:

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

Dies wurde dem obigen Code hinzugefügt, der nun alle Dateien im Ordner zusammenführt.

Joseph
quelle
Können Sie bitte die Einrückung Ihres Skripts korrigieren? Wie vorgeschlagen funktioniert es nicht.
Gen
ok, aber Sie können Ihr Skript vereinfachen (siehe unten)
Gen
1
Nur für den Fall, dass jemand auf das gleiche Problem stößt wie ich. saga: mergeshapeslayers wurde nicht gefunden, aber saga: mergelayers macht das gleiche. Dies war unter 2.12.1 (OS X 10.11.3).
cmyk
@cmyk - Danke Kumpel, ich habe es in dem Beitrag nicht erwähnt, aber es war eine alte Version von QGIS und dem Processing Plugin (ich denke v2.2 für beide).
Joseph