Memilih semua file dalam direktori untuk digabung dalam QGIS Processing?

8

Saya sedang menulis skrip generik yang melibatkan penulisan shapefile ke direktori yang kemudian digabung bersama. Setelah menulis file ke folder Output , saya mencoba untuk mendapatkan saga: algoritma mergeshapeslayers untuk menggabungkan semua file di folder Output . Saya telah menggunakan Pembuat Model dan meskipun ini sangat membantu, saya menemukan bahwa itu digunakan untuk tujuan tertentu sedangkan saya mencoba membuat skrip untuk tujuan umum.

Kode:

##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
Yusuf
sumber
1
Maaf, tapi saya tidak tahu apa yang Anda coba lakukan. Apa itu Z? Apa yang function(Z)dilayani jika tidak mengembalikan apa pun? Apa perbedaan antara glob.glob(Z + './*.shp')dan glob.glob("*.shp")?
gen
Terima kasih @ gen dan permintaan maaf, edit kode sehingga mudah-mudahan terlihat lebih baik. Untuk pemahaman saya yang terbatas, perbedaannya adalah yang glob.glob(path_1 + './*.shp')menentukan di mana file .shp berada; dan glob.glob("*.shp")mengambil nama file file .shp. Harap perbaiki saya jika saya salah.
Joseph
Untuk mencoba menjadi lebih jelas tentang apa yang saya inginkan: Saya dapat menulis shapefile dari folder yang diberikan ke "C: \ Users \ Me \ Desktop \ Output \\". Saya kemudian ingin saga: mergeshapeslayers untuk menggabungkan semua file di folder Output itu. Kode untuk algoritma gabungan tidak benar dan ingin mengetahui solusi apa pun.
Joseph

Jawaban:

5

Anda dapat menyederhanakan script tanpa menggunakan while...dan x, x+1: untuk sederhana daftar Python, itu akan lebih baik untuk menggunakan foratau daftar comprehensions :

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

Beberapa penjelasan:

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

atau lebih baik dengan 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
sumber
Sangat jelas, ringkas dan sangat membantu. Terima kasih banyak! Satu pertanyaan: Bukankah seharusnya baris 3 ##Result=output vector?
Joseph
ya dan terima kasih, dikoreksi, tetapi ini adalah ide Anda (diadaptasi oleh saya)
gen
Adaptasi Anda benar-benar mengajari saya, sangat dihargai :)
Joseph
4

Menemukan jawabannya berkat @gene yang komentarnya membantu saya fokus pada area yang tepat. Hanya harus menggunakan glob untuk saga: fungsi mergeshapeslayers memanggil:

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

Menambahkan ini ke kode di atas yang sekarang menggabungkan semua file di folder.

Yusuf
sumber
bisakah Anda memperbaiki lekukan naskah Anda? Seperti yang diusulkan, itu tidak berhasil.
gen
ok tapi Anda bisa menyederhanakan skrip Anda (lihat di bawah)
gen
1
Kalau-kalau ada yang mengalami masalah yang sama seperti saya. saga: mergeshapeslayers tidak ditemukan, tetapi saga: mergelayers melakukan hal yang sama. Ini pada 2.12.1 (OS X 10.11.3).
cmyk
@ cmyk - Terima kasih sobat, saya tidak menyebutkan dalam posting tapi itu adalah versi lama dari QGIS dan plugin Pemrosesan (saya pikir v2.2 untuk keduanya).
Joseph